Node.js AWS Lambda函数写入S3

Node.js AWS Lambda函数写入S3,node.js,aws-lambda,Node.js,Aws Lambda,我在AWS中有一个节点4.3 Lambda函数。我希望能够将文本文件写入S3,并阅读了许多关于如何与S3集成的教程。然而,它们都是关于如何在之后调用Lambda函数 如何使用node从Lambda在S3中创建文本文件?这可能吗?亚马逊的文档似乎没有涵盖它。是的,这是绝对可能的 var AWS = require('aws-sdk'); function putObjectToS3(bucket, key, data){ var s3 = new AWS.S3(); var

我在AWS中有一个节点4.3 Lambda函数。我希望能够将文本文件写入S3,并阅读了许多关于如何与S3集成的教程。然而,它们都是关于如何在之后调用Lambda函数


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

是的,这是绝对可能的

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
        });
}
通过选择或更新Lambda在其下执行的IAM角色,确保为Lambda函数提供对目标s3存储桶/密钥路径所需的写入权限

要添加的IAM语句:

{
    "Sid": "Stmt1468366974000",
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*"
    ]
}
进一步阅读:

{
    "Sid": "Stmt1468366974000",
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*"
    ]
}
  • 具体的“”详细信息

您可以使用

aws sdk

如果您使用的是IAM用户,则必须提供访问密钥和密钥,并确保您已向IAM用户提供了必要的权限

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: "ACCESS_KEY",secretAccessKey: 'SECRET_KEY'});
var s3bucket = new AWS.S3({params: {Bucket: 'BUCKET_NAME'}});
function uploadFileOnS3(fileName, fileData){
    var params = {
      Key: fileName,
      Body: fileData,
    };
    s3bucket.upload(params, function (err, res) {               
        if(err)
            console.log("Error in uploading file on s3 due to "+ err)
        else    
            console.log("File successfully uploaded.")
    });
}

在这里,我临时硬编码AWS访问和密钥,用于测试目的。有关最佳实践,请参阅适用于serverless.com的。

IAM语句-将S3写入特定存储桶

service: YOURSERVICENAME

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-1
  timeout: 60
  iamRoleStatements:
    - Effect: "Allow"
      Action:
       - s3:PutObject
      Resource: "**BUCKETARN**/*"
    - Effect: "Deny"
      Action:
        - s3:DeleteObject
      Resource: "arn:aws:s3:::**BUCKETARN**/*"

经过长时间的沉默,“任务在X之后超时”失败,没有任何好的错误消息,我回到了开始,回到Amazon默认模板示例,结果成功了

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

以下是我对amazon示例的调整版本:

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);
    }
};

问题中没有任何内容专门要求用于身份验证的访问密钥和机密。以这种方式进行身份验证是一种非常糟糕的做法,因此我不认为推荐它作为一种解决方案是明智的。Lambda函数应配备IAM角色,该角色足以访问Lambda函数执行其功能所需的权限。我知道我只是将密钥和访问密钥硬编码,但此方法仅用于小型个人脚本或测试目的。如果Lambda函数在VPC内执行,则必须创建它的端点。在发现这一点之前,从未调用过s3.putObject的回调。参见这篇关于S3 VPC端点的文章:参见那篇关于从lambda访问Resources的文章:您能指定如何调用此函数吗?我猜
bucket
来自
process.env.bucket\u NAME
,但是
路径和
数据究竟是什么?如果您先在Lambda中写入文件,然后将其放入一个bucket中,该怎么办?作为对成长小说的后期响应,
key
是在bucket名称之后的任何内容。例如,对于
https://mybucket.s3.amazonaws.com/path/to/image.jpg
,关键是
path/to/image.jpg。
嘿,泽维尔,谢谢你的回答。我想知道lambda可以写入s3的文件大小是否有上限?谢谢。我使用的是无服务器框架。这对我有用。