Получите terraform, чтобы игнорировать статус associate_public_ip_address для остановленного экземпляра

У меня простое развертывание AWS с vpc, общедоступной подсетью, маршрутом и группой безопасности. Запуск terraform apply запустит экземпляр AWS, и у меня этот экземпляр настроен для привязки общедоступного IP-адреса. После создания экземпляра я запускаю terraform plan, и он правильно говорит, что все обновлено. Пока проблем нет.

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

Вот проблема: когда этот экземпляр выключен, когда я запускаю terraform plan, провайдер aws видит, что все настроено правильно, но, поскольку общедоступный IP-адрес был выпущен, значение associate_public_ip_address больше не соответствует тому, что настроено в конфигурациях terraform, поэтому terraform хочет удалить и воссоздать этот экземпляр:

associate_public_ip_address: "false" => "true" (forces new resource)

Есть ли способ заставить terraform игнорировать только этот параметр?

Этот вопрос незначительно связан с https://github.com/hashicorp/terraform/issues/7262 < / а>. Но в моем случае я не хочу устанавливать ожидаемое состояние, я просто хочу иметь возможность указать terraform игнорировать этот единственный параметр, потому что это нормально, что он не связан прямо сейчас, пока он настроен на связывание при запуске.

(Это пришло мне в голову при написании этого вопроса: я не экспериментировал с настройкой подсети для автоматического связывания общедоступного IP-адреса для экземпляров, запущенных в ней. Возможно, сделав это автоматически в подсети и удалив параметр из "aws_instance", я мог бы можно сделать так, чтобы terraform не обращал внимания на это значение ... но я в этом сомневаюсь.)


person Todd Lyons    schedule 26.09.2018    source источник


Ответы (1)


Вы можете использовать блок жизненного цикла для игнорировать определенные изменения атрибутов.

Используя это, ресурс изначально создается с использованием предоставленного значения для этого атрибута. При последующем планировании, применении и т. Д. Terraform проигнорирует изменения этого атрибута.

Если мы добавим игнорирование для associate_public_ip_address в блок жизненного цикла, остановленный экземпляр больше не будет запускать новый ресурс.

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

Пример основан на примере кода Terraform aws_instance :

provider "aws" {
  region = "us-west-2"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical account ID
}

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  associate_public_ip_address = "true"
  tags {
    Name = "HelloWorld"
  }

  lifecycle {
    ignore_changes = ["associate_public_ip_address"]
  }
}
person Eric M. Johnson    schedule 26.09.2018
comment
Спасибо! Я видел, как жизненный цикл используется в примерах, но неправильно понял, для чего он нужен. Ваш ответ сработал и укрепил мое понимание этого. - person Todd Lyons; 26.09.2018