3

看起来非常简单,但很难找到它的好例子。
因此,任务如下:AWS lambda将一些消息放入AWS-SQS。AWS lambda从CloudFormation读取参数或输出

AWS的代码拉姆达包含了这样一行:

var QUEUE_URL = 'https://sqs.us-west-2.amazonaws.com/ID/QUEUE_NAME';", 

为了摆脱这种代码有可能的两种选择:

  1. 创建查询,将查找基于区域这个队列队列名称SQS has predictable names;
  2. 创建Cloud Formaion脚本并在其中指定这些依赖关系。

基于这个事实,周期性触发器(lambda)每天将工作很多次,所以最好指定这个依赖关系duting部署。

一般来说,它看起来像直线前进的任务,云的形成脚本创建:

"Resources": { 
"LF2HNR1": { 
    "Type": "AWS::Lambda::Function", 
    "Properties": { 
    "Description": "This is lambda trigger", 
    "Handler": "index.myHandler", 
    "Runtime": "nodejs", 
    "Timeout": "300", 

而且还依赖指定了拉姆达取决于SQS:

"DependsOn": [ 
    "SQSQ562D4" 
    ] 
}, 
"SQSQ562D4": { 
    "Type": "AWS::SQS::Queue", 
    "Properties": {}, 

    } 

Hovewer它没有挺直前进任务如何以编程方式获得Lambda代码中的SQS网址:

exports.handler = function(event, context) { 
var params = { 
    MessageBody: JSON.stringify(event), 
var QUEUE_URL = ???? 
+0

如果你满意我的回答,可以请你接受吗?谢谢! – kixorz

回答

2

我建议你检索SQS URL并把它作为CloudFormation输出:

"Outputs" : { 
    "SQSQ562D4" : { 
     "Description" : "URL of the source queue", 
     "Value" : { "Ref" : "SQSQ562D4" } 
    } 
} 

授予您Lambda功能cloudformation:DescribeStacks权限读取您的CloudFormation堆输出并在运行时在代码加载此输出访问SQS URL

+0

主要问题是如何在我的代码中加载cloudformation输出。任何好的引用(nodejs是可取的)? – user1459144

+0

基本上你的回答帮助我理解如何去做:) – user1459144

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 
    } 
    });