所以我在 terraform 中遇到了一个场景,其中要求检查 AWS 中是否已存在资源(比如 ec2),如果存在则不要创建它。 现在我明白,如果第一次使用 terraform 创建 ec2“foobar”,然后如果我们尝试再次创建它,那么 terraform apply 会说没有对基础设施进行新的更改。但是,如果资源“foobar”已经手动或通过任何其他工具创建,那么 terraform 如何处理这种情况下的场景。
我知道 terraform 中的
data
块用于检索现有信息,我尝试写这样的东西
data "aws_instance" "foobar"{
filter {
tags = "name"
values = ["foobar"]
}
most_recent = true
}
但这不起作用,有什么更好的方法来处理这种情况
使用 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 ...
}