【问题标题】:AWS lambda read parameter or outputs from CloudFormationAWS lambda 从 CloudFormation 读取参数或输出
【发布时间】:2016-06-17 07:56:46
【问题描述】:

看起来很简单的任务,但很难找到好的例子。
因此,任务如下: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) 每天会工作多次这一事实,最好在部署时指定此依赖项。

一般来说,它看起来就像创建了简单的任务和云形成脚本:

 "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 = ????

【问题讨论】:

  • 如果您对我的回答感到满意,可以接受吗?谢谢!

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


【解决方案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。

【讨论】:

  • 主要问题是如何在我的代码中加载 cloudformation 输出。有什么好的参考资料(最好是nodejs)?
  • 基本上你的回答帮助我理解了如何去做:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 2019-04-03
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2019-07-19
    • 2016-07-07
    相关资源
    最近更新 更多