Вы должны понимать, как работать с источником лямбда-событий (триггером событий). Здесь источником события является 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();
})
}
Хорошо, позвольте мне возобновить шаги:
- Добавить разрешение для события s3 в вашей лямбда-функции
- Добавьте политику IAM к роли лямбды для действий s3: GetObject и DynamodB: PutItem
- Обновите код функции лямбды для экспорта файла s3 в элемент DynamodB