Сбой лямбда-функции AWS в Amazon Connect

Я написал лямбда-функцию AWS в node.js для отправки электронного письма, которое вызывается в потоке контактов Amazon Connect. В ветке с ошибкой воспроизводится сообщение «Ошибка лямбда-функции». Я подтвердил, что роль IAM имеет разрешение на отправку электронной почты с помощью SES, электронные письма отправителя / получателя проверяются в SES, а также лямбда-функция имеет разрешения для Amazon Connect.

Электронное письмо действительно отправляется, но, как ни странно, я все еще слышу сообщение «Ошибка лямбда-функции». Вот код:

"use strict";

const aws = require('aws-sdk');

const sender = "Sender Name <[email protected]>";
const recipient = "[email protected]";
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);
    }
  });
};

Я проверил логи облачных часов и не вижу ошибок:

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" }

Но, учитывая код, это явно не так. В чем дело?


person Mr Wannabe    schedule 06.08.2018    source источник
comment
Где вы видите подсказку "lambda function failed."?   -  person Chetan Ranpariya    schedule 06.08.2018
comment
Это узел, настроенный в потоке контактов в ветви ошибок. Вот скриншот: imgur.com/a/AU5Sjth   -  person Mr Wannabe    schedule 06.08.2018
comment
Возможно, вам понадобится callback(null, {});?   -  person Michael - sqlbot    schedule 06.08.2018
comment
@ Michael-sqlbot, который работал! Пожалуйста, ответьте ниже, чтобы я мог отдать вам должное.   -  person Mr Wannabe    schedule 06.08.2018


Ответы (2)


Ваша лямбда должна возвращать объект 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.

person rocketlobster    schedule 17.08.2018

Есть несколько вещей, которые гарантируют, что ваша рабочая лямбда-функция может использоваться для 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

person Ash    schedule 23.11.2018