CloudFormationが削除失敗スタックの強制削除(FORCE_DELETE_STACK)をサポートしました
2024年5月23日、AWS CloudFormation のアップデートで、 依存関係などにより削除に失敗した CloudFormationスタックの強制削除が可能になりました。
今回のアップデートでサポートされた強制削除、 AWSコンソール(GUI)と、 AWSCLI(CloudShell)で試す機会がありましたので、紹介させていただきます。
- AWS CloudFormation accelerates dev-test cycle with a new parameter for DeleteStack API
- AWS CloudFormation User Guide: Deleting a stack
事前準備
S3バケットを作成する CloudFormation スタックを作成しました。
cat << EoF > s3.yaml Description: S3 test Resources: S3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub '\${AWS::StackName}-\${AWS::Region}-\${AWS::AccountId}' EoF aws cloudformation deploy --template-file s3.yaml --stack-name s3test
作成されたS3バケットにファイルを転送、 CloudFormationテンプレートの削除が失敗する環境を用意しました。
aws cloudformation describe-stacks --stack-name s3test | jq -c '.Stacks[0]|[.StackName, .StackStatus] ' ["s3test","CREATE_COMPLETE"] S3BUCKET=`aws cloudformation list-stack-resources --stack-name s3test | jq -r .StackResourceSummaries[].PhysicalResourceId` aws s3 cp s3.yaml s3://${S3BUCKET} aws s3 ls s3://${S3BUCKET}
AWSコンソール
CloudFormationテンプレートの「削除」を実施。
The bucket you tried to delete is not empty
で 削除失敗となった状態で、「削除を再試行」を試みました。
「このスタック全体を強制削除」の選択が可能になりました。
DeletionMode FORCE_DELETE_STACK option turned on.
により、S3バケットの削除が省略された状態で、 CloudFormationテンプレートの撤去が完了しました。
CLI
CLIの実行環境はCloudshellを利用しました。
awscli更新
CloudFormation の新機能をサポートする最新バージョンに更新しました。
curl -s "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip -q awscliv2.zip sudo ./aws/install --update aws --version
$ aws --version aws-cli/2.15.57 Python/3.11.8 Linux/5.10.215-203.850.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
STANDARD
DeletionModeの指定を省略(デフォルト)時、 テンプレートの削除に失敗しました。
$ aws cloudformation delete-stack --stack-name s3test $ aws cloudformation describe-stacks --stack-name s3test --query 'Stacks[0].[StackStatus,StackStatusReason]' [ "DELETE_FAILED", "The following resource(s) failed to delete: [S3Bucket]. " ]
FORCE_DELETE_STACK
削除に失敗、ステータスが「DELETE_FAILED」となったスタックの削除時、
--deletion-mode FORCE_DELETE_STACK
を指定する事で、テンプレートの強制削除が完了しました。
$ aws cloudformation delete-stack --stack-name s3test --deletion-mode FORCE_DELETE_STACK $ aws cloudformation describe-stacks --stack-name s3test An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id s3test does not exist
削除に失敗したスタックのみが、強制削除「FORCE_DELETE_STACK」の処理対象です。
削除操作を実施していない、正常ステータスのスタックを対象に「FORCE_DELETE_STACK」 を指定した削除を試みると、バリデーションエラーが発生します。
$ aws cloudformation delete-stack --stack-name s3test --deletion-mode FORCE_DELETE_STACK An error occurred (ValidationError) when calling the DeleteStack operation: Invalid operation on stack [arn:aws:cloudformation:ap-northeast-3:000000000000:stack/s3test/000000000000-19db-11ef-8ef0-000000000000]. You can activate DeletionMode FORCE_DELETE_STACK in a delete stack operation only when the stack is in the DELETE_FAILED state.
後片付け
強制削除により、削除をスキップした S3上のオブジェクトとバケットの削除を実施しました。
$ aws s3 rm s3://${S3BUCKET}/s3.yaml delete: s3://s3test-ap-northeast-3-000000000000/s3.yaml $ aws s3 rb s3://${S3BUCKET} remove_bucket: s3test-ap-northeast-3-000000000000
まとめ
削除に失敗した CloudFormationスタック、 従来も残すリソースを明示する事で削除を再試行する事は可能でしたが、今回のアップデートでより簡単にスタックの撤去が可能となりました。
CloudFormationスタックの撤去時、 異なるテンプレートで管理されるリソース間の依存関係や、削除タイミングなどで削除失敗する事がありますが、 スタックの撤去を完了させる手段の一つとして、今回サポートされた強制削除、FORCE_DELETE_STACKオプションをお試しください。
なお、 CloudFormationスタックの強制削除を実施した場合、削除をスキップしたAWSリソースについて確認を実施し、 課金対象となるリソースや、名称などに一意性が求められるリソースが残されていた場合、手動撤去を実施頂くことをお勧めします。