从另一个 terraform 项目获取 VPC id
Posted
技术标签:
【中文标题】从另一个 terraform 项目获取 VPC id【英文标题】:Get VPC id from another terraform project 【发布时间】:2021-07-01 03:27:46 【问题描述】:我有一个 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"
在另一个 terraform 项目中设置 EKS 集群,我需要提取 vpc_id
和 public_subnets
以用于配置集群。
如何在没有硬编码的情况下动态获取高于 variable 的值?
这份文件 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) 是否用于此目的?
【问题讨论】:
【参考方案1】:通常您可以使用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
【讨论】:
Tks 我可以得到这些输出,但是如何将这些变量动态传递到 terraform 项目中我使用这个 VPC 设置了 EKS 集群。 @ThoQuach 这取决于您的设置。使用-var 参数传递它们。 您的意思是我们在应用时通过命令行,对吗?所以代码仍然没有改变,我们可以重用。 @ThoQuach 是的,你可以这样做。因此,在您的自动脚本中,您可以从一个 terraform 模块/脚本获取输出,并将它们作为输入传递给下一个。【参考方案2】:我通常在 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 id的主要内容,如果未能解决你的问题,请参考以下文章