ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【CDK】autoDeleteObjectsを活用してS3リソースを楽に削除

この記事を共有する

はじめに

パーソル&サーバーワークスの嶋田です。  

S3バケットのリソースを削除するためには、
削除対象となるバケットの中身が空であることが求められます。

ちょっとしたDEMOなどでS3リソースを生成して、
削除のたびに都度マネジメントコンソールを開いて中身を空にする作業をするのは面倒くさいですよね。
そこで、今回ご紹介するのが autoDeleteObjects です。

削除対象となるバケットのプロパティで、 autoDeleteObjectstrue としてあげることで、
該当の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は終了です。お疲れさまでした。

この記事は私が書きました

嶋田 龍登

記事一覧

インフラからアプリのことまでなんでもやりたい、フルスタックを目指すエンジニア

嶋田 龍登

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。