【问题标题】:Cloudformation ImportValue within ParameterOverride CodePipelineParameterOverride CodePipeline 中的 Cloudformation ImportValue
【发布时间】:2021-04-19 02:47:18
【问题描述】:

问题: 我有一个 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 相同的输出/问题。

【问题讨论】:

  • 您能否澄清My-queue:us-east-1:Queue:Arn 是您在CFN 中导出的实际名称?

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


【解决方案1】:

要记住的关键是,在 YAML 中使用 JSON

来自documentation

当它包含 !Sub 时,您不能使用 !ImportValue 的缩写形式。 它对 AWS CloudFormation 有效,但无效 对于 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}' } } }

【讨论】:

    【解决方案2】:

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

    !Sub
      - String
      - Var1Name: Var1Value
        Var2Name: Var2Value
    

    这会导致:

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

    【讨论】:

    • 这不起作用,我刚刚测试了它,当我应用 cloudformation 时它会抛出错误消息,说 yaml Template format error: YAML not well-formed. (line xx, column xx) ,我不相信使用可以在 !Sub 中使用 !ImportValue, Here
    • @BaluVyamajala 你好。你必须检查你的缩进。这是正确的模式。
    • @BaluVyamajala 另外我没有在ImportValue 语句中使用 !Sub,因为 OP 也不使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多