从另一个 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_id
和 public_subnets
以用于配置集群。
如何在配置中不进行硬编码的情况下动态获取上述变量的值?
这份文件 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) 是否用于此目的?
通常您可以使用 outputs 和 jq
来获得输出值:
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-*"]
}
}
当您需要获得一个 public
或 private
子网时,使用排序:
resource "aws_instance" "gitlab" {
...
subnet_id = sort(data.aws_subnet_ids.public_subnets.ids)[0]
...
}
如果您使用 terraform vpc module
,以上代码将完美运行
或者,如果你想拥有一个同时管理所有资源的工具,你可以使用Terragrunt
我有一个 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_id
和 public_subnets
以用于配置集群。
如何在配置中不进行硬编码的情况下动态获取上述变量的值?
这份文件 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) 是否用于此目的?
通常您可以使用 outputs 和 jq
来获得输出值:
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-*"]
}
}
当您需要获得一个 public
或 private
子网时,使用排序:
resource "aws_instance" "gitlab" {
...
subnet_id = sort(data.aws_subnet_ids.public_subnets.ids)[0]
...
}
如果您使用 terraform vpc module
,以上代码将完美运行或者,如果你想拥有一个同时管理所有资源的工具,你可以使用Terragrunt