【问题标题】:How to read a value from a json file in AWS Codepipeline?如何从 AWS Codepipeline 中的 json 文件中读取值?
【发布时间】:2020-11-20 03:27:17
【问题描述】:

我的问题: Codepipeline 如何读取 SourceCodeArtifact 中的 json 文件中的字段值?

我有一个 Gthub 存储库,其中包含一个文件 imageManifest.json,如下所示:

{
  "image_id": "docker.pkg.github.com/my-org/my-repo/my-app",
  "image_version": "1.0.1"
}

我希望我的 AWS Codepipeline Source 阶段能够从 imageManifest.json 读取 image_version 的值,并将其作为参数传递给管道后续阶段中的 CloudFormation 操作。

供参考,这是我的源阶段。

        Stages:
        - Name: GitHubSource
          Actions:
          - Name: SourceAction
            ActionTypeId:
              Category: Source
              Owner: ThirdParty
              Version: '1'
              Provider: GitHub
            OutputArtifacts:
              - Name: SourceCodeArtifact
            Configuration:
              Owner: !Ref GitHubOwner
              Repo: !Ref GitHubRepo
              OAuthToken: !Ref GitHubAuthToken

这是我的部署阶段:

        - Name: DevQA
          Actions:
          - Name: DeployInfrastructure
            InputArtifacts:
              - Name: SourceCodeArtifact
            ActionTypeId:
              Category: Deploy
              Owner: AWS
              Provider: CloudFormation
              Version: '1'
            Configuration:
              StackName: !Ref AppName
              Capabilities: CAPABILITY_NAMED_IAM
              RoleArn: !GetAtt [CloudFormationRole, Arn]
              ParameterOverrides: !Sub '{"ImageId": "${image_version??}"}'

请注意,上面最后一行中的image_version 只是我的理想占位符,以说明我希望如何使用image_version json 值。

Codepipeline 如何读取 SourceCodeArtifact 中的 json 文件中的字段值? 阶梯函数?拉姆达?代码构建?

【问题讨论】:

    标签: aws-lambda amazon-cloudformation aws-codepipeline aws-step-functions


    【解决方案1】:

    您可以在 Source 和 Deploy 阶段之间使用 CodeBuild 步骤。

    在 CodeBuild 步骤中,从 SourceArtifact(由 soruce 阶段生成的工件)读取 image_version 并写入工件“模板配置”文件 1,这是 CloudFormation 操作的配置属性。此文件可以保存您的 CloudFormation 堆栈的参数值。使用此文件代替您当前使用的ParameterOverrides

    【讨论】:

    • 这是一个有趣的想法!我们目前使用模板配置文件,因此我可以使用 CodeBuild 为其添加额外参数,然后将该输出工件传递给 CloudFormation 操作。谢谢!
    • 我向 AWS Support 提出了同样的问题,今天早上我从他们那里收到了非常相似的建议,所以我接受了这个作为答案。谢谢!
    • 你有如何做到这一点的例子吗?
    【解决方案2】:

    Fn::GetParam 是你想要的。它可以从 JSON 格式文件中的键值对返回一个值。并且 JSON 文件必须包含在工件中。

    这是文档,它为您提供了一些示例:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html#w2ab1c13c20b9

    应该是这样的:

    ParameterOverrides: |
        {
            "ImageId" : { "Fn::GetParam" : ["SourceCodeArtifact", "imageManifest.json", "image_id"]}
        }
    

    【讨论】:

    • 这将是完美的,但就我的一生而言,我无法让它与 !Sub 一起工作。我有许多希望使用的 ParameterOverrides。 ``` ParameterOverrides: !Sub | { "AppName": "${AppName}", "ImageVersion": { "Fn:GetParam": [ "InfraSourceCode", "imageManifest.json", "image_version" ] } } ``` 在这种情况下,字符串与不评估 GetParam。我尝试了许多不同的方法来使用 GetParam。感谢任何帮助。
    • @rodoherty1 你试过把 !Sub 放进去吗?就像ParameterOverrides: | { "AppName" : { "Fn::Sub" : "AppName" }, "ImageId" : { "Fn::GetParam" : ["SourceCodeArtifact", "imageManifest.json", "image_id"]} }一样,我没试过,但我觉得它可以工作。
    • 我没有尝试过确切的代码块,但我认为问题在于它没有评估 "ImageId" : { "Fn::GetParam" : ["SourceCodeArtifact", "imageManifest.json", "image_id"]}。所以即使"AppName" : { "Fn::Sub" : "AppName"} 被评估,我认为Fn::GetParam 也不会。今天早上,我收到了来自 AWS 的建议,该建议与 @shariqmaws 的回答非常相似,所以我会尝试一下。谢谢你的建议,刘畅。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2021-10-20
    • 2015-10-05
    • 2021-04-09
    相关资源
    最近更新 更多