AWS Lambda函数写入S3

KVI*_*ISH 40 node.js aws-lambda

我在AWS中有一个Node 4.3 Lambda函数.我希望能够将文本文件写入S3,并阅读了许多关于如何与S3集成的教程.但是,所有这些都是关于如何在写入S3后调用Lambda函数,如下所示:

http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

如何使用节点从Lambda在S3中创建文本文件?这可能吗?亚马逊的文档似乎没有涵盖它.

Xav*_*son 68

是的,绝对可能!

var AWS = require('aws-sdk');
function putObjectToS3(bucket, key, data){
    var s3 = new AWS.S3();
        var params = {
            Bucket : bucket,
            Key : key,
            Body : data
        }
        s3.putObject(params, function(err, data) {
          if (err) console.log(err, err.stack); // an error occurred
          else     console.log(data);           // successful response
        });
}
Run Code Online (Sandbox Code Playgroud)

通过选择或更新lambda执行的IAM角色,确保为Lambda函数提供对目标s3存储桶/密钥路径所需的写入权限.

IAM声明添加:

{
    "Sid": "Stmt1468366974000",
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*"
    ]
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

AWS JavaScript SDK:http: //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

具体的"Put Object"详细信息:http: //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

  • 如果您的lambda函数在VPC内执行,则必须为其创建端点。在找到这个之前,从未调用过s3.putObject的回调。请参阅有关S3 VPC端点的本文:https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/请参阅关于从lambda访问资源的文章:https://aws.amazon .com / blogs / aws / new-access-resources-in-a-vpc-fromyour-lambda-functions / (2认同)
  • 作为对 bildungsroman 的迟到回应,“key”是您的存储桶名称之后的任何内容。例如,对于“https://mybucket.s3.amazonaws.com/path/to/image.jpg”,键为“path/to/image.jpg”。 (2认同)

Ela*_*lad 10

经过很长一段时间的“任务在 X 后超时”失败而没有任何好的错误消息后,我回到了开头,回到了亚马逊默认模板示例,这成功了!

> Lambda > 函数 > 创建函数 > 使用蓝图 > 过滤器:s3。

这是我的亚马逊示例的调整版本:

const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });

async function uploadFileOnS3(fileData, fileName){
    const params = {
        Bucket:  "The-bucket-name-you-want-to-save-the-file-to",
        Key: fileName,
        Body: JSON.stringify(fileData),
    };

    try {
        const response = await s3.upload(params).promise();
        console.log('Response: ', response);
        return response;

    } catch (err) {
        console.log(err);
    }
};
Run Code Online (Sandbox Code Playgroud)