【问题标题】:How to create an ECS task in CloudFormation before the CodePipeline is created如何在创建 CodePipeline 之前在 CloudFormation 中创建 ECS 任务
【发布时间】:2021-02-16 21:00:09
【问题描述】:

我正在尝试在 Cloudformation 中定义我的 ECS 堆栈,包括 CI/CD 管道和 ECR 存储库。但是,您遇到了一个难题:

  1. 要创建 ECS 任务定义 (AWS::ECS::TaskDefinition),您必须首先创建填充的 ECR 存储库 (AWS::ECR::Repository),以便您可以指定 Image 属性。
  2. 要填充此存储库,您必须首先创建将在创建时自动运行的 CodePipeline (AWS::CodePipeline::Pipeline)。
  3. 要创建管道,您必须首先创建 ECS 任务定义/集群,因为管道需要在其上部署(返回第 1 步)。

我可以看到的解决方案是:

  • 不要在 Cloudformation 中创建 ECR 存储库并将其作为参数传递给堆栈。
  • 在任务定义中定义一个虚拟映像以进行首次部署,然后创建将创建真实 ECR 存储库并部署真实映像的管道。
  • 在单独的堆栈中创建 CodeBuild 项目和 ECR 存储库,使用 lambda 函数触发 CodeBuild 项目(我认为它不会像管道那样在创建时自动运行),创建 ECS 集群,然后创建管道。这似乎比应有的复杂。

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: amazon-cloudformation amazon-ecs aws-codepipeline aws-codebuild


    【解决方案1】:

    我这样做的方式是先到 ECR 存储库,但仍然使用 CloudFormation。所以我有两个模板。一个用于 ECR 回购。第二个是其余的。 ECR 存储库作为参数传递给第二个模板。但您也可以在第二步中将export 其 Uri 设置为ImportValue。 Uri 创建如下:

      Uri:
        Value: !Sub "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${MyECR}"
    

    您还需要在 repo 中为任务定义提供一些初始图像。您可以通过为此初始构建单独的 CodeBuild 项目(不需要 CodePipeline)来自动执行此操作。

    【讨论】:

    • 当然,但是我必须为初始构建定义一个完整的代码构建项目,这似乎并不理想。有没有代码链接,可能我没完全理解。
    • @jdolds 如果您想要完全自动化的解决方案,您必须创建所有这些代码。否则,您可以手动将初始图像上传到 ECR,然后构建其余部分。
    • 是的,很公平。我可能只是使用硬编码图像来创建初始任务定义。似乎是我在大多数在线示例中看到的,例如github.com/awslabs/ecs-refarch-continuous-deployment/blob/…
    • @jdolds 没问题。虚拟图像可能是最简单的方法。在我的回答中,您将使用您的真实图像来进行初始任务定义。因此,您必须先构建它。之后,您的管道可以构建它的新版本。
    • 当然,我认为您的回答以及此评论部分提供了足够多的详细信息:)
    猜你喜欢
    • 2018-05-18
    • 2015-08-23
    • 2019-04-19
    • 1970-01-01
    • 2018-09-17
    • 2018-08-13
    • 2015-12-20
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多