[小ネタ]AWS CloudFormationでアップデートスタックを禁止してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CloudFormationで環境を作った後で、スタックのアップデートを禁止したいことがあります。
スタックが複数あるとアップデートの対象を間違えそうになるからです。
既存のスタックに対してスタックポリシーを適用し、アップデートから保護してみました。

全てのリソースのアップデートを禁止する

全てのリソースのアップデートを禁止するスタックポリシーを作成します。
以下の内容をファイルに保存します。
今回はDenyUpdateStackPolicy.jsonとして保存しました。

{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }  
  ]
}

DenyUpdateStackPolicy.jsonをS3にアップロードします。
AWS CLIを実行し、ポリシーを適用します。

$ aws cloudformation set-stack-policy --stack-name YourStackName --stack-policy-url https://s3-ap-northeast-1.amazonaws.com/YourBucketName/DenyUpdateSt
ackPolicy.json

CloudFormationコンソールを確認します。
スタックポリシーが反映されています。

スタックをアップデートすると、イベント「UPDATE_FAILED」が発生します。

メッセージは以下の通りです。
スタックポリシーによって、アップデートが禁止されたことがわかります。

Action denied by stack policy: Statement [#1] does not allow [Update:] for resource [];

アップデートを許可する

アップデートの保護を解除します。 スタックポリシーは削除できないため、明示的に許可を与えるポリシーを記載します。

{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }  
  ]
}

おわりに

スタックポリシーを使って、既存のCloudFormationスタックのアップデートを禁止してみました。
リソースやConditionを指定すれば、特定のリソースのみ禁止するといったことも出来ます。

参考