我尝试使用 terraform apply 命令中的变量输入参数启动ec2实例。这将成功创建实例。但是,当我尝试使用 terraform destory 删除实例时,它会执行,但不会删除任何内容。
所以我有一个具有默认值的区域变量。当我使用输入参数在此变量中传递其他区域时,实例在提供的区域中启动正常,但无法使用terraform destroy终止它。
main.tf
variable "region" {
default = "us-west-1"
}
variable "ami" {
type = "map"
default = {
us-east-2 = "ami-02e680c4540db351e"
us-west-1 = "ami-011b6930a81cd6aaf"
}
}
provider "aws" {
region = "${var.region}"
}
resource "aws_instance" "web" {
ami = "${lookup(var.ami,var.region)}"
instance_type = "t2.micro"
tags {
Name = "naxi"
}
}
Terraform适用:
terraform apply -var region=us-east-2
terraform destroy的输出:
aws_instance.web: Refreshing state... (ID: i-05ca0514f61dcaf16)
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
Destroy complete! Resources: 0 destroyed.
尽管它能够在正确的区域中查找实例ID,但我的猜测是它试图从默认区域而不是从我作为参数提供的那个区域终止该实例。
是否可以通过-var region=something
提供参数terraform destroy
?
如果使用默认值且没有输入参数,销毁将按预期进行。
编辑---
我发出以下命令:terraform destroy -varfile=variables.tfvars
,将删除terraform.tfstate
文件中所有与实例相关的信息,并且该文件的所有先前内容都将作为备份保存到terraform.tfstate.backup
。但是仍然没有删除该实例。
答案 0 :(得分:0)
也许您设置了多个提供程序。尝试给您的提供者起别名,并将其传递到资源中。
provider "aws" {
region = "${var.region}"
alias = "mine"
}
resource "aws_instance" "web" {
provider = "aws.mine"
}
答案 1 :(得分:0)
我认为这是您的主要问题:
apply
,但是随后您使用相同的“ aws”提供程序来运行destroy
定义了 (您将“ region”变量设置为默认值,而不是指定它)。terraform destroy
在错误的位置(错误的AWS区域)查找了您创建的资源。terraform destroy
处在错误的位置,所以在那里什么也找不到。terraform destroy
看到它不需要销毁任何东西,只需更新其本地存储的状态信息即可反映出资源的缺乏。请尝试以下步骤:
terraform apply -vars 'region=us-east-2'
terraform destroy -vars 'region=us-east-2'
这对我有效,Terraform v0.12.2 + provider.aws v2.16.0。
我在这里稍作猜测,但似乎关键是您(Terraform用户)有责任确保您destroy
使用与apply
完全相同的提供程序定义
如果您使用任何变量来帮助定义提供程序,那么您将需要特别注意这一点,因为您可以轻松地意外更改提供程序定义。
作为旁注,我自己也遇到了类似的困惑。在我看来,HashiCorp的Getting Started指南在当前状态下可以做得更好,对此有所警告。它会引导新手通过a very similar setup to yours,目前似乎对如何正确destroy
或任何潜在的陷阱一无所知。