让terraform忽略”的意思;关联“公共ip地址”;已停止实例的状态

让terraform忽略”的意思;关联“公共ip地址”;已停止实例的状态,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个简单的AWS部署,带有vpc、公共子网、路由和安全组。运行terraformapply将启动一个AWS实例,我已将该实例配置为关联公共IP。创建实例后,我运行TerraformPlan,它正确地表示一切都是最新的。到目前为止没有问题 我们有一个管理节点,如果该实例在一段时间内未使用,它将关闭该实例,以节省成本 问题是:一旦该实例关闭,当我运行terraform plan时,aws提供程序会看到所有配置都正确,但由于公共IP已被释放,associate_public_IP_address的

我有一个简单的AWS部署,带有vpc、公共子网、路由和安全组。运行
terraformapply
将启动一个AWS实例,我已将该实例配置为关联公共IP。创建实例后,我运行
TerraformPlan
,它正确地表示一切都是最新的。到目前为止没有问题

我们有一个管理节点,如果该实例在一段时间内未使用,它将关闭该实例,以节省成本

问题是:一旦该实例关闭,当我运行
terraform plan
时,aws提供程序会看到所有配置都正确,但由于公共IP已被释放,associate_public_IP_address的值不再与terraform配置中配置的值匹配,所以terraform想要删除并重新创建该实例:

关联公共ip地址:“false”=>“true”(强制新资源)

有没有办法让terraform只忽略这一个参数

这个问题与我们的关系不大。但在我的例子中,我不想设置预期的状态,我只想告诉terraform忽略这一个参数,因为它现在没有关联是正常的,只要它被配置为在启动时关联

(我在写这个问题时想到了这一点:我没有尝试过将子网配置为自动关联在其中启动的实例的公共ip。可以想象,通过使子网自动执行此操作,并从“aws_实例”中删除该选项,我也许可以让terraform不注意这个值……但我怀疑。)

你可以使用

使用该属性,资源最初是使用为该属性提供的值创建的。在后续计划、应用等时,Terraform将忽略对该属性的更改

如果我们在lifecycle块中添加一个ignore for
associate_public_ip_address
,停止的实例将不再触发新资源

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

基于以下内容的示例:


谢谢我在示例中看到了生命周期,但误解了它的用途。你的回答起了作用,使我更加了解它。
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"]
  }
}