AWS lambda 函数从 S3 文件夹中删除文件

Posted

技术标签:

【中文标题】AWS lambda 函数从 S3 文件夹中删除文件【英文标题】:AWS lambda function delete files from S3 folder 【发布时间】:2020-12-09 23:06:09 【问题描述】:

我将一些数据从漏斗导入 S3 存储桶。之后,Lambda 函数将数据复制到 Redshift 中的表中,我尝试从存储桶文件夹中删除所有复制的对象,但一直超时。

这是我的代码:

const Promise = require('bluebird');
const Pool = require('pg');
const AWS = require('aws-sdk');

async function emptyS3Directory(bucket, dir) 
    const listParams = 
    Bucket: bucket,
     Prefix: dir
    ;
    var s3 = new AWS.S3();
    s3.listObjectsV2(listParams, function(err, data)  // Here I always getting timeout
    );
.....

编辑.... 这是函数的代码。

async function DeleteAllDataFromDir(bucket, dir) 

const listParams = 
    Bucket: bucket,
    Prefix: dir
;
var s3 = new AWS.S3();

 const listedObjects = await s3.listObjects(listParams).promise();
 console.log("reponse", listedObjects);
    if (listedObjects.Contents.length === 0) return;

    const deleteParams = 
        Bucket: bucket,
        Delete:  Objects: [] 
    ;

    listedObjects.Contents.forEach(( Key ) => 
        deleteParams.Delete.Objects.push( Key );
    );

    await s3.deleteObjects(deleteParams).promise();

    if (listedObjects.IsTruncated) await DeleteAllDataFromDir(bucket, dir);

我第一次将超时设置为 2 分钟,然后我将其更改为 10 分钟,我得到了同样的错误::


    "errorType": "NetworkingError",
    "errorMessage": "connect ETIMEDOUT IP:port",
    "code": "NetworkingError",
    "message": "connect ETIMEDOUT IP:port",
    "errno": "ETIMEDOUT",
    "syscall": "connect",
    "address": "IP",
    "port": port,
    "region": "eu-west-2",
    "hostname": "hostName",
    "retryable": true,
    "time": "2020-12-10T08:36:29.984Z",
    "stack": [
        "Error: connect ETIMEDOUT 52.95.148.74:443",
        "    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)"
    ]

【问题讨论】:

您为 Lambda 配置了什么超时? err 的值是多少? CloudWatch 中的任何内容可以为我们提供更多见解? 不应该是listObjects而不是listObjectsV2吗? @Nonik 其实有这么一个函数/属性:docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/… 另外,由于你的方法是异步的,你可以简单地做 const response = await s3.listObjectsV2(listParams).promise();并确保您的前缀正确 您的 AWS Lambda 函数是否配置为使用 VPC? (提示:最好连接到 VPC。) 【参考方案1】:

根据错误的性质,您的存储桶可能与您的 lambda 函数位于不同的区域。

在构建 S3 客户端时提供region hash 作为选项。

var s3 = new AWS.S3(region: 'bucket-region-hash');

要计算区域哈希,请转到 S3 管理控制台。 然后从边栏中,单击“存储桶”。在结果视图中,您将找到区域哈希。就是下图用金色标记的那个。

【讨论】:

我试过了,我得到了同样的错误。我应该为 s3 或 lambda 设置任何特殊权限吗?

以上是关于AWS lambda 函数从 S3 文件夹中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda无法删除Amazon S3对象

AWS Lambda 无法删除 Amazon S3 对象

使用nodejs中的AWS Lambda函数上传音频文件

如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

AWS Lambda 函数写入 S3

从AWS Lambda python函数将多个JSON文件合并到S3中的单个JSON文件