从另一个terraform项目获取VPC id

从另一个terraform项目获取VPC id,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个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 =

我有一个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_子网来配置集群

在配置中没有硬代码的情况下,如何动态获取上述变量的值

本文档是否用于此目的?

通常,您可以与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
通常,您可以使用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中分开,并使用数据来获取已经创建的资源,或者与其他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-*"]
  }
}

当需要获取一个公用或专用子网时,请使用排序:

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


或者,如果您想要一个工具同时管理所有资源,您可以使用

我通常将资源在terraform中分开,并使用数据获取已经创建的资源,或者与其他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-*"]
  }
}

当需要获取一个公用或专用子网时,请使用排序:

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


或者,如果您想要一个工具同时管理所有资源,您可以使用

Tks。我可以获得这些输出,但如何将这些变量动态传递到terraform项目中?我设置了一个EKS群集。请使用此VPC。@t这取决于您的设置。使用参数传递它们。你的意思是我们在应用时通过命令行,对吗?所以代码仍然没有改变,我们可以重用。@ThoQuach是的,你可以这样做。因此,在您的自动脚本中,您可以从一个terraform模块/脚本中获取输出,并将其作为输入传递给下一个模块/脚本。Tks我可以获取这些输出,但如何将这些变量动态传递到terraform项目中?我设置了一个EKS群集,使用此VPC。@t这取决于您的设置。使用参数传递它们。你的意思是我们在应用时通过命令行,对吗?所以代码仍然没有改变,我们可以重用。@ThoQuach是的,你可以这样做。因此,在自动脚本中,您可以从一个terraform模块/脚本获取输出,并将其作为输入传递给下一个模块/脚本。