#amazon-web-services #aws-lambda #amazon-dynamodb-streams
Вопрос:
Когда я пытаюсь запустить функцию lambda из консоли AWS, код работает нормально. Поскольку я хочу запустить определенный код только в том случае, если добавлена новая запись dynamo DB, я хочу запустить функцию lambda из события вставки потока dymanoDB. Я попробовал следующий код, похоже, лямбда не вызывается.
Разрешение в файле.yml без сервера
- Effect: "Allow"
Action:
- "lambda:InvokeFunction"
Resource:
- "*"
Код для потока DynamoDB
exports.main = async (event) => {
const records = event.Records.filter((record) => {
if (record.eventName.toUpperCase() === "INSERT") {
const recordType = record.dynamodb.NewImage.type.S;
if (recordType.toUpperCase() === "TRA") {
// here I capture the value for the arguments. They work fine
inkvokeTraLamda(keyword, key, tag);
}
}
});
};
Функция, в которой вызывается лямбда
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda({ region: "us-west-1" });
exports.inkvokeTraLamda = async function invoke(
keyword,
key,
tag
) {
const playload = {
keyword,
key,
tag,
};
const LambdaPromise = (params) => lambda.invoke(params).promise();
const resp = await LambdaPromise(params);
console.log(resp);
return resp;
};
Я буду очень признателен вам за ваше руководство.
Ответ №1:
Вместо того, чтобы указывать одной лямбда-функции вызывать другую. Настройте соответствующую функцию Lambda для прослушивания потоков DynamoDB. Таким образом, ваш слушатель Lambda добавит это в свою конфигурацию событий.
events:
- stream:
type: dynamodb
batchSize: 1
# INFO: Batch Window size in seconds allows you to wait as long as 300s to build a batch before invoking a function.
# Now, a function is invoked when one of the following conditions is met: the payload size reaches 6MB, the Batch Window reaches its maximum value, or the Batch Size reaches its maximum value.
# With Batch Window, you can increase the average number of records passed to the function with each invocation.
batchWindow: 5
# This gives the option to recursively split the failed batch and retry on a smaller subset of records, eventually isolating the metadata causing the error.
bisectBatchOnFunctionError: true
maximumRetryAttempts: 3
maximumRecordAgeInSeconds: 120
arn:
Fn::GetAtt:
- <TableName>
- <TableStreamArn>
Как только что-то будет вставлено, ваш второй фрагмент кода ответит. Третий фрагмент, по-видимому, не связан с потоками БД.