我有一个简单的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不关注该值...但我对此表示怀疑。)
答案 0 :(得分:3)
您可以使用lifecycle block至ignore 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"]
}
}