0

AWS S3 Javascript SDK V2, Bulk delete using deleteObjects() not working

And I am getting this error

Error:-

   0923a739-1498-4c61-89c0-30cbb70c8008  INFO  500: null
    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:710:35)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)
    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
  code: 500,
  region: null,
  time: 2022-10-28T13:29:37.291Z,
  requestId: null,
  extendedRequestId: undefined,
  cfId: undefined,
  statusCode: 500,
  retryable: true
}

Code:

const keys = listObjectsV2Output?.Contents.map((content) => content.Key) as [];
    console.log(`Deleting ${keys?.length} number of keys inside ${bucket}/${Key}. Keys to delete: ${JSON.stringify(keys)}`);

    // Bulk delete upto 1000 keys in one requestBody
    let objectIdentifierList: ObjectIdentifierList = [];
    for (let key of keys) {
      const objectIdentifier: ObjectIdentifier = {
        Key: key,
      };
      objectIdentifierList.push(objectIdentifier);
    }
    const deleteKeys: Delete = {
      Objects: objectIdentifierList,
      Quiet: true,
    };
    const deleteObjectsRequest: DeleteObjectsRequest = {
      Bucket: bucket,
      Delete: deleteKeys,
    };
    console.log(`S3 deleteObjects deleteObjectsRequest : ${JSON.stringify(deleteObjectsRequest)}`);

    const deleteObjectsOutput: DeleteObjectsOutput = await s3Client.deleteObjects(deleteObjectsRequest).promise();
    console.log(`S3 bulk deleteObjects response : ${JSON.stringify(deleteObjectsOutput)}`);
    console.log(`Errors during delete : ${JSON.stringify(deleteObjectsOutput.Errors)}`);
    allKeysDeleted = deleteObjectsOutput.Errors?.length == 0;

Input JSON Example:-

deleteObjectsRequest : 
{
    "Bucket": "mybucket",
    "Delete": {
        "Objects": [
            {
                "Key": "clients/C1/sites/G100/camear/MP4_H264-1660553709-1660554009 - Copy.mp4"
            },
            {
                "Key": "clients/C1/sites/G100/camear/MP4_H264-1660554009-1660554309 - Copy (2).mp4"
            },
            {
                "Key": "clients/C1/sites/G100/camear/"
            },
            {
                "Key": "clients/C1/sites/G100/siteInfo"
            },
            {
                "Key": "clients/C1/sites/G100/"
            }
        ],
        "Quiet": true
    }
}
Jay
  • 9,189
  • 12
  • 56
  • 96
  • Do you have an object with key `"clients/C1/sites/G100/camear/"`? – jarmod Oct 28 '22 at 14:59
  • Thanks camear is just a sub folder...and has contents inside it... – Jay Oct 29 '22 at 07:29
  • 1
    You can't delete S3 objects below `folder1/folder2/` by simply supplying that prefix. You have to explicitly provide every object's key. Also see [here](https://stackoverflow.com/questions/19459893/how-to-create-folder-or-key-on-s3-using-aws-sdk-for-node-js/31728298#31728298) for clarity on 'folders' in S3. – jarmod Oct 29 '22 at 17:16

0 Answers0