

CloudFormationのスタック削除で「Role is invalid or cannot be assumed」が出たら消せない
この記事は、構成と文章の整理に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/AdministratorAccess4. 削除を実行する
ここまでやれば普通に消せるようになる。
$ 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というオプションもあるらしい。今回のロール無効エラーに効くかは実機未確認。