AWS CloudFormation でスタックを削除しようとした際に、次のようなエラーが発生することがあります:
Role arn:aws:iam::795600592301:role/CFn-cicd-CFnRole-yXR5dzw2KIcH is invalid or cannot be assumed
このエラーは CloudFormation が指定された IAM ロールを “assume” (引き受け)ようとした際に発生します。以下、原因と実際の対処方法を解説します。
原因
CloudFormation はスタック作成または削除の際に IAM ロールを “AssumeRole” する必要があります。しかし、以下のような信頼ポリシーだと CloudFormation はこのロールを引き受けません:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::795600592301:root"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
これは「同じアカウントの全IAMユーザー/ロールは使える」という意味ですが、CloudFormationサービスは cloudformation.amazonaws.com
として書かれるので、上記の設定だけでは足りません。
解決方法
方法1. 信頼ポリシーをCloudFormation対応に修正
IAM ロールに次のような信頼ポリシーを設定することで、CloudFormation が引き受けるようになります:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
方法2. CLIでの修正例
上記の信頼ポリシーを AWS CLI を使って適用する方法:
aws iam update-assume-role-policy \
--role-name CFn-cicd-CFnRole-yXR5dzw2KIcH \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
方法3. CloudFormation 以外のサービスも使う場合
このロールを CodePipeline や Lambda も使う場合は、Principal を複数指定して両方に対応させましょう:
"Principal": {
"AWS": "arn:aws:iam::795600592301:root",
"Service": "cloudformation.amazonaws.com"
}
おわりに
この問題は、ロールがあるのに assume できないというミスマッチな情報から原因を探るため、初心者にとってはとても難解な障害です。
同じエラーに迷った方は、IAM ロールの信頼ポリシーを確認し、CloudFormation サービスが Assume できるようになっているかどうかをチェックしてみてください。
なお、この設定を改めたあとは CloudFormation スタックの削除が通常どおりに実行できるはずです。