当管道 运行 使用 CDK 管道模块时,如何使 Fargate 服务从 ECR 存储库部署最新图像?

How to make a Fargate Service deploy the latest image from an ECR repository when a pipeline is run using CDK pipelines module?

我已经使用 CDK Pipelines 模块设置了 AWS CodePipeline 堆栈。当代码被推送到支持 CodeCommit 存储库时,管道开始执行并执行以下操作:

一切正常。

但每次我推送到存储库时,我都希望 Fargate 服务使用最新的 docker 图像进行更新。这没有发生。 Fargate 服务未更新,服务中的任务继续 运行 使用创建 Fargate 服务时最新的 docker 图像。

如何更新 Fargate 服务,即使用最新映像启动新任务并使用旧映像关闭现有任务?

如果我 运行 从命令行手动执行以下命令,则服务会更新,即使用最新映像启动新任务并使用旧映像关闭现有任务。

aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --force-new-deployment

您将执行与手动执行相同的操作,但在管道中。添加部署后执行命令的 CodeBuildStep。

或者,您可以使用资产并让管道处理构建和 ECR 上传。

对于 ECS,您将使用 ContainerImage.fromDockerImageAsset()

这将使用新标签更新任务定义,这将强制重新部署。

要了解正在发生的事情,您必须了解这些任务是如何工作的。基本上,当您注册一个任务时,它将在 S3 中创建。因此,当您在 ECS 中启动此任务时,它会向 S3 询问任务详细信息。 如果您没有发布任务的新版本,它会尝试通过图像标签而不是图像标签来拉取您的图像(每个图像都不同,即使标签相同)。

因此,即使您推送了一张新图片,它仍然在推送一张旧图片。 要解决此问题,您只需在推送图像后发布新版本的任务即可。

我不知道你的 CI/CD 是如何工作的,但你可以使用 API 来做到这一点: https://docs.aws.amazon.com/cli/latest/reference/ecs/update-task-set.html

我有一个类似的问题,我通过获取任务定义、删除版本,然后使用更新任务集推送它来解决它。它正在发布新版本的任务定义,其中包含新图像的 ID。