🫠
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