如何使用Terraform更新AWS ECS集群实例?

时间:2019-06-04 15:28:43

标签: amazon-web-services terraform amazon-ecs terraform-provider-aws

我有一个使用Terraform创建的现有ECS集群(EC2)。我想使用Terraform在这些EC2实例上安装一些软件。我们的业务要求之一是,我们将无法销毁并重新创建实例,而必须在现有实例上进行。

我应该如何处理?

2 个答案:

答案 0 :(得分:0)

您可以在始终触发的provisioner上附加一个null_resource,以始终对某些事物运行某些进程,但我强烈建议您重新考虑一下您的进程。

您的ECS集群应该与它们上运行的容器一样被视为短暂的。当您要更新ECS实例时,您想要做的就是销毁和替换实例(理想情况下是在自动扩展组中),因为它可以大大简化事情。您可以详细了解benefits不变的基础设施elsewhere

如果您绝对不能执行此操作,则最好完全使用其他工具(例如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'"
  }
}

答案 1 :(得分:0)

听起来您的组织正在尝试在docker和ECS中运行其服务。我还假设您正在使用AWS ECR来托管您的Docker映像(尽管从技术上来说并不重要)。

创建ECS群集时,它最初是空的。如果要再次运行terraform模板,它将显示没有更新要应用。为了进行下一步,您需要定义 ecs-service ecs-task-definition 。既可以在现有terraform模板中,也可以在全新模板中完成此操作,也可以手动进行操作(aws Web控制台或awscli)。由于您已经在使用terraform,因此我假设您将继续使用它。我个人将所有内容都保留在1个模板中,但还是由您自己决定。

ecs服务本质上是ecs-tasks的运行时配置 ecs-task-definition是一组要运行的docker容器。在最简单的情况下,它是1个单个docker容器。在这里您将指定要使用的Docker映像,该Docker容器的CPU + RAM等等...

为了在不关闭EC2节点的情况下更新正在运行的ecs服务,您只需要在terraform模板的ecs-task-definition部分(当然是运行terraform)中更新docker映像即可。 。

有了所有这些背景信息,现在您可以将Terraform ecs-service Terraform ecs-task-definition添加到您的Terraform模板中。

由于您未提供模板,因此无法确切说明应如何设置,但是可以在下面找到运行nginx的完整ECS集群的terraform模板示例 Complete Terraform ECS example 可以在以下位置找到更多示例 Official terraform ECS github examples