説明
必要な保護を行うスタックポリシーがないと、許可された CloudFormation のスタック更新で重要なリソースが変更・置換・削除される可能性があります。データベースなど復旧コストが高いリソースには、更新時の保護範囲を明確に定めることが重要です。
スタックポリシーはスタック更新中の操作を制限します。DeleteStack やサービス API による直接変更を防ぐ権限ポリシーではありません。また、タスクにポリシーがなくても、既存スタックに適用されたポリシーがないとは限りません。
想定される影響
- テンプレートの変更で重要なリソースが置換され、サービス停止やデータ損失につながるおそれがあります。
- 保護範囲が不適切だと、必要な更新まで阻止されて運用が遅れる場合があります。
対処方法
保護対象の論理リソース ID に合わせてスタックポリシーを設定してください。インライン JSON は stack_policy_body、ポリシーファイルのパスは stack_policy に指定してください。許可する更新を明示し、重要なリソースの変更・置換・削除を制限してください。変更セットを確認し、IAM 権限、スタックの削除保護、バックアップも別途管理してください。
例
実際のテンプレート URL を使い、PrimaryDatabase が保護対象の論理 ID と一致することを確認してください。disable_rollback は作成失敗時の処理を定める別のオプションなので、運用要件に合わせて確認してください。
変更前
- 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
このタスクにはスタックポリシーがありません。スタックに実際に適用されたポリシーと、重要なリソースの保護要件を確認してください。
変更後
- 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 だけの場合は他の更新も既定で拒否されるため、ポリシー全体を確認してください。