CloudFormationのスタック削除時に発生する「Role is invalid or cannot be assumed」エラーの解決方法

AWS
スポンサーリンク

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 スタックの削除が通常どおりに実行できるはずです。

タイトルとURLをコピーしました