AWS Lambda如何从CloudFormation中读取参数或输出

5

看起来非常简单的任务,但是很难找到一个好的例子。
所以,任务如下:AWS Lambda将一些消息放入AWS-SQS。

AWS Lambda的代码包含以下行:

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

为了消除这段代码,有两种可能的选择:
  1. 创建查询来查找基于区域和队列名称的队列 SQS具有可预测的名称;
  2. 创建Cloud Formaion脚本并在其中指定这些依赖项。
由于定期触发器(lambda)会多次运行,因此最好在部署期间指定此依赖关系。
总体而言,它看起来像是一项直截了当的任务,并且已经创建了云形成脚本。
 "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": {},

  }

然而,在Lambda代码中编程获取SQS URL并不是一项直截了当的任务:

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

如果您对我的回答感到满意,能否请您接受它?谢谢! - adamkonrad
2个回答

6

主要的复杂性在于正确使用CloudFormation 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
我建议您检索 SQS URL 并将其用作 CloudFormation 输出:
"Outputs" : {
    "SQSQ562D4" : {
      "Description" : "URL of the source queue",
      "Value" : { "Ref" : "SQSQ562D4" }
    }
}

将您的Lambda函数授予cloudformation:DescribeStacks权限,以读取CloudFormation堆栈的输出,并在运行时将此输出加载到您的代码中,以访问SQS URL
编辑:不要使用下面答案中的方法。它在函数运行时加载资源配置(队列URI),而不是在Lambda函数部署时注入它。下面的方法会增加延迟,可能会出现AWS服务速率限制的随机问题,并且依赖于AWS CloudFormation API。

1
主要问题是如何在我的代码中加载CloudFormation输出。有什么好的参考资料(最好使用Node.js)? - user1459144
基本上,你的回答帮助我理解了如何做到这一点 :) - user1459144

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接