AWS ECS:强制重新部署ECR中的新最新映像

时间:2020-02-20 17:16:03

标签: amazon-web-services gitlab gitlab-ci amazon-ecs amazon-ecr

我知道在这个方向上已经有无数的问题了,但是不幸的是我还没有找到正确的答案。如果已有帖子,请在此处共享链接。

我有几个gitlab CI / CD管道。第一条管道使用Terraform为基于Fargate的ECS集群构建完整的基础架构。第二个/第三个管道创建夜间构建的前端和后端,并将带有标签“最新”的Docker镜像推送到(暂存)AWS账户的ECR中。

我现在想要实现的是重新部署了相应的ECS任务,以便使用最新的Docker映像。我实际上以为可以通过CloudWatch Events或其他方式实现此目的,但是我在这里找不到一个很好的起点。解决方法是在CI / CD管道中安装AWS CLI,然后使用“强制进行新部署”进行服务更新。但这对我来说似乎不是很优雅。这里有更好的方法吗?

条件:

  • 该解决方案必须是完全自动化的(在AWS或gitlab CI / CD中)
  • 切换到AWS CodePipeline不在讨论之列
  • 理想情况下尽可能接近AWS标准。由于可维护性,我想避免执行大量操作的广泛lambda函数。

非常感谢!

3 个答案:

答案 0 :(得分:1)

作为一般性评论,不建议始终推送相同的容器标签,因为在发生故障的情况下回滚到以前的版本会非常困难。

一个合适的选择是使用git标签。 假设您正在部署版本v0.0.1 您可以创建文件app-version.tf,其中包含变量backend-version = v0.0.1,您可以在ecs服务的任务定义中引用该变量。 使用git describe创建容器可以做同样的事情。

因此,您将为每个git标签获得一个新的任务定义,并且只需更改terraform配置中的值即可回滚。

答案 1 :(得分:1)

好,对于每个对答案感兴趣的人。我这样解决了: 我在CICD管道中执行以下AWS CLI命令

public bool Insert(Record record)
{
    using (var connection = new SqlConnection(_configuration.GetConnectionString("Production"))
    {
        string query = "DECLARE @RSGUID uniqueidentifier; SET @RSGUID = NEWID(); INSERT INTO [dbo].[Table] ([Result], [ResultSetKey]) VALUES (@Result, @RSGUID); SELECT @RSGUID";
        var resultSetKey = connection.ExecuteScalar<string>(query).SingleOrDefault();
        return !String.IsNullOrEmpty(resultSetKey);
    }
}

不是我一直在寻找的解决方案,但是它可以工作。

答案 2 :(得分:0)

使用摘要或唯一的immutable tags引用图像是有益的。管道推送图像后,它可以:

  1. 获取图像的摘要/唯一标记
  2. 创建任务定义的新修订版本
  3. 使用新的任务定义触发ECS部署。

如sgramo93所述,最大的好处是可以通过部署任务定义的旧版本来完成应用程序的回滚。