AWS lambda从CloudFormation读取参数或输出

时间:2016-03-03 19:42:06

标签: node.js amazon-web-services amazon-sqs aws-lambda amazon-cloudformation

看起来非常简单,但很难找到好的例子 因此,任务如下:AWS lambda向AWS-SQS发送一些消息。

AWS lambda代码包含以下行:

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

为了摆脱这段代码,有两种选择:

  1. 创建将根据区域和队列名称SQS has predictable names;
  2. 查找此队列的查询
  3. 创建Cloud Formaion脚本并在那里指定这些依赖项。
  4. 基于这个事实,周期性触发器(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 = ????
    

2 个答案:

答案 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。