EC2 インスタンスに適切な権限の IAM ロールを割り当てたにも関わらず、権限エラーが発生したときの対処方法
困っていた内容
EC2 インスタンスに IAM ロールを割り当てました。 IAM ロールに付与されている IAM ポリシーでは許可設定をしているにも関わらず、AWS CLI コマンドを実行した際に権限エラーが発生します。 考えられる原因を教えてください。
前提となる知識
AWS CLI コマンド実行時に使われる認証情報には以下の優先順位があります。
1. コマンドラインオプション
2. 環境変数
3. CLI 認証情報ファイル
4. CLI 設定ファイル
5. コンテナ認証情報
6. インスタンスプロファイル認証情報
EC2 インスタンスに割り当てる IAM ロールの優先順位は、インスタンスプロファイル認証情報にあたるため、6 番目となります。インスタンスプロファイル認証情報よりも優先順位の高い認証情報が使用されているかどうかを、チェックする必要があります。
どう対応すればいいの?
前提
今回は以下の状態で同様のエラーが発生している状態から、解消する方法を記載します。
インスタンスプロファイル認証情報(test-instance-profile ロール)の IAM ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }
CLI 認証情報ファイルに設定されているアクセスキーを使用する IAM ユーザーの IAM ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:*", "Resource": "*" } ] }
確認方法
コマンド実行時に使用される認証情報を、以下のコマンドで確認をします。
$ aws configure list
インスタンスプロファイル認証情報が使われている場合
Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************AKEY iam-role secret_key ****************SKEY iam-role region <not set> None None
CLI 認証情報ファイルが使われている場合
Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************AKEY shared-credentials-file secret_key ****************SKEY shared-credentials-file region ap-northeast-1 config-file ~/.aws/config
上記の結果のように、Type 列に shared-credentials-file が指定されていた場合は、AWS CLI コマンドを実行する際に、CLI 認証情報ファイルが使われています。
インスタンスプロファイル認証情報は、CLI 認証情報ファイルよりも優先順位が低いため、この状態では S3 に関連する操作の権限がなく、コマンドは権限エラーとなります。
$ aws s3 ls An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
解消方法
インスタンスプロファイル認証情報を使う場合は、CLI 認証情報ファイルを削除します。
rm ~/.aws/credentials
その後は、インスタンスプロファイル認証情報を使うため、コマンドの実行が可能となります。
$ aws s3 ls 2020-06-30 00:00:00 test-bucket-iamrole (アカウント内に存在するバケット一覧が表示されます)
参考資料
AWS CLIで使える認証情報とオプションの設定方法まとめ | Developers.IO