ParameterOverride CodePipeline 中的 Cloudformation ImportValue

Cloudformation ImportValue within ParameterOverride CodePipeline

问题: 我有一个 cloudformation 模板,它应该检索在 CodeCommit 中找到的代码并将其推送到 LambdaCodeCommit 中的代码还包含一个带有一些参数的 SAM 模板。 SAM 模板具有以下设置

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Deploy Python code to Lambda

Parameters:
  ArtifactsBucket:
    Description: The artifact bucket to get the lambda code
    Type: String
  Name:
    Description: Name of the lambda function
    Type: String
  SqsARN:
    Description: AWS SQS Arn to act as a trigger for the lambda function
    Type: String
...

CodePipeline Cloudformation 模板具有以下内容以覆盖 SAM 模板中存在的 3 个参数。

...
 - Name: Deploy
    Actions:
    - Name: Deploy
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: 1
      Configuration:
        ActionMode: CREATE_UPDATE
        Capabilities: 'CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAM'
        ChangeSetName: !Join 
          - '-'
          - - lambda
            - !Ref CodeCommitRepoName
        ParameterOverrides: !Sub |
          {
            "ArtifactsBucket": "${ArtifactsBucket}",
            "Name": "${CodeCommitRepoName}",
            "SqsARN": {"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}
          }
...

ArtifactBucketName 参数很容易被 !Sub 函数更改,但我无法为 SqsARN 提供有效值,这是一个导入的值。

问题是否可以在 ParametersOverride 中包含 ImportValueSub 函数?

尝试我也尝试从

切换
{"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}

!ImportValue": "My-queue:us-east-1:Queue:Arn"

这也没有用。删除 !Sub 函数并使用 !Ref 函数产生与 ImportValue.

相同的 output/problem

要记住的关键是,在 YAML

中使用 JSON

来自documentation

You can't use the short form of !ImportValue when it contains a !Sub. It is valid for AWS CloudFormation, but not valid for YAML:

假设环境作为参数,这是 Sub >> ImportValue >> Sub 的工作示例

        Value: !Sub
            - '{
              "sqsUrl": "${sqsUrl}",
              }'
            - {
                  sqsUrl: { 'Fn::ImportValue': { 'Fn::Sub': 'QueUrl-${Environment}' } }
              }

将其应用于上面的示例可能如下所示(使用 ssm 进行测试)

Parameters:
    Environment:
        Type: String
        Default: DV
    ArtifactsBucket:
        Type: String
        Default: TestBucket
    CodeCommitRepoName:
        Type: String
        Default: Test

Resources:
    SmsLambdaParameter:
        Type: 'AWS::SSM::Parameter'
        Properties:
            Name: !Sub
                - '/${EnvFullUpper}/My-Param/Test'
                - { EnvFullUpper: !Ref Environment }
            Type: 'String'
            Value: !Sub
                - '{
                  "ArtifactsBucket": "${ArtifactsBucket}",
                  "Name": "${CodeCommitRepoName}",
                  "SqsARN": "${SqsArn}"
                  }'
                - { SqsARN: { 'Fn::ImportValue': { 'Fn::Sub': 'QueueArn-${Environment}' } } }

可以使用数组形式 Fn::Sub:

!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value

这将导致:

        ParameterOverrides: !Sub 
            - |
              {
                "ArtifactsBucket": "${ArtifactsBucket}",
                "Name": "${CodeCommitRepoName}",
                "SqsARN": "${SqsARNImport}"
              }
            - SqsARNImport: !ImportValue <name-of-your-queue-export>