获取 terraform 以忽略已停止实例的“associate_public_ip_address”状态
Posted
技术标签:
【中文标题】获取 terraform 以忽略已停止实例的“associate_public_ip_address”状态【英文标题】:Get terraform to ignore "associate_public_ip_address" status for stopped instance 【发布时间】:2019-03-02 08:01:09 【问题描述】:我有一个简单的 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】:您可以使用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 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"]
【讨论】:
谢谢!我在示例中看到了生命周期,但误解了它的用途。你的回答很有效,巩固了我对它的理解。以上是关于获取 terraform 以忽略已停止实例的“associate_public_ip_address”状态的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 terraform 获取 EBS 驱动器的 UUID 吗?
使用 Terraform 时从实例获取 EC2 Windows 密码
如何使用 Terraform 为 Elastic Beanstalk 中的 EC2 实例设置 EBS 根卷以持久保存