如何避免terraform中的破坏行为适用?

时间:2016-12-22 18:09:32

标签: terraform

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中实现这一目标?

Terraform计划显示以下内容: 计划:2添加,0改变,1毁灭。

我想保留所有3

2 个答案:

答案 0 :(得分:3)

不幸的是,您必须从状态文件中获取信息。您可以手动执行此操作(繁琐且不推荐),也可以使用Terraform state rm。

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

答案 1 :(得分:3)

  

我已经有一台机器正在运行而且不想销毁它

有两种方法可以解释这句话:

  1. 您使用Terraform以外的其他方式部署了相同的EC2实例(例如,使用AWS控制台或AWS CLI),现在您想要使用Terraform进行管理。
  2. 您使用Terraform部署了此EC2实例,您已更改了某些参数(例如AMI ID),现在您想要部署该更改。
  3. 根据哪些陈述属实,您需要采取不同的行动:

    选项1:使用Terraform管理现有基础架构

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

    terraform import aws_instance.ubuntu14 <YOUR_INSTANCE_ID>
    

    现在,当您运行terraform plan时,唯一的变化就是代码与实际运行的差异。

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

    对于EC2实例的大多数更改,例如更改AMI ID,用户数据或IAM角色,Terraform将销毁旧实例并部署新实例。没有办法更新这些参数&#34;到位&#34;使用Terraform,因为AWS本身并不允许您更新它们!

    因此,您有几个选择:

    1. 如果您只想更新在Instance上运行的代码(例如,运行apt-get install以添加一些新的依赖项),请SSH到实例并直接对其进行更新。或者,您可以使用Chef,Puppet或Ansible等配置管理工具来管理所有这些工具。
    2. 否则,您唯一的选择是替换实例。有一些方法可以为用户提供明显的停机时间。典型的方法是将弹性IP(EIP)地址或弹性负载均衡器(ELB)放在实例前面,将用户指向该EIP或ELB,在部署更改时,首先创建一个新实例,将其附加到EIP或ELB启动后,然后删除旧实例。查看我对Terraform and Updates的回答,了解详细信息和示例代码。 (注意:如果您的实例是有状态的 - 也就是说,它将数据存储在其本地硬盘驱动器上 - 那么您需要将该数据存储在EBS卷上,将其与旧实例分离,并附加它是新的。这不能立即完成,所以使用单个实例,你无法在没有停机的情况下完成它。