概要
IAMユーザーでboto3を使ったら以下の権限エラーになりました。
解決できたので原因と解決方法を紹介します。
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::xxx:user/taro is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxx:role/xxxxx
原因と解決方法
エラーメッセージから、IAMユーザーtaro
にsts:AssumeRole
操作を行う権限がないことがわかります。sts:AssumeRole
操作は、一つのIAMエンティティ(ユーザー、グループ、ロール)が別のIAMロールを「引き受ける」ために必要なもの。
Role
という名前が入っているのでややまぎわらしいですが、これ自体はIAMロールではありません。「アクセスキー」、「シークレットキー」、「セッショントークン」、3つの認証情報を発行してくれるサービスです。
AWS Security Token Service (AWS STS) を使用して、AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。
引用元:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html
sts:AssumeRole
操作の権限を付与するポリシーを追加するには以下のようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxx:role/xxxxx"
}
]
}
これでもまだ同様のエラーが発生する場合は、引き受けようとしているIAMロール(上記ではxxx:role/xxxxx
)の信頼ポリシーが、IAMユーザーtaro
がそのロールを引き受けることを許可していない、という可能性があり。
ロールの信頼ポリシーを更新してあげれば良いということになります。
AWS管理コンソールの「IAM」->「ロールxxx:role/xxxxx
」->「信頼関係」->「編集」から、以下のように信頼ポリシーを付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxx:user/taro"
},
"Action": "sts:AssumeRole"
}
]
}
上記は、あくまで疎通確認的な試験で実施したもの。
恒久的に上記のような例外的な特別な信頼関係とポリシーを付与しておくのはあまり推奨されないと思いますので、あくまで試験的(一時的)に使う時には良いかなと思います。