【发布时间】:2019-06-08 10:20:58
【问题描述】:
我有一个使用 Terraform 创建的现有 ECS 集群 (EC2)。我想使用 Terraform 在这些 EC2 实例上安装一些软件。我们的业务需求之一是我们将无法销毁和重新创建实例,我们必须在现有实例上执行此操作。
我应该如何处理这个问题?
【问题讨论】:
标签: amazon-web-services terraform amazon-ecs terraform-provider-aws
我有一个使用 Terraform 创建的现有 ECS 集群 (EC2)。我想使用 Terraform 在这些 EC2 实例上安装一些软件。我们的业务需求之一是我们将无法销毁和重新创建实例,我们必须在现有实例上执行此操作。
我应该如何处理这个问题?
【问题讨论】:
标签: amazon-web-services terraform amazon-ecs terraform-provider-aws
听起来您的组织正在尝试在 docker 和 ECS 中运行其服务。我还假设您正在使用 AWS ECR 来托管您的 docker 映像(尽管技术上并不重要)。
当您创建 ECS 集群时,它最初是空的。如果您要再次重新运行您的 terraform 模板,它应该会告诉您没有要应用的更新。为了进行下一步,您需要定义 ecs-service 和 ecs-task-definition。这可以在您现有的 terraform 模板、全新模板中完成,也可以手动完成(aws Web 控制台或 awscli)。由于您已经在使用 terraform,我假设您会继续使用它。就我个人而言,我会将所有内容保存在 1 个模板中,但这又取决于您。
ecs-service 本质上是 ecs-tasks 的运行时配置 ecs-task-definition 是一组要运行的 docker 容器。在最简单的情况下,它是 1 个单个 docker 容器。您可以在此处指定将使用的 docker 映像、docker 容器的 CPU+RAM 数量等...
为了在不关闭 EC2 节点的情况下更新您正在运行的 ecs 服务,您只需要在 terraform 模板的 ecs-task-definition 部分更新您的 docker 映像(当然是运行 terraform) .
有了所有这些背景信息,您现在可以将Terraform ecs-service Terraform ecs-task-definition 添加到您的地形模板。
由于您没有提供您的模板,我无法确切说明应该如何设置,但可以在下面找到运行 nginx 的完整 ECS 集群的示例 terraform 模板 Complete Terraform ECS example 更多示例可以在 Official terraform ECS github examples
【讨论】:
您可以运行provisioner 附加到始终触发的null_resource 以始终针对事物运行某些进程,但我强烈建议您重新考虑您的进程。
应将您的 ECS 集群视为完全短暂的,就像在其上运行的容器一样。当您想要更新 ECS 实例时,销毁和替换实例(理想情况下在自动扩展组中)是您想要做的,因为它大大简化了事情。您可以阅读有关不可变基础架构elsewhere 的benefits 的更多信息。
如果您绝对无法做到这一点,那么您很可能最好完全使用其他工具,例如 Ansible。您可以选择使用上面提到的 null_resource 配置器通过 Terraform 启动它,看起来如下所示:
resource "null_resource" "on_demand_provisioning" {
triggers {
always = "${uuid()}"
}
provisioner "local-exec" {
command = "ansible-playbook -i inventory.yml playbook.yml --ssh-common-args='-o StrictHostKeyChecking=no'"
}
}
【讨论】: