Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 地形破坏不';t删除使用变量的输入参数创建的ec2实例_Amazon Ec2_Terraform - Fatal编程技术网

Amazon ec2 地形破坏不';t删除使用变量的输入参数创建的ec2实例

Amazon ec2 地形破坏不';t删除使用变量的输入参数创建的ec2实例,amazon-ec2,terraform,Amazon Ec2,Terraform,我尝试使用terraform apply命令中变量的输入参数启动ec2实例。这将成功创建实例。但是,当我尝试使用terraform Destroy删除实例时,它会执行,但不会删除任何内容 所以我有一个带有默认值的区域变量。当我使用输入参数在这个变量中传递一个不同的区域时,instance launchesjust fine在提供的区域中,但我无法使用terraform destroy终止它 main.tf 变量“区域”{ default=“us-west-1” } 变量“ami”{ type=“

我尝试使用terraform apply命令中变量的输入参数启动ec2实例。这将成功创建实例。但是,当我尝试使用terraform Destroy删除实例时,它会执行,但不会删除任何内容

所以我有一个带有默认值的区域变量。当我使用输入参数在这个变量中传递一个不同的区域时,instance launchesjust fine在提供的区域中,但我无法使用terraform destroy终止它

main.tf

变量“区域”{
default=“us-west-1”
}
变量“ami”{
type=“映射”
默认值={
us-east-2=“ami-02e680c4540db351e”
us-west-1=“ami-011b6930a81cd6aaf”
}
}
提供商“aws”{
region=“${var.region}”
}
资源“aws_实例”“web”{
ami=“${lookup(var.ami,var.region)}”
实例_type=“t2.micro”
标签{
Name=“纳西”
}
}
地形适用:

terraform apply -var region=us-east-2
地形破坏的输出:

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
地形破坏

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

编辑---


只要我发出this命令:
terraform destroy-varfile=variables.tfvars
,就会删除
terraform.tfstate
文件中所有与实例相关的信息,并将此文件以前的所有内容保存为
terraform.tfstate.backup
。但实例仍然没有被删除


也许您设置了多个提供者。请尝试为提供者添加别名并将其传递到资源中

提供程序“aws”{
region=“${var.region}”
别名=“我的”
}
资源“aws_实例”“web”{
provider=“aws.mine”
}

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

  • 您使用一种方式(通过变量)定义的“aws”提供程序运行
    apply
    ,然后使用不同定义的同一个“aws”提供程序运行
    destroy
    (默认使用“region”变量,而不是指定它)
  • 因此,
    terraform destroy
    在错误的位置(错误的AWS区域)查找您创建的资源
  • 由于
    terraformdestroy
    在错误的地方寻找,它在那里什么也没找到
  • 因此,
    terraformdestroy
    看到它不需要销毁任何东西,只需更新其本地存储的状态信息以反映资源的缺失
  • 请尝试以下步骤:

    terraform apply -var 'region=us-east-2'
    terraform destroy -var 'region=us-east-2'
    
    这对我来说很有用,Terraform v0.12.2+provider.aws v2.16.0

    我在这里略作猜测,但重点似乎是您,Terraform用户,有责任确保您使用与您应用的提供商定义完全相同的提供商定义来销毁

    如果您正在使用任何变量来帮助定义提供者,那么您需要特别注意这一点,因为您使意外更改提供者定义变得非常容易


    作为旁注,我自己也遇到了类似的困惑。在我看来,HashiCorp的指南在目前的状态下,可以更好地警告这一点。它引导新手通过,目前似乎没有说明如何正确地
    销毁
    ,或任何潜在的陷阱。

    您是说您使用相同的状态文件应用了该配置两次,每个区域一次?如果是这样的话,那么Terraform将在创建第二个实例之前销毁第一个区域中的实例,这样第二个实例就不再存在了。您应该检查您的状态文件显示了什么以及您在AWS帐户中拥有什么,但我认为这只是您混淆了您正在使用的状态文件,或者忽略了您已将其删除的事实。只要我发出this命令:terraform destroy-varfile=variables.tfvars,terraform.tfstate文件就会变为空(几乎)并且此文件的所有以前的内容都将另存为备份。但实例仍然没有被删除。(请参见上面的编辑)我没有应用配置文件twiceGood,但是TF版本v0.12.24的小打字错误
    vars
    ->
    var
    ,谢谢,修复了它!他们真的需要警告人们——因为按您的预期调用
    terraform destroy
    也会破坏第一个区域的状态信息!吸取的教训是,如果您运行
    terraform destroy
    ,但看不到预期效果,最好取消。