AWS Lambda函数写入S3

67

我在AWS中有一个Node 4.3 Lambda函数。我想能够将文本文件写入S3并阅读许多关于如何与S3集成的教程。然而,所有这些教程都是关于如何在写入到S3之后调用Lambda函数。

我该如何使用Node在Lambda中创建一个S3中的文本文件?是否可能?亚马逊的文档似乎没有涵盖这个问题。

5个回答

106

是的,绝对有可能!

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角色,以便向目标S3存储桶/键路径授予所需的写入权限。

需要添加的IAM语句:

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

更多阅读:


2
如果您的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-from-your-lambda-functions/ - VincentTellier
1
你能具体说明一下如何调用这个函数吗?我猜bucket是来自于process.env.BUCKET_NAME,但是key路径和data具体是什么呢?如果你先在Lambda中写入文件,然后再将其放入桶中,会怎样呢? - bildungsroman
2
作为对bildungsroman的迟到回应,key是指跟在您的存储桶名称之后的任何内容。例如,对于https://mybucket.s3.amazonaws.com/path/to/image.jpg,键是path/to/image.jpg - Drakinite

9

经历了漫长的沉默,一直出现“任务超时X秒”错误,但并没有什么好的错误信息。因此我回到了开始的地方,使用了亚马逊的默认模板示例,这个方法奏效了!

> Lambda > Functions > 创建函数 > 使用蓝图 > 过滤: 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);
    }
};

4

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**/*"

1
你可以使用
aws-sdk
在s3上上传文件。如果您使用的是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访问和秘密密钥。有关最佳实践,请参阅文档


22
问题中没有明确要求使用访问密钥和秘钥进行身份验证。这种身份验证方式非常不好,因此我不认为建议将其作为解决方案是明智的。应该为Lambda函数配备足够的IAM角色,以满足Lambda函数执行其功能所需的访问权限。 - Xavier Hutchinson
我知道我只是把秘钥和访问密钥硬编码了,但这种方法仅适用于小型个人脚本或测试目的。 - Anish Agarwal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接