AWS:从 Lambda 向 SQS 队列发送消息时没有可用消息
AWS: No Messages Available When Sending Message to SQS Queue from Lambda
以下内容对我不起作用的可能原因有哪些?
- 创建一个至少包含
id
字段的 DynamoDB table card_auth_events
。
- 创建调用 lambda 的触发器。这是 lambda:
console.log('Loading publishCardAuthEvent...');
var QUEUE_URL = 'https://sqs.us-west2.amazonaws.com/XXXXXXXXXXXX/CardAuthEvents';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});
var http = require('https');
exports.handler = function(event, context) {
event.Records.forEach(function(record) {
console.log(record.eventID);
console.log(record.eventName);
console.log('DynamoDB Record: %j', record.dynamodb);
sendToQueue(record);
});
context.succeed("Successfully processed " + event.Records.length + " records.");
};
function sendToQueue(message){
//Send SQS message with details of file uploaded to S3.
var params = {
MessageBody: JSON.stringify(event),
QueueUrl: QUEUE_URL
};
sqs.sendMessage(params, function(err,data){
if (err) {
console.log('error:',"Fail Send Message" + err);
context.done('error', "ERROR Put SQS"); // ERROR with message
} else {
console.log('data:',data.MessageId);
context.done(null,''); // SUCCESS
}
});
}
将 Lambda 配置为具有 AmazonSQSFullAccess
、AmazonDynamoDBFullAccess
和 AmazonAppStreamFullAccess
的角色。
在 SQS 中创建队列
插入一条记录到table.
触发器正在调用,但是为什么消息没有放入队列???
队列中没有消息,Cloud Watch 中也没有错误。是不是我遗漏了什么秘密?
问题出在您的访问策略上。如果您使用的是 IAMFullAccess,则您所做的一切都是授予您访问和更改 IAM 策略、组、用户等的 lambda 权限。您需要授予您的 lambda 访问 SQS 的权限。如果您想全面测试 lambda,我建议使用托管策略:AWSLambdaFullAccess
和 AmazonSQSFullAccess
。这将打开 S3、Lambda、DynamoDb、SQS 和 Cloudwatch。
我认为问题在于您正在调用 sendToQueue()
函数,然后调用 context.succeed()
而没有等待生成的 SQS API 调用完成。这是在完成之前终止您的 Lambda 函数。
一旦你解决了这个问题,另一个问题是你在 SQS 回调中调用 context.done()
,但你可能会多次调用 sendToQueue()
。一旦第一个 SQS API 调用 returns,您的 Lambda 函数就会终止。
以下内容对我不起作用的可能原因有哪些?
- 创建一个至少包含
id
字段的 DynamoDB tablecard_auth_events
。 - 创建调用 lambda 的触发器。这是 lambda:
console.log('Loading publishCardAuthEvent...');
var QUEUE_URL = 'https://sqs.us-west2.amazonaws.com/XXXXXXXXXXXX/CardAuthEvents';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});
var http = require('https');
exports.handler = function(event, context) {
event.Records.forEach(function(record) {
console.log(record.eventID);
console.log(record.eventName);
console.log('DynamoDB Record: %j', record.dynamodb);
sendToQueue(record);
});
context.succeed("Successfully processed " + event.Records.length + " records.");
};
function sendToQueue(message){
//Send SQS message with details of file uploaded to S3.
var params = {
MessageBody: JSON.stringify(event),
QueueUrl: QUEUE_URL
};
sqs.sendMessage(params, function(err,data){
if (err) {
console.log('error:',"Fail Send Message" + err);
context.done('error', "ERROR Put SQS"); // ERROR with message
} else {
console.log('data:',data.MessageId);
context.done(null,''); // SUCCESS
}
});
}
将 Lambda 配置为具有
AmazonSQSFullAccess
、AmazonDynamoDBFullAccess
和AmazonAppStreamFullAccess
的角色。在 SQS 中创建队列
插入一条记录到table.
触发器正在调用,但是为什么消息没有放入队列???
队列中没有消息,Cloud Watch 中也没有错误。是不是我遗漏了什么秘密?
问题出在您的访问策略上。如果您使用的是 IAMFullAccess,则您所做的一切都是授予您访问和更改 IAM 策略、组、用户等的 lambda 权限。您需要授予您的 lambda 访问 SQS 的权限。如果您想全面测试 lambda,我建议使用托管策略:AWSLambdaFullAccess
和 AmazonSQSFullAccess
。这将打开 S3、Lambda、DynamoDb、SQS 和 Cloudwatch。
我认为问题在于您正在调用 sendToQueue()
函数,然后调用 context.succeed()
而没有等待生成的 SQS API 调用完成。这是在完成之前终止您的 Lambda 函数。
一旦你解决了这个问题,另一个问题是你在 SQS 回调中调用 context.done()
,但你可能会多次调用 sendToQueue()
。一旦第一个 SQS API 调用 returns,您的 Lambda 函数就会终止。