使用@aws-sdk在AWS Lambda发送SQS消息时遇MissingParameter错误
问题描述
尝试从AWS Lambda向AWS SQS发送消息时失败,抛出如下错误:
2022-12-26T14:58:31.651Z 282ada00-ea4a-45b6-afe4-e3a7f16e8c5a INFO MissingParameter: The request must contain the parameter Label. at throwDefaultError (/var/task/node_modules/@aws-sdk/smithy-client/dist-cjs/default-error-handler.js:8:22) at deserializeAws_queryAddPermissionCommandError (/var/task/node_modules/@aws-sdk/client-sqs/dist-cjs/protocols/Aws_query.js:292:51) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async /var/task/node_modules/@aws-sdk/middleware-serde/dist-cjs/deserializerMiddleware.js:7:24 at async /var/task/node_modules/@aws-sdk/middleware-signing/dist-cjs/middleware.js:14:20 at async /var/task/node_modules/@aws-sdk/middleware-retry/dist-cjs/retryMiddleware.js:27:46 at async /var/task/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:5:22 at async sendToSQS (/var/task/sendToSqs.js:28:20) at async exports.handler (/var/task/index.js:19:22) { '$fault': 'client', '$metadata': { httpStatusCode: 400, requestId: 'bf137e9a-24bc-52bd-9416-22b99c6b82f5', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, Type: 'Sender', Code: 'MissingParameter', Detail: '' }
用于发送消息的代码如下(主模块传递简单数据作为消息内容):
const { SQSClient, AddPermissionCommand } = require("@aws-sdk/client-sqs"); const sendToSQS=async(data)=>{ const client = new SQSClient({ region: "eu-west-1" }); var params = { DelaySeconds: 0, MessageAttributes: { "Author": { DataType: "String", StringValue: "event params" }, }, MessageGroupId:`${data}`, MessageBody:JSON.stringify(data), QueueUrl:"https://sqs.eu-west-1.amazonaws.com/000011110000/Salesforce-cqd-orders-delayer-retry" }; try{ const command = new AddPermissionCommand(params); let queueRes = await client.send(command); console.info("[LAMBDA/@sqs] retry mechanism has succeeded. Data sent to SQS successfully") console.log(queueRes) const response = { statusCode: 200, body: "Data sent from lambda to sqs successfully.", }; return response }catch(error){ console.error("[LAMBDA/@s] retry mechanism has failed. Data wasn't sent to SQS") console.log(error) const response = { statusCode: 200, body: "Lambda to SQS error", }; return response; } } module.exports={sendToSQS}
问题根源
你用错了SQS的API命令:AddPermissionCommand是用来给SQS队列添加权限的(比如允许其他AWS账户访问队列),这个命令必须要求Label参数,所以才会抛出"MissingParameter: The request must contain the parameter Label"错误。而你实际需要的是发送消息到队列,应该使用SendMessageCommand。
修复方案
修改代码中的命令导入和实例化部分,具体如下:
const { SQSClient, SendMessageCommand } = require("@aws-sdk/client-sqs"); // 替换AddPermissionCommand为SendMessageCommand const sendToSQS=async(data)=>{ const client = new SQSClient({ region: "eu-west-1" }); var params = { DelaySeconds: 0, MessageAttributes: { "Author": { DataType: "String", StringValue: "event params" }, }, MessageGroupId:`${data}`, // 仅FIFO队列需要该参数,标准队列可移除 MessageBody:JSON.stringify(data), QueueUrl:"https://sqs.eu-west-1.amazonaws.com/000011110000/Salesforce-cqd-orders-delayer-retry" }; try{ const command = new SendMessageCommand(params); // 替换AddPermissionCommand为SendMessageCommand let queueRes = await client.send(command); console.info("[LAMBDA/@sqs] retry mechanism has succeeded. Data sent to SQS successfully") console.log(queueRes) const response = { statusCode: 200, body: "Data sent from lambda to sqs successfully.", }; return response }catch(error){ console.error("[LAMBDA/@s] retry mechanism has failed. Data wasn't sent to SQS") console.log(error) const response = { statusCode: 200, body: "Lambda to SQS error", }; return response; } } module.exports={sendToSQS}
额外说明:
MessageGroupId是FIFO队列的必填参数,如果你的队列是标准队列,可以移除这个参数;如果是FIFO队列,保留即可。- 确保Lambda的IAM角色拥有
sqs:SendMessage权限,否则会出现权限错误。
内容的提问来源于stack exchange,提问作者That Coder
相关产品推荐
相关产品推荐

