首页 > 解决方案 > 使用 SAM 或 Cloudformation 将一个堆栈的输出用作其他堆栈中 lambda 的环境变量

问题描述

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

设想:

   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

标签: amazon-web-servicesaws-lambdaamazon-cloudformation

解决方案


另一种想法是使用 AWS Systems Manager Parameter Store 在 2 个堆栈之间共享数据。在QueueStack中,添加一个AWS::SSM::Parameter具有可预测路径的命名,例如/QueueStack/URL

Type: AWS::SSM::Parameter
Properties: 
  Type: String
  Name: /QueueStack/URL
  Value:
    Ref: "MyQueue"

然后,在您LambdaStack的 中QUEUE_URL,您可以这样做来引用它:

   Type: AWS::Lambda::Function
   Properties: 
     Environment:
         Variables:
             QUEUE_URL: '{{resolve:ssm:/QueueStack/URL:1}}'

这是有关此主题的参考链接https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html


推荐阅读