获取 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-ecs。已注册的容器实例显示为 0

我可以从 terraform 获取 EBS 驱动器的 UUID 吗?

使用 Terraform 时从实例获取 EC2 Windows 密码

如何使用 Terraform 为 Elastic Beanstalk 中的 EC2 实例设置 EBS 根卷以持久保存

如何从 EB 获取我的 EC2 实例以停止重新安装 java 7?

AS3如何获取URLRequest以设定的间隔重复操作