EC2内のWrodpressでAWS CLIを実行するプラグインが動かなかった時の話

AWS
この記事は約5分で読めます。

こんにちは、@Manabu です。

今回は、WordpressでAWS CLIを実行させる自作プラグインが動かなかった時の話を紹介します。

AWS CLIを実行する機会が少なく、なぜ動作しないのかわからなかったので同じ事象が発生している人のために記事にしておきます。

前提

今回行おうとしていたことは、Wordppressの自作プラグインでCloudFrontのキャッシュを削除するということです。

プラグインで実行すると、以下のAWS CLIを実行してくれる予定です。

aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths "/*"

別のWordpress環境でも使用しているプラグインのため、設定やプラグインファイルの配置も問題ないと思います。

また、以下のようにEC2にはCloudFrontとS3の実行権限を加えたIAMユーザーの設定をしており、こちらの権限を使ってCLIが実行できるものだと考えていました。

aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************4KOX shared-credentials-file    
secret_key     ****************L0ZZ shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config

実際、SSHで接続して、CloudFrontのキャッシュを削除する上記のコマンドを実行した時には成功しました。

aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths "/*"
{
    "Invalidation": {
        "Status": "InProgress", 
        "InvalidationBatch": {
            "Paths": {
                "Items": [
                    "/*"
                ], 
                "Quantity": 1
            }, 
            "CallerReference": "cli-1718423220-714670"
        }, 
        "Id": "I6WP9VJSWVAJ32KNSI14Q8HEDY", 
        "CreateTime": "2024-06-15T03:47:01.220Z"
    }, 
    "Location": "https://cloudfront.amazonaws.com/2020-05-31/distribution/ディストリビューションID/invalidation/キャッシュ削除ID"
}

解決方法

結論から言うと、「EC2に適切なIAMロールを設定する」ことで問題が解消しました。

ただ、IAMロールを設定しなくても対応する方法はあるようなので、簡単に調べた内容について紹介したいと思います。

AWS CLIの認証情報について

「aws configure list」コマンドを使って確認できる情報は、AWS CLIを使用するための認証情報になります。

この設定を行うと、認証しているIAMユーザーにアタッチされている権限のCLIを実行することができるようです。

そのため、SSHで接続した状態でAWS CLIを実行すると、想定通り動作したようです。

今回動作しなかった原因

SSH接続した状態でAWS CLIを実行することができたのに、同じコマンドをプラグインで実行できなかった原因は、実行ユーザーの違いにあるようです。

SSHで接続した時にコマンドを実行していたのは、rootユーザーです。

WordPressからプラグインで実行する場合は、Apacheユーザーを使用しており、ApacheユーザーにはAWS CLI認証情報が適応されていないため、以下のようなエラーが発生しました。

Unable to locate credentials. You can configure credentials by running "aws configure".
fatal error: Unable to locate credentials

解決策

この解決策としては、いくつかあり以下の対応を行うことで問題を解決することができます。

それぞれ紹介しますので、セキュリティ面など考えながら対応するようにお願いします。

EC2にIAMロールをアタッチ

今回の対応方法で行った、EC2に対して適切なIAMロールをアタッチすると言う内容になります。

この対応を行うと、アクセスキーやシークレットアクセスキー、環境変数を設定せずAWS CLIを実行することができます。

wp-config.phpに環境変数を設定

Wordpressのwp-config.phpにアクセスキーとシークレットアクセスキーの情報を以下のように登録します。

そうすることで、プラグインからのAWS CLIの実行も可能になります。

putenv('AWS_ACCESS_KEY_ID=your_access_key_id'); 
putenv('AWS_SECRET_ACCESS_KEY=your_secret_access_key');

AWS CLIではなくSDKを使用する

プラグインの中身をAWS CLIではなくSDKを使ったものにすると言う方法もあります。

こちらの方が色々設定できて詳細な対応が可能になります。

ただプラグイン作成に時間がかかりそうなので、私はCLIを実行させるプラグインにしています。

まとめ

AWS CLIが実行できなかった件について紹介しました。

AWS CLIの認証情報が適切に設定されていても、実行するユーザーが違う場合、当たり前のことですが実行できないので気をつけましょう。

IAMロールをアタッチしておくと、他の設定しなくても良いので便利ですね!

ぜひ参考にしてください。