Сбой лямбда-функции AWS в Amazon Connect
Я написал лямбда-функцию AWS в node.js для отправки электронной почты, которая вызывается в потоке контактов Amazon Connect. В ветке ошибок он воспроизводит подсказку "Ошибка лямбда-функции". Я подтвердил, что у роли IAM есть разрешение на отправку электронной почты с помощью SES, электронные письма отправителя и получателя проверены в SES, а также у лямбда-функции есть разрешения для Amazon Connect.
Электронная почта действительно отправляется, но, как ни странно, я до сих пор слышу сообщение "Сбой лямбда-функции". Вот код:
"use strict";
const aws = require('aws-sdk');
const sender = "Sender Name <sender@email.com>";
const recipient = "recipient@email.com";
const subject = "ALERT: no agents are logged in";
const body_text = "There are no agents logged in";
const body_html =
`<html>
<head></head>
<body>
<h1>ALERT</h1>
<p>Ther are no agents logged in to take calls in the queue.</p>
</body>
</html>`;
const charset = "UTF-8";
let params = {
Source: sender,
Destination: {
ToAddresses: [
recipient
],
},
Message: {
Subject: {
Data: subject,
Charset: charset
},
Body: {
Text: {
Data: body_text,
Charset: charset
},
Html: {
Data: body_html,
Charset: charset
}
}
},
};
const ses = new aws.SES({apiVersion: '2010-12-01'});
exports.handler = function(event, context, callback) {
ses.sendEmail(params, function(err, data) {
if(err) {
console.log("fail");
callback(err, err.message);
}
else {
console.log("success");
callback(null);
}
});
};
Я проверил логи cloudwatch и не вижу ошибок:
00:17:24
START RequestId: 17f1e239-990e-11e8-96bb-a1980f44db91 Version: $LATEST
00:17:24
2018-08-06T00:17:24.723Z 17f1e239-990e-11e8-96bb-a1980f44db91 success
00:17:24
END RequestId: 17f1e239-990e-11e8-96bb-a1980f44db91
00:17:24
REPORT RequestId: 17f1e239-990e-11e8-96bb-a1980f44db91 Duration: 226.51 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 32 MB
Как мне устранить это?
РЕДАКТИРОВАТЬ:
Я включил журналы потока контактов. В CloudWatch я заметил это:
{
"Parameters": { "FunctionArn": "arn:aws:lambda:us-west-2:769182588423:function:noAgentEmail", "TimeLimit": "8000" },
"Timestamp": "2018-08-06T06:36:31.786Z",
"ContactFlowModuleType": "InvokeExternalResource",
"Results": "The Lambda Function Returned An Error.",
"ExternalResults": { "forceClose": "false" },
"ContactId": "458027b0-d895-439e-bc06-114500dce64a",
"ContactFlowId": "arn:aws:connect:us-west-2:769182588423:instance/1e2ddedd-8335-42fe-89de-1e986fc016ef/contact-flow/2329af39-682c-4dc8-b3a2-5e7fe64de5d2"
}
Что сбивает с толку, так это то, что лямбда-функция возвращает что-то:
"ExternalResults": { "forceClose": "false" }
Но это явно не тот случай, учитывая код. В чем дело?
3 ответа
Есть несколько вещей, которые гарантируют, что ваша рабочая лямбда-функция может быть использована для Connect.
Как упоминалось в ответе выше, возвращаемое значение должно быть плоским объектом JSON. Как говорится в руководстве:
Вложенные и сложные объекты не поддерживаются.
Итак, это должно выглядеть примерно так, когда вы выполняете лямбду напрямую:
Response:
{
"statusPop": "success",
"id": "1",
"name": "me",
}
Имена и значения свойств должны быть
буквенно-цифровые, тире и символы подчеркивания.
О, и вот что меня смутило: Amazon Connect отправляет параметры как часть иерархической структуры, поэтому любые ожидаемые параметры должны указываться как
event['Details']['Parameters']['statusPop'];
вместо
event['statusPop'];
И не забудьте добавить разрешения, используя:
aws lambda add-permission --function-name function:my-lambda-function --statement-id 1 \
--principal connect.amazonaws.com --action lambda:InvokeFunction --source-account 123456789012 \
--source-arn arn:aws:connect:us-east-1:123456789012:instance/def1a4fc-ac9d-11e6-b582-06a0be38cccf
Больше информации и подробностей о том, что я упомянул здесь: https://docs.aws.amazon.com/connect/latest/adminguide/connect-lambda-functions.html
Ваша лямбда должна возвратить плоский JSON-объект. Похоже на успех ваши лямбда-колбэки с нулем.
Обновите ваш экспорт к этому:
exports.handler = function(event, context, callback) {
ses.sendEmail(params, function(err, data) {
if(err) {
console.log("fail");
//callback(err, err.message);
callback(null, {"status":"error"});
}
else {
console.log("success");
callback(null, {"status":"success"});
}
});
});
Более подробную информацию о требованиях к лямбде / подключению можно найти здесь: https://docs.aws.amazon.com/connect/latest/adminguide/connect-lambda-functions.html
Замечания:
Выходные данные, возвращаемые функцией, должны быть плоским объектом пар ключ / значение со значениями, которые включают только буквы, цифры, тире и символы подчеркивания. Вложенные и сложные объекты не поддерживаются. Размер возвращаемых данных должен быть не более 32 Кбайт данных UTF-8.
вы должны вернуть действительный объект JSON, например, как показано ниже.
export const handler = async(event) => {
console.log("event" + JSON.stringify(event));
let amount = event['Details']['Parameters']['amount'];
console.log("amount:" + amount);
let resultMap = {
"amountValid": "valid"
};
console.log("resultMap" + JSON.stringify(resultMap));
return resultMap;
};