CloudFormation リソースの更新保護の確認

重要なスタックリソースが意図せず置換・削除されないよう保護してください。

説明

必要な保護を行うスタックポリシーがないと、許可された CloudFormation のスタック更新で重要なリソースが変更・置換・削除される可能性があります。データベースなど復旧コストが高いリソースには、更新時の保護範囲を明確に定めることが重要です。

スタックポリシーはスタック更新中の操作を制限します。DeleteStack やサービス API による直接変更を防ぐ権限ポリシーではありません。また、タスクにポリシーがなくても、既存スタックに適用されたポリシーがないとは限りません。

想定される影響

  • テンプレートの変更で重要なリソースが置換され、サービス停止やデータ損失につながるおそれがあります。
  • 保護範囲が不適切だと、必要な更新まで阻止されて運用が遅れる場合があります。

対処方法

保護対象の論理リソース ID に合わせてスタックポリシーを設定してください。インライン JSON は stack_policy_body、ポリシーファイルのパスは stack_policy に指定してください。許可する更新を明示し、重要なリソースの変更・置換・削除を制限してください。変更セットを確認し、IAM 権限、スタックの削除保護、バックアップも別途管理してください。

例

実際のテンプレート URL を使い、PrimaryDatabase が保護対象の論理 ID と一致することを確認してください。disable_rollback は作成失敗時の処理を定める別のオプションなので、運用要件に合わせて確認してください。

変更前

yaml
- name: CloudFormation 스택 생성
  amazon.aws.cloudformation:
    stack_name: ansible-cloudformation
    state: present
    region: us-east-1
    disable_rollback: true
    template_url: https://s3.amazonaws.com/my-bucket/cloudformation.template

このタスクにはスタックポリシーがありません。スタックに実際に適用されたポリシーと、重要なリソースの保護要件を確認してください。

変更後

yaml
- name: CloudFormation 스택 생성
  amazon.aws.cloudformation:
    stack_name: ansible-cloudformation
    stack_policy_body: |
      {
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "*"
          },
          {
            "Effect": "Deny",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "LogicalResourceId/PrimaryDatabase"
          }
        ]
      }
    state: present
    region: us-east-1
    disable_rollback: true
    template_url: https://s3.amazonaws.com/my-bucket/cloudformation.template

一般的な更新を許可しつつ、PrimaryDatabase のすべての更新操作を拒否します。明示的な Allow がなく Deny だけの場合は他の更新も既定で拒否されるため、ポリシー全体を確認してください。

参考資料