Могу ли я экспортировать данные из s3 в DynamoDB, используя лямбду? - PullRequest
0 голосов
/ 04 марта 2020

Я хочу построить лямбда-процесс, который автоматически отправляет данные в Dynamodb при входе s3. Но так как DynamodB не установлен в качестве пункта назначения, как показано на рисунке ниже, что мне делать? (Разрешение - admin.)

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Вы должны понимать, как работать с источником лямбда-событий (триггером событий). Здесь источником события является S3, где, когда есть сохраненный объект, S3 инициирует событие для лямбда-функции. Чтобы получить эту работу, вы должны добавить разрешение на лямбду для события S3. Проверьте это:

Использование лямбда-функции с Amazon S3

Теперь каждый объект, помещенный в S3, будет запускать событие для Lambda. Что-то вроде расскажи лямбду для нового S3-объекта. Вы можете проверить объект события из лямбда-кода, как этот пример кода:

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

Проверьте загрузку файла в корзину s3 и go в cloudwatch, чтобы проверить журнал лямбды.

Далее если вы хотите сохранить содержимое файла в DynamodB, вы добавите политики для лямбда-роли и напишите несколько строк в лямбда-функции, чтобы в примере политики было добавлено разрешение s3: GetObject и DynamodB: PutItem для лямбда-роли:

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

А это пример лямбда-кода:

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. Добавить разрешение для события s3 в вашей лямбда-функции
  2. Добавьте политику IAM к роли лямбды для действий s3: GetObject и DynamodB: PutItem
  3. Обновите код функции лямбды для экспорта файла s3 в элемент DynamodB
0 голосов
/ 04 марта 2020

Лучшим способом было бы установить уведомления в вашем контейнере s3 для запуска нового объекта. Уведомления запустят вашу лямбда-функцию, которая затем обновит DynamodB.

Если у вас уже есть объекты в корзине, вы можете использовать S3 пакетных операций для обработки всех их с помощью вашей лямбда-функции .

...