- 公開日
- 最終更新日
【CDK】autoDeleteObjectsを活用してS3リソースを楽に削除
この記事を共有する

はじめに
パーソル&サーバーワークスの嶋田です。
S3バケットのリソースを削除するためには、
削除対象となるバケットの中身が空であることが求められます。
ちょっとしたDEMOなどでS3リソースを生成して、
削除のたびに都度マネジメントコンソールを開いて中身を空にする作業をするのは面倒くさいですよね。
そこで、今回ご紹介するのが autoDeleteObjects です。
削除対象となるバケットのプロパティで、 autoDeleteObjectsをtrue としてあげることで、
該当のS3を削除する際に中身が存在していれば、
勝手に中身ごとS3バケットのリソースを削除してくれるシロモノです。
今回は、事前に cdk init --language typescript を実行して、
初期セットアップの完了が済んでいる状態でスタートとします。
./bin配下と./lib配下のファイルを書き換えて、 autoDeleteObjects のDEMOをします。
./bin/cdk-blog-demo.ts
import * as cdk from 'aws-cdk-lib'; import { S3BucketDemoStack } from '../lib/S3BucketDemoStack'; const app = new cdk.App(); new S3BucketDemoStack(app, 'S3BucketDemoStack');
./lib/S3BucketDemoStack.ts
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { Bucket } from 'aws-cdk-lib/aws-s3'; import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { Bucket } from 'aws-cdk-lib/aws-s3'; export class S3BucketDemoStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new Bucket(this, 'MustBeDeleted', { removalPolicy: cdk.RemovalPolicy.DESTROY, autoDeleteObjects: true }) new cdk.CfnOutput(this, 'BucketName', { exportName: 'bucketName', value: bucket.bucketName }) } }
cdk deploy --require-approval neverして、リソースをデプロイします。
✨ Synthesis time: 20.7s S3BucketDemoStack: deploying... [1/1] S3BucketDemoStack: creating CloudFormation changeset... S3BucketDemoStack | 0/7 | 3:09:42 PM | REVIEW_IN_PROGRESS | AWS::CloudFormation::Stack | S3BucketDemoStack User Initiated S3BucketDemoStack | 0/7 | 3:09:47 PM | CREATE_IN_PROGRESS | AWS::CloudFormation::Stack | S3BucketDemoStack User Initiated S3BucketDemoStack | 0/7 | 3:09:50 PM | CREATE_IN_PROGRESS | AWS::IAM::Role | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092) S3BucketDemoStack | 0/7 | 3:09:50 PM | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) S3BucketDemoStack | 0/7 | 3:09:50 PM | CREATE_IN_PROGRESS | AWS::S3::Bucket | MustBeDeleted (MustBeDeleted5A8100F6) S3BucketDemoStack | 0/7 | 3:09:51 PM | CREATE_IN_PROGRESS | AWS::S3::Bucket | MustBeDeleted (MustBeDeleted5A8100F6) Resource creation Initiated S3BucketDemoStack | 0/7 | 3:09:51 PM | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) Resource creation Initiated S3BucketDemoStack | 0/7 | 3:09:51 PM | CREATE_IN_PROGRESS | AWS::IAM::Role | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092) Resource creation Initiated S3BucketDemoStack | 1/7 | 3:09:51 PM | CREATE_COMPLETE | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) S3BucketDemoStack | 2/7 | 3:10:06 PM | CREATE_COMPLETE | AWS::S3::Bucket | MustBeDeleted (MustBeDeleted5A8100F6) S3BucketDemoStack | 3/7 | 3:10:09 PM | CREATE_COMPLETE | AWS::IAM::Role | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092) S3BucketDemoStack | 3/7 | 3:10:10 PM | CREATE_IN_PROGRESS | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) S3BucketDemoStack | 3/7 | 3:10:11 PM | CREATE_IN_PROGRESS | AWS::S3::BucketPolicy | MustBeDeleted/Policy (MustBeDeletedPolicy66E448ED) S3BucketDemoStack | 3/7 | 3:10:12 PM | CREATE_IN_PROGRESS | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) Resource creation Initiated S3BucketDemoStack | 3/7 | 3:10:12 PM | CREATE_IN_PROGRESS | AWS::S3::BucketPolicy | MustBeDeleted/Policy (MustBeDeletedPolicy66E448ED) Resource creation Initiated S3BucketDemoStack | 3/7 | 3:10:13 PM | CREATE_IN_PROGRESS | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) Eventual consistency check initiated S3BucketDemoStack | 4/7 | 3:10:13 PM | CREATE_COMPLETE | AWS::S3::BucketPolicy | MustBeDeleted/Policy (MustBeDeletedPolicy66E448ED) S3BucketDemoStack | 5/7 | 3:10:18 PM | CREATE_COMPLETE | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) S3BucketDemoStack | 5/7 | 3:10:19 PM | CREATE_IN_PROGRESS | Custom::S3AutoDeleteObjects | MustBeDeleted/AutoDeleteObjectsCustomResource/Default (MustBeDeletedAutoDeleteObjectsCustomResource0524EAD7) S3BucketDemoStack | 5/7 | 3:10:22 PM | CREATE_IN_PROGRESS | Custom::S3AutoDeleteObjects | MustBeDeleted/AutoDeleteObjectsCustomResource/Default (MustBeDeletedAutoDeleteObjectsCustomResource0524EAD7) Resource creation Initiated S3BucketDemoStack | 6/7 | 3:10:22 PM | CREATE_COMPLETE | Custom::S3AutoDeleteObjects | MustBeDeleted/AutoDeleteObjectsCustomResource/Default (MustBeDeletedAutoDeleteObjectsCustomResource0524EAD7) S3BucketDemoStack | 7/7 | 3:10:23 PM | CREATE_COMPLETE | AWS::CloudFormation::Stack | S3BucketDemoStack ✅ S3BucketDemoStack ✨ Deployment time: 47.35s Outputs: S3BucketDemoStack.BucketName = s3bucketdemostack-mustbedeleted5a8100f6-f0f08aa5hxai Stack ARN: arn:aws:cloudformation:ap-northeast-1:851725490372:stack/S3BucketDemoStack/b47d7b00-f453-11ef-8a6b-0a69ac14165b ✨ Total time: 68.04s
デプロイが完了したので、ローカルにあるファイルをs3 cpを使ってS3バケットに転送してみます。
なお、デプロイ時のログをみてみると Custom::S3AutoDeleteObjects なるものも生成されていますね。
このリソースが、S3バケットの中身をよしなに削除してくれる仕組みの正体です。
デプロイしたS3バケットが空であることを確認
$ aws s3 ls s3://s3bucketdemostack-mustbedeleted5a8100f6-f0f08aa5hxai/
S3に転送するファイルをローカルで作成
$ touch test.txt
作成したファイルをS3に転送
$ aws s3 cp test.txt s3://s3bucketdemostack-mustbedeleted5a8100f6-f0f08aa5hxai/ upload: ./test.txt to s3://s3bucketdemostack-mustbedeleted5a8100f6-f0f08aa5hxai/test.txt
改めてS3バケットの中身を確認
$ aws s3 ls s3://s3bucketdemostack-mustbedeleted5a8100f6-f0f08aa5hxai/ 2025-02-26 15:14:06 0 test.txt
ここまでで、S3バケットをデプロイして、バケットの中身にデータを格納することができました。
これから、cdk destroy --forceコマンドを使ってデプロイしたS3バケットを削除します。
cdk destroy
S3BucketDemoStack | 0 | 3:23:54 PM | DELETE_IN_PROGRESS | AWS::CloudFormation::Stack | S3BucketDemoStack User Initiated S3BucketDemoStack | 0 | 3:23:56 PM | DELETE_IN_PROGRESS | Custom::S3AutoDeleteObjects | MustBeDeleted/AutoDeleteObjectsCustomResource/Default (MustBeDeletedAutoDeleteObjectsCustomResource0524EAD7) S3BucketDemoStack | 0 | 3:23:56 PM | DELETE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) S3BucketDemoStack | 1 | 3:23:58 PM | DELETE_COMPLETE | AWS::CDK::Metadata | CDKMetadata/Default (CDKMetadata) S3BucketDemoStack | 2 | 3:24:00 PM | DELETE_COMPLETE | Custom::S3AutoDeleteObjects | MustBeDeleted/AutoDeleteObjectsCustomResource/Default (MustBeDeletedAutoDeleteObjectsCustomResource0524EAD7) S3BucketDemoStack | 2 | 3:24:00 PM | DELETE_IN_PROGRESS | AWS::S3::BucketPolicy | MustBeDeleted/Policy (MustBeDeletedPolicy66E448ED) S3BucketDemoStack | 2 | 3:24:00 PM | DELETE_IN_PROGRESS | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) S3BucketDemoStack | 3 | 3:24:02 PM | DELETE_COMPLETE | AWS::S3::BucketPolicy | MustBeDeleted/Policy (MustBeDeletedPolicy66E448ED) S3BucketDemoStack | 4 | 3:24:04 PM | DELETE_COMPLETE | AWS::Lambda::Function | Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler (CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F) S3BucketDemoStack | 4 | 3:24:04 PM | DELETE_IN_PROGRESS | AWS::S3::Bucket | MustBeDeleted (MustBeDeleted5A8100F6) S3BucketDemoStack | 4 | 3:24:04 PM | DELETE_IN_PROGRESS | AWS::IAM::Role | Custom::S3AutoDeleteObjectsCustomResourceProvider/Role (CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092) S3BucketDemoStack | 5 | 3:24:06 PM | DELETE_COMPLETE | AWS::S3::Bucket | MustBeDeleted (MustBeDeleted5A8100F6) ✅ S3BucketDemoStack: destroyed
これにてDEMOは終了です。お疲れさまでした。
この記事は私が書きました
嶋田 龍登
記事一覧インフラからアプリのことまでなんでもやりたい、フルスタックを目指すエンジニア
