terraform - 如果 ec2 实例已存在,则不要创建它

问题描述 投票:0回答:1

所以我在 terraform 中遇到了一个场景,其中要求检查 AWS 中是否已存在资源(比如 ec2),如果存在则不要创建它。 现在我明白,如果第一次使用 terraform 创建 ec2“foobar”,然后如果我们尝试再次创建它,那么 terraform apply 会说没有对基础设施进行新的更改。但是,如果资源“foobar”已经手动或通过任何其他工具创建,那么 terraform 如何处理这种情况下的场景。

我知道 terraform 中的

data
块用于检索现有信息,我尝试写这样的东西

data "aws_instance" "foobar"{
    filter {
        tags   = "name"
        values = ["foobar"]
  }
    most_recent = true
}

但这不起作用,有什么更好的方法来处理这种情况

amazon-web-services terraform
1个回答
0
投票

使用 Terraform 的外部数据源运行脚本来检查 EC2 实例是否存在。脚本可以返回一个值来指示实例是否存在,您可以在 count 属性中使用该值来有条件地创建实例。例如

data "external" "instance_check" {
  program = ["python", "${path.module}/check_instance.py"]
  query = {
    instance_name = "foobar"
  }
}

resource "aws_instance" "foobar" {
  count = data.external.instance_check.result["exists"] == "false" ? 1 : 0
  # ... other configuration ...
}


或者,您可以使用数据源尝试获取资源和确定是否应创建资源的本地值。我认为如果资源不在状态中,此方法不会阻止 Terraform 尝试创建资源,但它对于信息目的很有用。所以我确信只有当 EC2 实例被适当标记并且数据源能够找到它时,这种方法才有效。

data "aws_instance" "foobar" {
  filter {
    name   = "tag:Name"
    values = ["foobar"]
  }
  most_recent = true
}

locals {
  create_instance = length(data.aws_instance.foobar.ids) == 0
}

resource "aws_instance" "foobar" {
  count = local.create_instance ? 1 : 0
  # ... other configuration ...
}


© www.soinside.com 2019 - 2024. All rights reserved.