この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていた内容
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