看起来非常简单,但很难找到好的例子 因此,任务如下:AWS lambda向AWS-SQS发送一些消息。
AWS lambda代码包含以下行:
var QUEUE_URL = 'https://sqs.us-west-2.amazonaws.com/ID/QUEUE_NAME';",
为了摆脱这段代码,有两种选择:
基于这个事实,周期性触发器(lambda)每天会工作很多次,所以指定这种依赖性duting部署会更好。
一般来说,它看起来像是直接的任务和云形成脚本:
"Resources": {
"LF2HNR1": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Description": "This is lambda trigger",
"Handler": "index.myHandler",
"Runtime": "nodejs",
"Timeout": "300",
并且还指定了依赖于lambda的依赖于SQS:
"DependsOn": [
"SQSQ562D4"
]
},
"SQSQ562D4": {
"Type": "AWS::SQS::Queue",
"Properties": {},
}
Hovewer它没有直接向前任务如何以编程方式获取lambda代码中的SQS url:
exports.handler = function(event, context) {
var params = {
MessageBody: JSON.stringify(event),
var QUEUE_URL = ????
答案 0 :(得分:6)
主要的复杂性是正确使用CloudFormaion API来获取SQS URL。
为了做到这一点,我使用了以下主要由此API驱动的代码:
var queueURL;
cloudFormation.describeStackResource(cloudFormationParams, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
}
else {
var queueURL =data.StackResourceDetail.PhysicalResourceId;
var params = {
MessageBody: JSON.stringify(event),
QueueUrl: queueURL
};
sqs.sendMessage(params, function(err,data){
if(err) {
context.done('error', "ERROR Put SQS"); // ERROR with message
}else{
console.log('data:',data.MessageId);
context.done(null,''); // SUCCESS
}
});
答案 1 :(得分:1)
我建议您检索SQS URL
并将其用作CloudFormation
输出:
"Outputs" : {
"SQSQ562D4" : {
"Description" : "URL of the source queue",
"Value" : { "Ref" : "SQSQ562D4" }
}
}
授予您Lambda
函数cloudformation:DescribeStacks
权限以读取CloudFormation
堆栈的输出,并在运行时在代码中加载此输出以访问SQS URL
。
编辑:不要使用下面答案中的方法。它在函数运行时加载资源配置(队列URI),而不是在Lambda Function部署时注入它。以下方法增加了延迟,可能存在AWS服务速率限制的随机问题,并且可能依赖于AWS CloudFormation API。