AWS SDK for JavaScript v3でS3 Bucket内のオブジェクトを一括削除するスクリプト

2022.07.08

こんにちは、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内のオブジェクトを一括削除するスクリプトを作ってみました。

作ってみた

スクリプト

次のスクリプトを作ってみました。

deleteAllObjects.ts

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内のオブジェクトを一括削除するスクリプトを作ってみました。

開発をする上でしばしば遭遇するパターンの処理なので、今後活用することが多そうです。

参考

以上