当前位置: 首页 > 知识库问答 >
问题:

代码管道:ECR源ECS部署配置

司业
2023-03-14

基本上,我需要配置CI/CD与比特桶源代码到ECS容器。我想使用CodePipline部署新的ECR映像到ECS。

目前,AWS CodePipline中没有将bitbucket指定为源的选项。然而,我已经设法用webhooks配置了CodeBuild,这样它就可以构建docker文件,并在每次推送发布分支时将其推送到ECR。

我想将ECR配置为CodePipline中的“源”阶段,并将其部署到现有的ECS集群/服务中,以便自动部署。

  • 我将AmazonECR指定为在源阶段具有image_details输出工件的操作提供程序。
  • 我指定亚马逊ECS(不是亚马逊ECS(蓝色/绿色))作为部署阶段的操作提供程序,image_details作为输入工件

不幸的是,如果部署步骤中出现以下错误,则会导致基本配置和工件链接:

Invalid action configuration
The image definition file imageDetail.json contains invalid JSON format

尽管“Amazon ECR”阶段提供了imageDetail.json作为输出工件,但“Amazon ECS”部署提供程序似乎并不期望它。有没有合理的方法来回避这个问题?

我知道,这是可能的配置CI/CD与比特桶API网关/Lambda CodePipeline,我也考虑使用CodeCommit而不是比特桶作为源回购-仍然,希望有一个可能的优雅的解决方案,直接使用比特桶与CodePipeline。

UPD:我最终得到了非常好的配置,如本文所述:总体思路是允许CodeBuild将源代码从bitbucket上传到S3,然后使用带有S3的CodePipeline作为源,将新的docker映像部署到ECR,并在ECS集群中发布新的任务定义修订版。S3仍然是开销,我正在为任务寻找一个更优雅的解决方案。

共有2个答案

方嘉志
2023-03-14

我有一个类似的用例,遇到了同样的问题。这是一个很长的答案,解决了我的用例。。。

  1. 用例:工具帐户具有CodePipeline,它将CodeBuild和docker推送到QA帐户ECR。图像将有两个标签——“提交哈希”和“最新”。QA帐户有一个管道,当新映像可用时执行,该管道将新映像部署到QA帐户中的Fargate集群中。
  2. 部署平台:Amazon ECS标准部署操作 来源:ECR
  3. 问题原因:ECR源的输出工件正确地只包含图像的信息,而不包括ECS标准部署所期望的容器名称。
  4. 对AWS的建议:鉴于使用ECR作为ECS来源的流行场景,我们可以提出一个论点,即在输出工件中添加容器名称的能力(可选)-这将允许生成输出工件可以作为ECS标准部署的输入。

根据AWS ECS Standard Deployment的官方文档,需要一个-imagedefinitions.json文件,该文件提供容器名称和图像URI。应该是这样的:

[
  {
    "name": "sample-app",
    "imageUri": "11111EXAMPLE.dkr.ecr.us-west-2.amazonaws.com/ecs-repo:latest"
  }
]
元叶秋
2023-03-14

我最近刚刚解决了一个类似的问题,我想使用ECR作为管道的源,并让它将映像部署到ECS。我找到的解决方案是创建3个阶段:

  • 资料来源:ECR

以下是我正在用作构建阶段的buildspec.yml文件:

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.7
  build:
    commands:
      - PHP_REPOSITORY_URI=$(cat imageDetail.json | python -c "import sys, json; print(json.load(sys.stdin)['ImageURI'].split('@')[0])")
      - IMAGE_TAG=$(cat imageDetail.json | python -c "import sys, json; print(json.load(sys.stdin)['ImageTags'][0])")
      - echo $PHP_REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Writing image definitions file...
      - printf '[{"name":"container","imageUri":"%s"}]' $PHP_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

基本上,这是读取imageDetail.json文件,提取ECR存储库URL和标记,并输出一个为ECS部署阶段格式化的json文件,这只是一个没有定制的标准阶段。

 类似资料:
  • 我正在尝试使用代码构建操作在AWS代码管道上部署AWS CDK应用程序。 构建和部署在本地完美工作(因为它会!)但是在CodeBuild上运行时,命令失败 这很可能是一些琐碎的事情,但我却在挠头,想弄明白是什么! 项目结构是自动生成的(使用) 对于阶段是 是(此阶段的输入目录是阶段的工件,即目录) 阶段抛出cdk ls步骤中的错误。由于上面的构建/部署步骤在本地工作(在干净的签出中),我怀疑这可能

  • 我正在使用代码管道部署云形成模板。问题是这个Cloud形成模板有一些嵌套堆栈。嵌套堆栈模板需要在S3存储桶中。所以在触发主(父)CF模板之前,我需要将CF嵌套堆栈上传到S3。 我没有找到使用代码管道实现这一点的方法。 有什么建议吗?

  • 我正在尝试构建一个代码管道,以: 以github Java源代码项目为例 我能造罐子(我有第二阶段的工作)。我假设第3阶段将涉及调用sam模板来进行部署。该模板是同一github repo的一部分。 我的问题是:我看不出如何将jar和模板文件提供给第三阶段来进行部署。 我附上以下三个文件以供参考: 一个构建规范,可以工作,但是我找不到生成的工件 1.buildspec.yml 2.codepipe

  • 最简单的部署 git clone git@github.com:i5ting/shop-api.git git clone git@github.com:i5ting/shop-admin.git git clone git@github.com:i5ting/shop-h5.git ftp上传 前提是在服务器上部署ftp服务器 推荐使用gulp和ftp部署 https://github.com

  • 我试图通过jenkins管道将azure web应用程序部署到azure form git 代码如下所示 这怎么可能?有什么方法可以将git repo url作为参数提供给azure插件吗? 谢了!

  • 我想为我的AWS基础设施和AWS Lambda函数设置一个CI/CD管道。我们的想法是让一切都在代码中,版本控制和自动化。我只想