【问题标题】:Get VPC id from another terraform project从另一个 terraform 项目获取 VPC id
【发布时间】: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) 是否用于此目的?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    通常您可以使用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
    

    【讨论】:

    • 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

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2019-02-04
      • 2020-06-22
      • 2018-11-12
      • 2017-09-21
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2020-04-08
      相关资源
      最近更新 更多