Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 在现有S3对象上运行S3-put-triggered Lambda函数?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Node.js中有一个Lambda函数来处理添加到我的存储桶的新图像.我想为所有现有对象运行该函数.我怎样才能做到这一点?我认为最简单的方法是“重新放置”每个对象,以触发该功能,但我不知道该怎么做.

要清楚 – 我想在每个现有对象上运行一次.触发器已经在为新对象工作,我只需要在创建lambda函数之前插入的对象上运行它.

解决方法

以下Lambda函数将执行您所需的操作.

它将遍历目标S3存储桶中的每个文件,对于每个文件,它将针对它模拟put操作执行所需的lambda函数.

您可能希望对此功能施加很长的执行时间限制

var TARGET_BUCKET="my-bucket-goes-here";
var TARGET_LAMBDA_Function_name="TestFunct";
var S3_PUT_SIMULATION_PARAMS={
  "Records": [
    {
      "eventVersion": "2.0","eventTime": "1970-01-01T00:00:00.000Z","requestParameters": {
        "sourceIpaddress": "127.0.0.1"
      },"s3": {
        "configurationId": "TESTConfigRule","object": {
          "eTag": "0123456789abcdef0123456789abcdef","sequencer": "0A1B2C3D4E5F678901","key": "HappyFace.jpg","size": 1024
        },"bucket": {
          "arn": "arn:aws:s3:::mybucket","name": "sourcebucket","ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },"s3scheR_149_11845@aVersion": "1.0"
      },"responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH","x-amz-request-id": "EXAMPLE123456789"
      },"awsRegion": "us-east-1","eventName": "ObjectCreated:Put","userIdentity": {
        "principalId": "EXAMPLE"
      },"eventsource": "aws:s3"
    }
  ]
};

var aws = require('aws-sdk');
var s3 = new aws.S3();
var lambda = new aws.Lambda();


exports.handler = (event,context,callBACk) => {
    retrieveS3BucketContents(TARGET_BUCKET,function(s3Objects){
        simulateS3PutOperation(TARGET_BUCKET,s3Objects,simulateS3PutOperation,function(){ 
            console.log("complete."); 
        });
    });
};

function retrieveS3BucketContents(bucket,callBACk){
    s3.listObjectsV2({
        Bucket: TARGET_BUCKET
    },function(err,data) {
        callBACk(data.Contents);
    });
}

function simulateS3PutOperation(bucket,s3ObjectStack,callBACk,callBACkEmpty){
    var params = {
      FunctionName: TARGET_LAMBDA_Function_name,Payload: ""
    };

    if(s3ObjectStack.length > 0){
        var s3Obj = s3ObjectStack.pop();
        var p = S3_PUT_SIMULATION_PARAMS;
        p.Records[0].s3.bucket.name = bucket;
        p.Records[0].s3.object.key = s3Obj.Key;
        params.Payload = JSON.Stringify(p,null,2);
        lambda.invoke(params,data) {
          if (err) console.log(err,err.stack); // an error occurred
          else{
              callBACk(bucket,callBACkEmpty);
          }
        });
    }
    else{
        callBACkEmpty();   
    }
}

以下是lambda查询执行此方法所需的完整策略,它允许R / W到CloudWatch日志和ListObject访问S3.您需要在看到MY-BUCKET-GOES-HERE的地方填写您的水桶详细信息

{
    "Version": "2012-10-17","Statement": [
        {
            "Sid": "Stmt1477382207000","Effect": "Allow","Action": [
                "s3:ListBucket"
            ],"resource": [
                "arn:aws:s3:::MY-BUCKET-GOES-HERE/*"
            ]
        },{
      "Effect": "Allow","Action": [
        "logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"
      ],"resource": "arn:aws:logs:*:*:*"
    }
    ]
}
@H_673_30@

大佬总结

以上是大佬教程为你收集整理的node.js – 在现有S3对象上运行S3-put-triggered Lambda函数?全部内容,希望文章能够帮你解决node.js – 在现有S3对象上运行S3-put-triggered Lambda函数?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。