首页 > 解决方案 > Terraform 脚本在创建新的之前破坏先前创建的 ec2

问题描述

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

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

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

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

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

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

谢谢。

标签: terraform-provider-aws

解决方案


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"
}

推荐阅读