terraform-provider-aws - 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
现在,当我第一次运行它时,脚本会执行并为我创建一个新实例。我想第二次运行它,只需将名称从 更改example
为example2
。我假设它会创建一个具有相同配置的新实例,因为我根据资源设置更改了名称。但它反而破坏了我在第一次运行时创建的实例,然后再次重新创建它。为什么在没有我指定销毁的情况下会发生这种情况?
抱歉,如果我可能错过了文档中的某些内容,但是当我查看时我看不到它。
谢谢。
解决方案
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"
}
推荐阅读
- css - 为什么无法在占位符上堆叠 CSS 跨浏览器规则?
- excel - 如何使用我的所有工作表名称创建一个可自动更新的命名范围?
- c++ - 从源代码安装 grpc 时出现“make: protoc: Command not found”
- windows-server-2012 - 无法启动 Automation Anywhere 控制室:网关错误
- django - Django:comment_create() 出现意外的关键字参数“pk”错误
- javascript - 如何解决 ReactJS 中的 Element type is invalid 错误?
- xquery - eXist-db 序列化被 expand-xincludes=no 忽略?
- bash - Git pre-push 防止合并
- wso2 - 如何使用 WSO2IS 使用 OIDC 和 SAML 进行身份验证
- html - 有没有办法使用 CSS 成对打破表格行?