【问题标题】:terraform destroy doesn't delete the ec2 instance created using input parameters for variablesterraform destroy 不会删除使用变量的输入参数创建的 ec2 实例
【发布时间】:2019-06-04 23:27:31
【问题描述】:

我尝试在 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 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,但我的猜测是它试图从默认区域终止实例,而不是从我作为参数提供的区域终止。

有没有办法可以用terraform destroy 提供参数-var region=something

如果我使用默认值且没有输入参数,则 Destroy 会按预期工作。

编辑---

只要我发出以下命令:terraform destroy -varfile=variables.tfvarsterraform.tfstate 文件中的所有实例相关信息都会被删除,并且该文件的所有先前内容都会作为备份保存到 terraform.tfstate.backup。但是实例仍然没有被删除。

【问题讨论】:

  • 您是说您使用相同的状态文件两次应用该配置,每个区域一次?如果是这样,那么 Terraform 将在创建第二个区域之前销毁第一个区域中的实例,因此第二个实例将不再存在。您应该检查您的状态文件显示的内容以及您的 AWS 账户中的内容,但我认为这只是您混淆了您正在使用的状态文件或错过了您已经删除它的事实。
  • 只要我给出这个命令:terraform destroy -varfile=variables.tfvars,terraform.tfstate 文件就会变空(几乎),并且该文件的所有先前内容都会保存为备份。但仍然没有删除该实例。 (请参阅上面的编辑)
  • 我没有应用两次配置文件

标签: amazon-ec2 terraform


【解决方案1】:

也许您设置了多个提供程序。尝试为您的提供者起别名并将其传递到资源中。

provider "aws" {
  region = var.region
  alias  = "mine"
}

resource "aws_instance" "web" {
  provider = aws.mine
}

【讨论】:

    【解决方案2】:

    我认为这是你的主要问题:

    1. 您运行 apply 时以一种方式定义了“aws”提供程序(通过变量),但随后您运行 destroy 时使用了相同的“aws”提供程序定义不同(您让“区域”变量默认而不是指定它)。
    2. 因此,terraform destroy 在错误的位置(错误的 AWS 区域)查找您创建的资源。
    3. 由于terraform destroy 找错了地方,它什么也没找到。
    4. 因此terraform destroy 看到它不需要销毁任何东西,只需更新其本地存储的状态信息以反映资源的缺失。

    请尝试以下步骤:

    terraform apply -var 'region=us-east-2'
    terraform destroy -var '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,或任何潜在的陷阱。

    【讨论】:

    • 好,但小错字vars -> var TF 版本 v0.12.24
    • 谢谢,已修复!
    • 他们确实需要警告人们——因为如您所愿调用terraform destroy 也会破坏第一个区域的状态信息!吸取的教训,如果您运行 terraform destroy 并没有看到您期望的结果,最好取消。
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2018-11-14
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2020-10-07
    相关资源
    最近更新 更多