🫠

AWSマネジメントコンソールではスイッチロールできるのに、awsコマンドが実行できなかった。その解決策

に公開

環境

  • macOS 15.4.1
  • AWS CLI 2.27.6 (Homebrewでインストール)

状況

  • 自分はAWSアカウントAのユーザーXである
  • ユーザーXは以前から、アカウントBのロールYにスイッチロールして操作していた
  • アカウント管理者に、新規にアカウントCのロールZにスイッチロールできるようにしてもらった
  • ~/.aws/configを以下のように編集した
~/.aws/config
[default]
region = ap-northeast-1
output = json

[profile ProfileB]
role_arn = arn:aws:iam::アカウントB:role/ロールY
source_profile = default
region = ap-northeast-1

# これを追記
[profile ProfileC]
role_arn = arn:aws:iam::アカウントC:role/ロールZ
source_profile = default
region = ap-northeast-1
  • マネジメントコンソール上では、ロールZにスイッチロールできた
  • しかし、awsコマンドをアカウントCに向けて実行すると、以下のようなエラーになった
$ aws acm list-certificates --profile ProfileC

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::アカウントA:user/ユーザーX is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::アカウントC:role/ロールZ
  • 従来から使っていたアカウントBには正常に実行できた
$ aws acm list-certificates --profile ProfileB
{
    "CertificateSummaryList": [
    ...

解決策

~/.aws/configに role_session_name を設定すると解決しました。

~/.aws/config
[default]
region = ap-northeast-1
output = json

[profile ProfileB]
role_arn = arn:aws:iam::アカウントB:role/ロールY
source_profile = default
region = ap-northeast-1

[profile ProfileC]
role_arn = arn:aws:iam::アカウントC:role/ロールZ
source_profile = default
region = ap-northeast-1
# これを追記(たぶん適当な値でOK)
role_session_name = ユーザーXのユーザー名
$ aws acm list-certificates --profile ProfileC
{
    "CertificateSummaryList": [
    ...

何故これで解決したのか

アカウントCのロールZのTrust Relationshipsが下記のようになっていました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::アカウントA:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringLike": {
                    "sts:RoleSessionName": "${aws:username}"
                }
            }
        }
    ]
}

"sts:RoleSessionName": "${aws:username}"となっていたから、 role_session_name = ユーザーXのユーザー名 が必要だったんですね。

アカウントBのロールYにはそのような指定が無かったので、role_session_nameが必要なかったということですね。

Discussion