user3335960
user3335960

Reputation: 875

How do I delete an object on AWS S3 using JavaScript?

I want to delete a file from Amazon S3 using JavaScript. I have already uploaded the file using JavaScript. How can I delete it?

Upvotes: 84

Views: 124662

Answers (8)

Kayes
Kayes

Reputation: 447

First, you need to create a new instance of the AWS S3.

Here's how you can do it:

const s3 = new AWS.S3({
  accessKeyId: AWS_ACCESS_KEY_ID,
  secretAccessKey: AWS_SECRET_ACCESS_KEY,
});

Replace AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY with your AWS Access Key Id and AWS Secret Access Key.

Using this S3 instance, delete a object:

export const s3DeleteObject = (filename: string) => {
  return new Promise((resolve, reject) => {
    const params = {
      Key: filename,
      Bucket: AWS_BUCKET_NAME,
    };

    s3.deleteObject(params, (err: any, data: any) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
};

Then call the function where it is needed:

await s3DeleteObject("fileName");

Using @aws-sdk/client-s3 the updated docs is here

Upvotes: 1

Maciej Paprocki
Maciej Paprocki

Reputation: 1379

As of 2023 s3 will be retiring the v2

To solve the issue using v3 use

const client = new S3Client({});

export const main = async () => {
  const command = new DeleteObjectCommand({
    Bucket: "test-bucket",
    Key: "test-key.txt",
  });

  try {
    const response = await client.send(command);
    console.log(response);
  } catch (err) {
    console.error(err);
  }
};

You should try to avoid access key and secret, but if you really have to do it, new format is

new S3Client({
      credentials: {
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY
      },
      region: process.env.S3_REGION
});

Just to add. You shouldn't run this code client side. If you do you risk giving access to a lot more resources than you should.

What you should use instead is pre-signed URLs. You can generate them on backend for specific files and then send them to front end.

Read more:

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_DeleteObject_section.html

Upvotes: 5

MD SHAYON
MD SHAYON

Reputation: 8063

Very straight forward

At first, create an instance of s3 and configure it with credentials

const S3 = require('aws-sdk').S3;

const s3 = new S3({
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    region: process.env.AWS_REGION
});

Afterward, follow the docs


 var params = {
  Bucket: "ExampleBucket", 
  Key: "HappyFace.jpg"
 };
 s3.deleteObject(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
   }
   */
 });

Upvotes: 6

jlalcazar
jlalcazar

Reputation: 1541

You can use the JS method from S3:

var AWS = require('aws-sdk');

AWS.config.loadFromPath('./credentials-ehl.json');

var s3 = new AWS.S3();
var params = {  Bucket: 'your bucket', Key: 'your object' };

s3.deleteObject(params, function(err, data) {
  if (err) console.log(err, err.stack);  // error
  else     console.log();                 // deleted
});

Be aware that S3 never returns the object if it has been deleted. You have to check it before or after with getobject, headobject, waitfor, etc

Upvotes: 144

iamsohel
iamsohel

Reputation: 407

You can follow this GitHub gist link https://gist.github.com/jeonghwan-kim/9597478.

delete-aws-s3.js:

var aws = require('aws-sdk');
var BUCKET = 'node-sdk-sample-7271';
aws.config.loadFromPath(require('path').join(__dirname, './aws-config.json'));
var s3 = new aws.S3();

var params = {
  Bucket: 'node-sdk-sample-7271', 
  Delete: { // required
    Objects: [ // required
      {
        Key: 'foo.jpg' // required
      },
      {
        Key: 'sample-image--10.jpg'
      }
    ],
  },
};

s3.deleteObjects(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

Upvotes: 10

Vitalii Andrusishyn
Vitalii Andrusishyn

Reputation: 4172

You can use construction like this:

var params = {
  Bucket: 'yourBucketName',
  Key: 'fileName'
  /* 
     where value for 'Key' equals 'pathName1/pathName2/.../pathNameN/fileName.ext'
     - full path name to your file without '/' at the beginning
  */
};

s3.deleteObject(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

And don't forget to wrap it to the Promise.

Upvotes: 43

banoth ravinder
banoth ravinder

Reputation: 1364

Before deleting the file you have to check the 1) file whether it is in the bucket because If the file is not available in the bucket and using deleteObject API this doesn't throw any error 2)CORS Configuration of the bucket. By using headObject API gives the file status in the bucket.

AWS.config.update({
        accessKeyId: "*****",
        secretAccessKey: "****",
        region: region,
        version: "****"
    });
const s3 = new AWS.S3();

const params = {
        Bucket: s3BucketName,
        Key: "filename" //if any sub folder-> path/of/the/folder.ext
}
try {
    await s3.headObject(params).promise()
    console.log("File Found in S3")
    try {
        await s3.deleteObject(params).promise()
        console.log("file deleted Successfully")
    }
    catch (err) {
         console.log("ERROR in file Deleting : " + JSON.stringify(err))
    }
} catch (err) {
        console.log("File not Found ERROR : " + err.code)
}

As params are constant, the best way to use it with const. If the file is not found in the s3 it throws the error NotFound : null.

If you want to apply any operations in the bucket, you have to change the permissions of CORS Configuration in the respective bucket in the AWS. For changing permissions Bucket->permission->CORS Configuration and Add this code.

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

for more information about CROS Configuration : https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

Upvotes: 37

Aniket Thakur
Aniket Thakur

Reputation: 69005

You can use deleteObjects API to delete multiple objects at once instead of calling API for each key to delete. Helps save time and network bandwidth.

You can do following-

var deleteParam = {
    Bucket: 'bucket-name',
    Delete: {
        Objects: [
            {Key: 'a.txt'},
            {Key: 'b.txt'},
            {Key: 'c.txt'}
        ]
    }
};    
s3.deleteObjects(deleteParam, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log('delete', data);
});

For reference see - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObjects-property

Upvotes: 28

Related Questions