从另一个 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_idpublic_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-*"]
  


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

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

如果您使用terraform vpc module,上述代码将完美运行

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

【讨论】:

以上是关于从另一个 terraform 项目获取 VPC id的主要内容,如果未能解决你的问题,请参考以下文章

Terraform:如何从数据类型中获取元素

Terraform gcp 与共享 vpc、gke

Terraform TGW VPC 附件数据源过滤器

Terraform 和 GCP - 在现有的共享 VPC 和子网中创建新的计算 VM

从另一个 GCP 项目访问 Cloud SQL

Terraform - 在 VPC 对等连接之间授权安全组