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

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

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

【问题讨论】:

    标签: node.js aws-lambda


    【解决方案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/*"
        ]
    }
    

    进一步阅读:

    【讨论】:

    • 如果您的 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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2018-03-13
      • 2023-03-11
      • 2023-01-24
      相关资源
      最近更新 更多