新規または既存の AWS CloudFormation のスタックの 1 つを削除したいのですが、そのスタックのリソースの一部を残す必要があります。
簡単な説明
スタックを削除する際に特定のリソースを残すには、CloudFormation テンプレートの DeletionPolicy 属性を使用します。
スタックを削除する前に、残したいリソースごとに [保持]、[スナップショット]、または [削除] のポリシーオプションを指定してください:
- [保持] オプションを指定すると、スタックが削除された場合でもリソースを保持できます。
- [スナップショット] オプションを指定すると、リソースが削除される前にリソースのスナップショットを作成できます。
注: このオプションは、スナップショットをサポートするリソースに対してのみ使用できます。
- [削除] オプションを指定すると、スタックとともにリソースが削除されます。
注: このオプションは、DeletionPolicy を設定していない場合にはデフォルトで実行されます。
解決策
次の手順では、DeletionPolicy に対して [保持] オプションを使用して、CloudFormation のスタックを削除する際にリソースが削除されないようにする方法を示します。
AWS CloudFormation テンプレートで DeletionPolicy 属性を指定する
CloudFormation テンプレートで、保持したいリソースに対する DeletionPolicy として [保持] を選択します。次の JSON および YAML テンプレートの例では、AWS::EC2::SecurityGroup リソースに対して [保持] ポリシーが指定されています。
JSON:
{
"Description": "AWS CloudFormation DeletionPolicy demo",
"Resources": {
"SGroup1": {
"Type": "AWS::EC2::SecurityGroup",
"DeletionPolicy": "Retain",
"Properties": {
"GroupDescription": "EC2 Instance access"
}
},
"SGroup2": {
"Type": "AWS::EC2::SecurityGroup",
"DeletionPolicy": "Retain",
"Properties": {
"GroupDescription": "EC2 Instance access"
}
},
"SGroup1Ingress": {
"Type": "AWS::EC2::SecurityGroupIngress",
"DeletionPolicy": "Retain",
"Properties": {
"GroupName": {
"Ref": "SGroup1"
},
"IpProtocol": "tcp",
"ToPort": "80",
"FromPort": "80",
"CidrIp": "0.0.0.0/0"
}
},
"SGroup2Ingress": {
"Type": "AWS::EC2::SecurityGroupIngress",
"DeletionPolicy": "Retain",
"Properties": {
"GroupName": {
"Ref": "SGroup2"
},
"IpProtocol": "tcp",
"ToPort": "80",
"FromPort": "80",
"CidrIp": "0.0.0.0/0"
}
}
}
}
YAML:
Description: AWS CloudFormation DeletionPolicy demo
Resources:
SGroup1:
Type: 'AWS::EC2::SecurityGroup'
DeletionPolicy: Retain
Properties:
GroupDescription: EC2 Instance access
SGroup2:
Type: 'AWS::EC2::SecurityGroup'
DeletionPolicy: Retain
Properties:
GroupDescription: EC2 Instance access
SGroup1Ingress:
Type: 'AWS::EC2::SecurityGroupIngress'
DeletionPolicy: Retain
Properties:
GroupName: !Ref SGroup1
IpProtocol: tcp
ToPort: '80'
FromPort: '80'
CidrIp: 0.0.0.0/0
SGroup2Ingress:
Type: 'AWS::EC2::SecurityGroupIngress'
DeletionPolicy: Retain
Properties:
GroupName: !Ref SGroup2
IpProtocol: tcp
ToPort: '80'
FromPort: '80'
CidrIp: 0.0.0.0/0
更新した CloudFormation テンプレートをアップロードする
- AWS CloudFormation コンソールを開きます。
- 新規のスタックの場合は、[スタックの作成] を選択します。既存のスタックの場合は、更新したいスタックを選択し、[スタックの更新] を選択します。
- [テンプレートの選択] で [テンプレートを Amazon S3 にアップロード] を選択し、その後、削除ポリシーを含むように変更した CloudFormation テンプレートを選択します。
- [次へ] を選択します。
- スタックを新規作成する場合は、[スタックの名前] にスタック名を入力し、[次へ] を選択します。
- [オプション] ページで、スタックに対して適切なオプションを選択し、[次へ] を選択します。
- [作成] を選択します。
DeletionPolicy 属性をテストする
- AWS CloudFormation のスタックを削除します。
- DeletionPolicy の [保持] オプションを設定したリソースが、スタックの削除が完了した後も残っていることを確認します。各サービスのリソースを確認するには、AWS マネジメントコンソールまたは AWS CLI を使用します。
例えば、CloudFormation スタックを削除した後に次の手順を実行すると、前述のテンプレートの [保持] ポリシーが正常に機能していることを確認できます。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインの [ネットワークとセキュリティ] セクションで、[セキュリティグループ] を選択します。
- [保持] ポリシーがアタッチされているセキュリティグループが残っていることを確認します。
関連情報
AWS CloudFormation コンソールでのスタックの作成
CloudFormation スタックのリソースが削除または更新されないようにするには、どうすれば良いですか?