Terraform脚本会在创建新的ec2之前销毁先前创建的ec2

时间:2019-10-05 07:49:35

标签: terraform-provider-aws

我是Terraform的新手,这是我尝试的第一个脚本

provider "aws" {
  profile    = "default"
  region     = "us-east-1"
}

resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"
}

我上面的脚本存储在C:\TerraformScripts\First.tf的Windows桌面上

现在,当我第一次运行它时,脚本将执行并为我创建一个新实例。我想第二次运行它,只是将名称从example更改为example2。我假设它将使用相同的配置创建一个新实例,因为我针对资源设置更改了名称。但是它反而破坏了我在第一次运行时创建的实例,然后再次重新创建它。为什么没有我指定的销毁会发生这种情况?

抱歉,如果我可能错过了文档中的某些内容,但是看时看不到。

谢谢。

1 个答案:

答案 0 :(得分:1)

Terraform是一种声明性语言,这意味着您编写的脚本正在告诉terraform您要达到的状态(然后terraform会确定如何到达那里)。就像说“我希望您确保我拥有aws_instance”,而不是“我希望您创建aws_instance”一样。

如果我的理解正确,那么您可能打算这样做:

provider "aws" {
  profile    = "default"
  region     = "us-east-1"
}

resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"
}

resource "aws_instance" "example2" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"
}

如果现在运行terraform apply,则将有两个EC2实例,而不管以前的脚本创建了多少个。这是因为在后台,terraform正在状态文件中跟踪该脚本先前为该资源创建的资源,将它们与当前脚本进行比较,然后找出要采取的行动以使其对齐。

或者,您可以使用count参数来获取同一资源的多个副本:

provider "aws" {
  profile    = "default"
  region     = "us-east-1"
}

resource "aws_instance" "example" {
  count         = 2
  ami           = "ami-2757f631"
  instance_type = "t2.micro"
}