CloudFormationのスタック削除で「Role is invalid or cannot be assumed」が出たら消せない

  • AWS
  • CloudFormation
  • IAM

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何が起きたか

CloudFormationでスタックを削除しようとすると、こんなエラーで止まることがある。

Role arn:aws:iam::123456789012:role/example-role is invalid or cannot be assumed

原因はだいたい決まってて、スタックが使ってたサービスロールが手動で消されてるか、信頼ポリシーが壊れてるかのどっちか。ロールが無いと削除できないし、削除できないから直せない、という詰み状態になる。

対処の手順

エラーメッセージに出てるロール名(ARN)をまずメモっておく。

1. IAMコンソールで確認する

同じ名前のロールが残ってないか確認する。残ってたら信頼ポリシーがcloudformation.amazonaws.comを許可してるかだけ見る。無かったら2へ進む。

2. 同じ名前でロールを作り直す

信頼ポリシーはこれでいい。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
$ aws iam create-role \
--role-name example-role \
--assume-role-policy-document file://trust-policy.json \
--path /service/

パス(--path)を付けてた場合は元のロールと同じパスにしないとARNが変わって意味がない。エラーに出てるARNをそのまま見て合わせる。

3. 削除権限のポリシーをアタッチする

信頼ポリシーだけだとassumeできるようになるだけで、スタック内のリソースを消す権限は無い。中身が分からない、もしくは面倒な場合はAdministratorAccessを付けとくのが早い。

$ aws iam attach-role-policy \
--role-name example-role \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess

4. 削除を実行する

ここまでやれば普通に消せるようになる。

$ aws cloudformation delete-stack --stack-name example-stack

消えたらロールは用済みなので削除しとく。放置するとIAMにゴミが溜まる。

$ aws iam detach-role-policy --role-name example-role --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
$ aws iam delete-role --role-name example-role

別解

同じ名前のロールを作り直すのが面倒、もしくは元のロール名やパスがよく分からない場合は、別名の適当なロールを作って--role-arnで指定して消す方法もある。

$ aws cloudformation delete-stack --stack-name example-stack --role-arn arn:aws:iam::123456789012:role/temp-cfn-admin

こっちなら名前を合わせる必要が無い。

依存関係が原因でDELETE_FAILEDになってるケース向けの機能っぽいけど、--deletion-mode FORCE_DELETE_STACKというオプションもあるらしい。今回のロール無効エラーに効くかは実機未確認。