EC2 インスタンスに適切な権限の IAM ロールを割り当てたにも関わらず、権限エラーが発生したときの対処方法

AWS CLI コマンド実行時に使われる認証情報には優先順位があります。コマンド実行時に、認証情報として EC2 インスタンスにアタッチされている IAM ロールを使用しているかどうかをチェックする方法と、表題の事象を解消する方法をご案内します。
2020.06.30

この記事は公開されてから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

AWS CLI の設定 - AWS Command Line Interface

設定ファイルと認証情報ファイルの設定 - AWS Command Line Interface