我有一个带有vpc、公共子网、路由和安全组的简单AWS部署。运行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不注意到我怀疑它的value...but。)
发布于 2018-09-26 10:20:17
使用它,资源最初是使用为该属性提供的值创建的。在随后的计划、应用等时,Terraform将忽略对该属性的更改。
如果我们在生命周期块中添加一个忽略的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"]
}
}
https://stackoverflow.com/questions/52519463
复制