【问题标题】:Use output of one stack as environment variable for lambda in other stack with SAM or Cloudformation使用 SAM 或 Cloudformation 将一个堆栈的输出用作其他堆栈中 lambda 的环境变量
【发布时间】:2019-11-29 07:12:12
【问题描述】:

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

场景:

  • Stack1:QueueStack - 包含一个 sqs 队列“myQueue”。堆栈导出 queueUrl 的输出:"${AWS::StackName}-myQueueUrl"
  • Stack2:LambdaStack - 包含将在此队列中放入某些内容的 lambda 函数。 lambda 函数有一个环境。变量 'QUEUE_URL' 应该包含队列的 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

【问题讨论】:

  • 我们在Environment 变量中大量使用Fn::ImportValue - 在lambda 函数、ECS 任务定义等中。所以它是已知的工作。也许还有一些更原始的错误,例如输出名称与您在ImportValue 中指定的名称不匹配?
  • @lexicore ,我更新了我的问题。当我第一次使用解决方法将其设置为string 时,它可以工作。但是在使用普通的ImportValue 语法时它不起作用。我用示例更新了问题。
  • 原来是语法错误。我不应该在前面使用“破折号”。这不是一个数组。

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


【解决方案1】:

它不是一个数组,所以前面不应该有破折号。 当你这样写时它会起作用:

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

【讨论】:

    【解决方案2】:

    另一种想法是使用 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"
    

    然后,在你的LambdaStackQUEUE_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

    【讨论】:

    • QueueStack 中的AWS::SSM::Parameter 的值类似于!Ref MyQueue ?
    • 没错。根据AWS::SSM::Parameter 的文档,默认属性Ref 会为您提供URL。我用代码 sn-p 扩展了我的答案,显示了我的工作。
    猜你喜欢
    • 2020-10-31
    • 2023-02-06
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2017-05-07
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多