terraform destroy не удаляет экземпляр ec2, созданный с использованием входных параметров для переменных - PullRequest
0 голосов
/ 10 января 2019

Я попытался запустить экземпляр ec2 , используя входные параметры для переменных в команде terraform apply . Это создает экземпляр успешно. Однако, когда я пытаюсь удалить экземпляр, используя terraform destory , он выполняется, но ничего не удаляется.

Итак, у меня есть переменная региона со значением по умолчанию. Когда я передаю другой регион в этой переменной, используя входные параметры, экземпляр запускается просто нормально в предоставленной области, но я не могу завершить его с помощью уничтожения terraform.

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

Вывод терраформного уничтожения:

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.

Хотя он способен искать идентификатор экземпляра в правильной области, я предполагаю, что он пытается завершить экземпляр из области по умолчанию, а не из той, которую я указал в качестве параметра.

Можно ли указать параметр -var region=something с помощью terraform destroy?

Уничтожение работает должным образом, если я использую значения по умолчанию, а не входные параметры.

EDIT ---

Как только я дам команду: terraform destroy -varfile=variables.tfvars, вся связанная с экземпляром информация из файла terraform.tfstate будет удалена, а все предыдущее содержимое этого файла будет сохранено как резервная копия в terraform.tfstate.backup. Но все равно экземпляр не удаляется.

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Я думаю, что это ваша главная проблема:

  1. Вы запустили apply с вашим провайдером "aws", определенным одним способом (через переменную), но затем вы запустили destroy с тем же провайдером "aws" , определенным по-другому (вы позволили " регион "переменная по умолчанию вместо ее указания).
  2. В результате terraform destroy искал не в том месте (неправильный регион AWS) для созданных вами ресурсов.
  3. Так как terraform destroy искал не в том месте, там ничего не нашел.
  4. Поэтому 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 в его текущем состоянии могло бы лучше предупредить об этом. Он проводит новичков через , очень похожую на вашу , и в настоящее время, похоже, ничего не говорит о том, как правильно destroy, или о любых потенциальных подводных камнях.

0 голосов
/ 20 января 2019

Возможно, у вас установлено несколько провайдеров. Попробуйте дать псевдониму своего провайдера и передать его в ресурс.

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

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