何が起こった?
Elastic Beanstalk(以下EB)のプラットフォームをLinux 2ベースへアップグレードするためにGreen環境を用意し、ローカルからeb deploy
を行ったところデプロイが反映されないという事象が発生しました。
EC2インスタンスに出力されるログを確認したところ、デプロイ途中でS3へのアクセスが拒否されてデプロイが失敗していることがわかりました。
2021/10/29 15:51:57.334639 [ERROR] failed to populate deployment meta data with error failed to generate App version manifest file with error AccessDenied: Access Denied
status code: 403, request id: XXXXXXXXXX, host id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
もとのAmazon Linux AMIベースのプラットフォーム(Green環境)では問題なくデプロイが行えており、またEB経由でアタッチしているインスタンスプロファイルにもS3へのアクセスを許可している状態のためすぐには原因がわかりませんでした。
原因は?
🚨 ECインスタンスのrootユーザーにAWS認証情報ファイルを設定していたため🚨
上記のようにすぐには原因がわからずクラスメソッドメンバーズ技術サポート経由でAWSサポートに問い合わせたところ、以下の回答が来ました。
インスタンスの root ユーザーに認証情報ファイルが作成されておりますと、デプロイ時にもこの認証情報が使用されます。
自分の環境では以下のように設定ファイル (.ebextensions)を使用して、aws cliを設定するノリでEC2インスタンスに.aws/credentialsに認証情報ファイルを設定していました。
echo "[default]" > ~/.aws/credentials
/opt/elasticbeanstalk/bin/get-config environment -k IAM_ACCESS_KEY_ID | xargs -I ACCESS_KEY
echo "aws_access_key_id = ACCESS_KEY" >> ~/.aws/credentials
/opt/elasticbeanstalk/bin/get-config environment -k IAM_SECRET_ACCESS_KEY | xargs -I SEC_KEY
echo "aws_secret_access_key = SEC_KEY" >> ~/.aws/credentials
実際にこちらのIAM権限ではS3アクセス権限がなかったため、認証情報ファイルをインスタンスから取り除いたところeb deploy
が成功するようになりました!!
まとめ
インスタンスからAWSリソースの操作する場合は
- インスタンスに認証情報ファイルに置かない
- EB経由でアタッチするインスタンスプロファイルを利用する