【问题标题】:How to pass variables through to Docker container using the same ECS task definition to drive multiple environments如何使用相同的 ECS 任务定义将变量传递到 Docker 容器以驱动多个环境
【发布时间】:2019-11-15 10:59:06
【问题描述】:

作为大型迁移项目的一部分,我目前正在掌握 AWS 平台。我们有许多使用 ECS/Fargate 部署的容器化微服务 (Docker)。我正在尝试了解将同一容器映像部署到多个环境的最佳方式,同时仍然能够保留特定于环境的配置。

例如,我有一个开发和生产环境,但是每个环境自然都有自己的一组配置值。到目前为止,我已经使用 AWS Parameter Store 集中了我的配置,它很好地处理了这种情况,因为应用程序只是在启动时从相关参数路径中拉下它的配置,但是我需要一些方法来让我的容器上下文感知 - 也就是说,能够告诉他们他们是在推动开发还是生产环境的方式。我的偏好是在 ECS 启动新任务时将环境变量注入容器,但是这样做的唯一方法是在配置容器的任务定义中,这意味着有两个单独的任务定义,一个用于开发,另一个用于开发对于生产,只是为了能够在启动时将单个参数传递给容器。

我希望我已经足够详细地解释了我要解决的问题。当我在网上努力寻找任何东西时,有没有人可以分享这方面的任何信息?仅仅为了这个目的而必须复制任务定义似乎有点矫枉过正。很高兴得知我只是在使用 ECS“错误”,因为这是我第一次使用它。

一旦新容器被推送到 ECR,我们的部署管道就会运行以下命令:

aws ecs update-service --cluster development --service my-service --force-new-deployment

我看到您可以在使用 aws ecs run-task cli 命令时覆盖选项,但这似乎绕过了我不想做的任何服务定义,因为我将失去对此很重要的自动缩放功能项目。

提前致谢

【问题讨论】:

  • 您是否将基础架构作为代码进行管理,即您是否使用 Cloudformation、Terraform 等。
  • 我正在使用 Cloudformation - 计划是在有原因的情况下尽可能多地使用 IaC。到目前为止,我已经有了一个模板,它将创建 ECS 服务定义(不是任务定义)并适当地设置 API 网关。

标签: amazon-web-services docker amazon-ecs


【解决方案1】:

我要做的第一件事是确保您的 Task Definition 由 CloudFormation 管理。

完成此操作后,使用 MappingsFn::FindInMap 函数在每个环境的基础上管理不同的变量应该很简单

我从this blog 撕下以下内容。如果我正确理解了您的问题,我相信它说明了您想要实现的目标。

您可以创建环境参数来控制要部署到的环境

Parameters:
  ENV:
    Type: String
  Prefix:
    Type: String

然后你可以实现一个 Map 来控制环境之间的配置:

Mappings:
  ElasticsearchDomainConfiguration:
    prod:
      InstanceType: m4.10xlarge.elasticsearch   
    dev:
      InstanceType: t2.micro.elasticsearch

Resources:
  ElasticsearchDomain:
    Type: AWS::Elasticsearch::Domain
    Properties:
      DomainName: !Sub ${Prefix}-es-domain
      ElasticsearchClusterConfig:
        InstanceType:
          Fn::FindInMap: [ElasticsearchDomainConfiguration, !Ref ENV, InstanceType]

一般来说,我不会将 IAC 和 CLI 混合使用。如果您要使用 CloudFormation,请使用它。如果有无法处理的问题,请转到 CLI/自定义脚本

HTH

【讨论】:

  • 感谢您抽出宝贵时间来回答 - 请原谅这里可能很愚蠢的问题。当有新版本可用时,我是否应该始终更新我的任务定义?我不确定你的建议如何改变我的发布管道,但是当我对 CloudFormation 有更深入的了解时,这可能会变得更加明显。
  • 不用担心。我不希望您必须直接更新任务定义。发布新图像只需要更新包含图像 arn 的 Mappings(无论您要部署到哪个环境)。那么你的 CI 工具需要更新 CF 栈
猜你喜欢
  • 2021-06-21
  • 2019-10-04
  • 2015-08-10
  • 2015-09-18
  • 1970-01-01
  • 2017-04-08
  • 2020-08-03
  • 2019-04-10
  • 2020-12-17
相关资源
最近更新 更多