この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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内のオブジェクトを一括削除するスクリプトを作ってみました。
開発をする上でしばしば遭遇するパターンの処理なので、今後活用することが多そうです。
参考
以上