我在node.js中编写了一个AWS lambda函数来发送电子邮件,该电子邮件在Amazon Connect联系人流中被调用。在错误分支中,它播放提示说“ lambda函数失败”。我已确认IAM角色有权使用SES发送电子邮件,已在SES中验证发件人/收件人电子邮件,并且lambda函数也具有Amazon Connect的权限。
实际上确实发送了电子邮件,但是奇怪的是,我仍然听到提示“ lambda函数失败”。这是代码:
RelativeTime.getRelativeTime()
.then(ticks => console.log(ticks);
我检查了cloudwatch日志,没有看到任何错误:
"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
令人困惑的是它表示lambda函数返回了一些信息:
{
"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"
}
但是给定代码,情况显然并非如此。发生了什么事?
答案 0 :(得分:1)
您的lambda需要返回一个平面文件JSON对象。看来成功后,您的lambda回调为null。
将您的出口更新为此:
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"});
}
});
});
有关lambda /连接要求的更多信息,请点击此处:https://docs.aws.amazon.com/connect/latest/adminguide/connect-lambda-functions.html
注意:
从函数返回的输出必须是键/值对的平面对象,其值仅包含字母数字,破折号和下划线字符。不支持嵌套对象和复杂对象。返回的数据大小必须小于UTF-8数据的32 Kb。
答案 1 :(得分:0)
有几件事可以确保您可以使用的Lambda函数可用于Connect。
如以上答案中所述,返回值应为平面JSON对象。如指南所述:
不支持嵌套对象和复杂对象。
因此,当您直接执行lambda时,它应该看起来像这样:
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