繁体   English   中英

我可以使用 lambda 将数据从 s3 导出到 dynamoDB 吗?

[英]Can I export data from s3 to dynamoDB using lambda?

我想构建一个 lambda 进程,当 s3 进来时自动将数据发送到 dynamodb。但是由于 dynamodb 没有像下图那样设置为目的地,我该怎么办? (权限是管理员。)

在此处输入图片说明

最好的方法是在 s3 存储桶上设置通知以触​​发新对象。 通知将启动您的 lambda 函数,然后更新 dynamodb。

如果您的存储桶中已经有对象,则可以使用S3 批处理操作通过 lambda 函数处理所有对象。

您应该了解如何使用 lambda 事件源(事件触发器)。 这里的事件源是 S3,一旦有存储的对象,S3 就会向 lambda 函数触发一个事件。 要完成这项工作,您必须为 S3 事件添加对 lambda 的权限。 一探究竟 :

将 Lambda 函数与 Amazon S3 结合使用

现在,放入 S3 的每个对象都会向 Lambda 触发一个事件。 类似于告诉 lambda 新的 S3 对象。 您可以从 lambda 代码中检查事件对象,如以下示例代码:

exports.handler = async (event) => {
   event.Records.forEach((record, i)=>{
      if (record.eventName == 'ObjectCreated:Put')
         console.log(record);
   })
   return;
}

测试文件上传到您的 s3 存储桶并转到 cloudwatch 检查您的 lambda 日志。

接下来,如果要将文件内容存储到 dynamodb,您将为 lambda 角色添加策略并在 lambda 函数上写一些行,为示例策略添加权限 s3:GetObject 和 dynamodb:PutItem 为 lambda 角色:

{
  "Sid": "Stmt1583413548180",
  "Action": [
    "s3:GetObject"
  ],
  "Effect": "Allow",
  "Resource": "your_s3Bucket_ARN"
},
{
  "Sid": "Stmt1583413573162",
  "Action": [
    "dynamodb:PutItem"
  ],
  "Effect": "Allow",
  "Resource": "your_dynamodbTable_ARN"
}

这是 lambda 代码的示例:

let s3 = new AWS.S3();
let dynamoDB = new AWS.DynamoDB.DocumentClient();
let TextDecoder = require("util").TextDecoder;
exports.handler = async (event) => {
   let records = [];
   event.Records.forEach((record, i)=>{
      if (record.eventName == 'ObjectCreated:Put')
         records.push(fileContent());

      if (i == event.Records.length-1)
         if (records.length > 0)
            return Promise.all(records).then(()=>{
               console.log("All events completed")
               return "All events completed";
            }).catch((e)=>{
               console.log("The tasks error: ",e)
               throw "The tasks error";
            })
         else
            return "All events completed";
   })
}

/* Get the file content and put new dynamodb item */
function fileContent(obj) {
   let params = {
     Bucket: obj.bucket.name,
     Key: obj.object.key
   }
   return s3.getObject(params).promise().then((content)=>{
     console.log("GetObject succeeded");
     content = new TextDecoder("utf-8").decode(content.Body);
     let Item = {
        Key: obj.object.key,
        dataContent: content
     }
     return dynamoDB.put({
       TableName: 'table_name',
       Item:Item
     }).promise();
   })
}

好吧,让我继续步骤:

  1. 在 lambda 函数上添加 s3 事件的权限
  2. 将 IAM 策略添加到操作 s3:GetObject 和 dynamodb:PutItem 的 lambda 角色
  3. 更新您的 lambda 函数代码以将 s3 文件导出到 dynamodb 项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM