从另一个 terraform 项目获取 VPC id

Get VPC id from another terraform project

我有一个 terraform 项目,它为一个区域设置了一个 VPC,以供该区域中的所有 EKS 集群使用。 运行 terraform apply 成功后,我有这些输出:

Outputs:

all_worker_mgmt_id = "sg-09992bfxxxx13b782"
azs = tolist([
  "us-east-2a",
  "us-east-2b",
  "us-east-2c",
])
public_subnets = [
  "subnet-03ac0xxxxe533b510",
  "subnet-0f91a04168xxxx9c7",
  "subnet-0xxxxcd5cfcaa938c",
]
vpc_cidr_block = "192.168.0.0/16"
vpc_id = "vpc-07e4xxxxxxxx6f616"

在另一个设置 EKS 集群的 terraform 项目中,我需要提取 vpc_idpublic_subnets 以用于配置集群。

如何在配置中不进行硬编码的情况下动态获取上述变量的值?

这份文件 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) 是否用于此目的?

通常您可以使用 outputsjq 来获得输出值:

terraform output -json | jq -r '.vpc_id.value'
terraform output -json | jq -rc '.public_subnets.value'

或更简单:

terraform output vpc_id
terraform output public_subnets

我通常在 terraform 中将资源分开,并使用 data 获取已创建的资源,手动或与其他 terraform 项目一起创建。

locals {
  environment = "test"
}

data "aws_vpc" "vpc" {
  filter {
    name = "tag:Name"
    values = [local.environment]
  }
}

data "aws_subnet_ids" "private_subnets" {
  vpc_id = data.aws_vpc.vpc.id

  filter {
    name = "tag:Name"
    values = ["${local.environment}-private-*"]
  }
}

data "aws_subnet_ids" "public_subnets" {
  vpc_id = data.aws_vpc.vpc.id

  filter {
    name = "tag:Name"
    values = ["${local.environment}-public-*"]
  }
}

当您需要获得一个 publicprivate 子网时,使用排序:

resource "aws_instance" "gitlab" {
  ...
  subnet_id = sort(data.aws_subnet_ids.public_subnets.ids)[0]
  ...
}

如果您使用 terraform vpc module

,以上代码将完美运行

或者,如果你想拥有一个同时管理所有资源的工具,你可以使用Terragrunt