AWS SDK for JavaScript v3でS3 Bucket内のオブジェクトを一括削除するスクリプト
こんにちは、CX事業本部 IoT事業部の若槻です。
AWSを利用したシステムのテストの実施で、S3 Bucketに溜まったテストデータをテスト後に一括削除したいことがありました。
テストはJestを利用して実施するので削除処理はAWS SDK for JavaScript v3で行いたいところですが、そのオブジェクト削除メソッドにはaws s3 rmコマンドのrecursive
のようなオプションは無いため、処理の作り込みが必要です。
# AWS SDK for JavaScript v3には下記処理に該当するメソッドがない... aws s3 rm s3://mybucket --recursive
そこで今回は、AWS SDK for JavaScript v3でS3 Bucket内のオブジェクトを一括削除するスクリプトを作ってみました。
作ってみた
スクリプト
次のスクリプトを作ってみました。
import { S3Client, DeleteObjectsCommand, ListObjectsV2Command, } from '@aws-sdk/client-s3'; const s3Client = new S3Client({ region: 'ap-northeast-1', }); const BUCKET_NAME = process.env.BUCKET_NAME || ''; const deleteAllObjects = async (bucketName: string) => { //Bucket内のオブジェクトリスト取得 const objects = await s3Client.send( new ListObjectsV2Command({ Bucket: bucketName, }) ); if (objects.Contents) { const keys = objects.Contents.map((d) => ({ Key: d.Key as string, })); //オブジェクト一括削除 await s3Client.send( new DeleteObjectsCommand({ Bucket: bucketName, Delete: { Objects: keys }, }) ); } }; deleteAllObjects(BUCKET_NAME);
- Node.jsおよびTypeScript環境で動作します。
ListObjectsV2Command
でBucket内のオブジェクトリストを一括取得し、作成したキーのリストを入力としてDeleteObjectsCommand
を実行し、一括削除を行っています。
動作確認
オブジェクト削除前のBucketの格納状況です。
$ export BUCKET_NAME=<bucket name> $ aws s3 ls s3://${BUCKET_NAME}/ --recursive 2022-07-02 21:27:32 0 data-2/ 2022-07-02 21:27:50 139 data-2/2022/06/27/data1 2022-07-02 21:27:50 139 data-2/2022/06/28/data2 2022-07-02 21:27:50 86 data-2/2022/06/29/data3 2022-07-02 21:27:50 83 data-2/2022/06/30/data4 2022-07-06 23:25:53 0 data/33a65248-51f6-4226-802b-3ee8dd7595a2/ 2022-07-06 23:27:31 154 data/33a65248-51f6-4226-802b-3ee8dd7595a2/data1 2022-07-06 23:26:09 0 data/b9489404-856a-456d-b595-986c148a3a41/ 2022-07-06 23:27:54 95 data/b9489404-856a-456d-b595-986c148a3a41/data2 2022-07-06 23:27:03 0 data/fac15d7f-e8d4-4372-b1ad-53e7445ec251/ 2022-07-06 23:28:14 92 data/fac15d7f-e8d4-4372-b1ad-53e7445ec251/data3
スクリプトを実行します。
npx ts-node ./deleteAllObjects.ts
するとBucket内のオブジェクトがすべて削除できました!
$ aws s3 ls s3://${BUCKET_NAME}/ --recursive $
別解
別解として、zxを使う方法もあるようです。これを利用してJavaScriptコードの中でaws s3 rm s3://mybucket --recursive
を実行すれば同様のことができそうです。
おわりに
AWS SDK for JavaScript v3でS3 Bucket内のオブジェクトを一括削除するスクリプトを作ってみました。
開発をする上でしばしば遭遇するパターンの処理なので、今後活用することが多そうです。
参考
以上