使用SAM或Cloudformation将另一个堆栈的输出用作lambda的环境变量

时间:2019-11-29 07:12:12

标签: amazon-web-services aws-lambda amazon-cloudformation

我想将一个cloudformation堆栈的导出输出用作另一堆栈中的lambda的环境变量。

场景:

  • Stack1:QueueStack-包含一个sqs队列“ myQueue”。堆栈导出queueUrl的输出:"${AWS::StackName}-myQueueUrl"
  • Stack2:LambdaStack-包含将在此队列中放置内容的lambda函数。 lambda函数具有一个环境。变量“ QUEUE_URL”应包含队列的网址。我想动态使用QueueStack输出的Url。诸如此类的东西:
   Type: AWS::Lambda::Function
   Properties: 
     Environment:
         Variables:
             QUEUE_URL: 
             - Fn::ImportValue:
                 Fn::Sub: "${QueueStackParameter}-myQueueUrl"

但是这不可能,因为环境变量只能是字符串。

如何将一个cloudformation堆栈的导出输出用作另一堆栈中的lambda的环境变量,而又不会cloudformation抱怨env vars必须是字符串?

更新

当这样编写时,它确实起作用:

  QUEUE_URL: !Join
  - ''
  - - "Fn::ImportValue":
        "Fn::Sub": "${QueueStackParameter}-myQueueUrl"

但是,当使用普通的ImportValue语法时,它不起作用:

  QUEUE_URL:
    - Fn::ImportValue:
        Fn::Sub: "${QueueStackParameter}-myQueueUrl"

CloudFormation然后返回以下状态原因: Value of property Variables must be an object with String (or simple type) properties

2 个答案:

答案 0 :(得分:1)

一个替代想法是使用AWS Systems Manager参数存储在两个堆栈之间共享数据。在fib(1,0). fib(2,1). fib(X,Y):-X1 is X-1,fib(X1,Y1),X2 is X-2,fib(X2,Y2),Y is Y1+Y2. 中,添加一个带有可预测路径的QueueStack,例如AWS::SSM::Parameter

/QueueStack/URL

然后,在您的Type: AWS::SSM::Parameter Properties: Type: String Name: /QueueStack/URL Value: Ref: "MyQueue" LambdaStack中,您可以执行以下操作来引用它:

QUEUE_URL

这是此主题https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html

的参考链接

答案 1 :(得分:0)

这不是一个数组,因此前面不应包含破折号。 当您这样编写时,它将起作用:

   Type: AWS::Lambda::Function
   Properties: 
     Environment:
         Variables:
             QUEUE_URL: 
               Fn::ImportValue:
                 Fn::Sub: "${QueueStackParameter}-myQueueUrl"