AWS Lambda 函数写入 S3

Posted

技术标签:

【中文标题】AWS Lambda 函数写入 S3【英文标题】:AWS Lambda function write to S3 【发布时间】:2017-03-04 10:51:12 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

是的,绝对有可能!

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

进一步阅读:

AWS javascript SDK 具体的“Put Object”详细信息

【讨论】:

如果您的 lambda 函数在 VPC 内执行,您必须为其创建一个端点。在发现这一点之前,从未调用过 s3.putObject 的回调。请参阅有关 S3 VPC 端点的文章:aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3 请参阅有关从 lambda 访问资源的文章:aws.amazon.com/blogs/aws/… 你能指定如何调用这个函数吗?我猜bucket 来自process.env.BUCKET_NAME,但key 路径和data 到底是什么?如果先在 Lambda 中写入文件,然后将其放入存储桶中呢? 作为对 bildungsroman 的较晚回复,key 是您存储桶名称之后的任何内容。比如https://mybucket.s3.amazonaws.com/path/to/image.jpg,key是path/to/image.jpg. 嘿泽维尔,谢谢你的回答。我想知道lambda可以写入s3的文件大小是否有上限?【参考方案2】:

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

【讨论】:

谢谢。我正在使用无服务器框架。这对我有用。【参考方案3】:

您可以使用 s3 上传文件

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 访问和密钥。有关最佳实践,请参阅documentation。

【讨论】:

问题中没有任何内容专门要求用于身份验证的访问密钥和机密。以这种方式进行身份验证是非常糟糕的做法,因此我不认为推荐它作为一种解决方案是明智的。应为 Lambda 函数预置一个 IAM 角色,该角色足以让 Lambda 函数执行其功能所需的访问权限。 我知道我只是将密钥和访问密钥硬编码,但这种方法仅用于小型个人脚本或用于测试目的。【参考方案4】:

在“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);
    
;

【讨论】:

以上是关于AWS Lambda 函数写入 S3的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用 aws lambda 将文件写入 s3 (python)?

在python中自动测试aws lambda函数

当从 s3 获取对象时,aws lambda 函数被拒绝访问

如何使用 lambda 函数从 AWS s3 获取文本文件的内容?

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

terraform/aws lambda 函数访问在 s3 上被拒绝