如何避免 terraform apply 中的 destroy 动作?

How to avoid the destroy action in terraform apply?

My Terraform resource file looks like this :

resource "aws_instance" "ubuntu14" {
    instance_type = "t2.medium"
    ami = "${lookup(var.aws_amis_ubuntu14,var.aws_region)}"
    tags {
        Name = "${var.user_label} - Ubuntu 14 - Fresh Agent Install - ${count.index}"
    }
    key_name = "${var.aws_key_name}"
    vpc_security_group_ids = ["${lookup(var.security_group_id,var.aws_region)}"]
    count = "${var.count}"

.....

我已经有一台机器 运行 并且不想破坏它。

如何在 terraform apply 中实现?

Terraform 计划显示如下: 计划:2个添加,0个更改,1个销毁。

我想保留所有 3 个

很遗憾,您必须从状态文件中删除信息。您可以手动执行此操作(乏味且不推荐),或者您可以使用 Terraform state rm.

参见文档:https://www.terraform.io/docs/commands/state/rm.html

I already have a machine running and do not want to destroy it

这条语句有两种解读方式:

  1. 您使用 Terraform 以外的其他方式(例如使用 AWS 控制台或 AWS CLI)部署了同一个 EC2 实例,现在您想使用 Terraform 来管理它。
  2. 您使用 Terraform 部署了这个 EC2 实例,您更改了一些参数(例如 AMI ID),现在您想要部署该更改。

根据以下哪些陈述是正确的,您需要采取不同的行动:

选项 1:使用 Terraform 管理现有基础设施

您可以使用 Terraform import command 允许 Terraform 管理这个现有实例。在 EC2 控制台中查找现有实例的 ID,然后 运行 以下命令:

terraform import aws_instance.ubuntu14 <YOUR_INSTANCE_ID>

现在,当您 运行 terraform plan 时,唯一的变化将是代码与实际 运行ning 之间的任何差异。

选项 2:使用 Terraform 将更改部署到 EC2 实例

对于 EC2 实例的大多数更改,例如更改 AMI ID、用户数据或 IAM 角色,Terraform 将销毁旧实例并部署新实例。无法使用 Terraform 更新这些参数 "in place",因为 AWS 本身不允许您更新它们!

因此,您有几个选择:

  1. 如果您只想更新实例上的代码 运行ning(例如 运行 apt-get install 添加一些新的依赖项),请通过 SSH 连接到实例并在它直接。或者,您可以使用 Chef、Puppet 或 Ansible 等配置管理工具来为您管理所有这些。
  2. 否则,您唯一的选择就是更换实例。有多种方法可以做到这一点,而且您的用户不会出现明显的停机时间。典型的做法是在 Instance 前面放一个 Elastic IP (EIP) Address 或 Elastic Load Balancer (ELB),将用户指向该 EIP 或 ELB,在部署更改时,先创建一个新 Instance,将其附加到EIP 或 ELB 启动后,然后删除旧实例。查看我对 的回答以获取详细信息和示例代码。 (注意:如果您的实例是有状态的——也就是说,它将数据存储在本地硬盘上——那么您需要将该数据存储在 EBS 卷上,将其与旧实例分离,然后附加它到新的。这不能立即完成,所以对于单个实例,你将无法在没有停机的情况下完成它。)