amazon-web-services - 为 Lex 机器人运行时的 PostText API 调用授权用户
问题描述
我正在尝试制作一个 AWS Lex 机器人,它将通过 lambda 返回一个意图。我在客户端有语音识别,我想将语音转录成文本,然后通过无服务器将其发送到端点并接收该意图。所有这些都有效,但是在集成无服务器和 aws-sdk 时,我遇到了麻烦。
我得到的错误是
ERROR AccessDeniedException: User: arn:aws:sts::387496244796:assumed-role/voice-dev-us-east-1-lambdaRole/voice-dev-sendTranscript is not authorized to perform: lex:PostText on resource: arn:aws:lex:us-east-1:387496244796:bot:VoiceRecognitionBot:dev
at Object.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:52:27)
at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/rest_json.js:55:8)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:690:12) {
code: 'AccessDeniedException',
time: 2021-06-03T22:39:31.171Z,
requestId: 'db61b680-dc93-40f1-8ac8-485aa857b5a6',
statusCode: 403,
retryable: false,
retryDelay: 22.72147780759437
}
我看了一下这篇文章,但在发送userId
. 我没有使用 facebook messenger 或任何此类服务。这是我们自己的应用程序中的 userId。
这是我的处理程序:
"use strict";
const AWS = require("aws-sdk");
module.exports.sendTranscript = async (event, context, callback) => {
const lexService = new AWS.LexRuntime();
const params = {
botAlias: "dev",
botName: "VoiceRecognitionBot",
inputText: event.transcript,
userId: event.userId,
};
const results = await lexService
.postText(params, (error, data) => {
if (error) console.error(error);
else console.log("DATA RESPONSE => ", data);
})
.promise();
callback(null, results);
};
它发现了一个错误,基本上就是上面的日志。
这是我的示例输入:
{"transcript": "chat with team", "userId": "920bfg83-95af-423c-a058-8f58b23487r6"}
会不会是我的serverless.yml
?除了重命名函数之外,我还没有碰过它。没有 IAM 角色。
解决方案
这个错误是因为 lambda 没有正确的角色来执行 lex post text。参考https://docs.aws.amazon.com/lex/latest/dg/security_iam_id-based-policy-examples.html
将 lex 读取角色分配给 lambda 并重试它应该可以工作。
推荐阅读
- python - 为什么我用 Pygame 制作的游戏会突然卡顿几秒?
- jquery - 如何在 Laravel 的 DataTable 列表页面中更新状态
- javascript - 如何使两个 div 内联反应
- python - 调用函数的用户输入总是以进程 0 结束
- go - 创建可执行文件后获取当前文件名
- batch-file - Robot Framework 测试用例命名约定和使用 bat 文件运行
- reactjs - 数据未在函数内部传递
- string - 如何在mongodb(3.4版本)中将毫秒转换为HH:MM:SS格式
- python-3.x - Python - 在有序列表中的两个元素之间创建一个新的子列表
- javascript - 使用 jquery 单击另一个按钮时禁用按钮