AWS lambda 从 CloudFormation 读取参数或输出

AWS lambda read parameter or outputs from 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. 创建 Cloud Formaion 脚本并在其中指定这些依赖项。

基于周期性触发器 (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": {},

  }

然而,如何在 lambda 代码中以编程方式获取 SQS url 并不是一件容易的事:

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

我建议您检索 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。

主要的复杂性在于正确使用 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 
    }
  });