获取地形以忽略已停止实例的“ associate_public_ip_address”状态

时间:2018-09-26 13:55:41

标签: terraform terraform-provider-aws

我有一个简单的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不关注该值...但我对此表示怀疑。)

1 个答案:

答案 0 :(得分:3)

您可以使用lifecycle blockignore certain attribute changes

使用此属性,首先使用该属性提供的值创建资源。根据后续计划,应用等,Terraform将忽略对该属性的更改。

如果我们在生命周期块中为associate_public_ip_address添加忽略,则停止的实例将不再触发新资源。

请注意,如果您更改任何其他需要新实例的参数,则停止的实例将被终止并替换。

基于Terraform aws_instance example code的示例:

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
}

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"]
  }
}