【问题标题】:How to pass a list of different values in terraform如何在terraform中传递不同值的列表
【发布时间】:2021-06-06 14:34:58
【问题描述】:

我是 terraform 的新手,我正在尝试使用 terraform 0.14.2 创建一个 EKS 集群。我正在尝试在现有 VPC 上创建它,并传递子网 ID 和 VPC ID,但我不知道如何将私有子网和公共子网传递给 EKS 集群资源:

resource "aws_eks_cluster" "cluster" {
  enabled_cluster_log_types = []
  name                      = var.cluster_name
  role_arn                  = aws_iam_role.cluster.arn
  version                   = var.eks_version

  vpc_config {
    subnet_ids              = var.priv_subnet_id
    security_group_ids      = []
    endpoint_private_access = "true"
    endpoint_public_access  = "true"
  }
}

我的变量是:

priv_subnet_id = {
    pre = [ "subnet-XXX", "subnet-XXX", "subnet-XXX"]
}

你能指导我最好的方法吗?

谢谢

【问题讨论】:

  • 你还没有解释你的代码有什么问题吗?有任何错误消息吗?

标签: amazon-web-services terraform amazon-eks


【解决方案1】:

你会有一个子网ID列表作为变量真的很奇怪......

大多数情况下,子网是我们创建的资源,如下所示:

resource "aws_subnet" "example1" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

resource "aws_subnet" "example2" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"
}

resource "aws_eks_cluster" "cluster" {
  enabled_cluster_log_types = []
  name                      = var.cluster_name
  role_arn                  = aws_iam_role.cluster.arn
  version                   = var.eks_version

  vpc_config {
    subnet_ids              = [aws_subnet.example1.id, aws_subnet.example2.id]
    security_group_ids      = []
    endpoint_private_access = "true"
    endpoint_public_access  = "true"
  }
}

如果它们是现有资源,那么您想使用数据源获取它们:
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnet_ids

data "aws_subnet_ids" "example" {
  vpc_id = var.vpc_id
}

resource "aws_eks_cluster" "cluster" {
  enabled_cluster_log_types = []
  name                      = var.cluster_name
  role_arn                  = aws_iam_role.cluster.arn
  version                   = var.eks_version

  vpc_config {
    subnet_ids              = data.aws_subnet_ids.example.ids
    security_group_ids      = []
    endpoint_private_access = "true"
    endpoint_public_access  = "true"
  }
}

在非常奇怪的情况下,您必须绝对将它们作为变量...
可能是这样的:

variable "subnet_ids" {
  type    = list(string)
  default = ["subnet-X", "subnet-Y", "subnet-Z"]
}

resource "aws_eks_cluster" "cluster" {
  enabled_cluster_log_types = []
  name                      = var.cluster_name
  role_arn                  = aws_iam_role.cluster.arn
  version                   = var.eks_version

  vpc_config {
    subnet_ids              = var.subnet_ids
    security_group_ids      = []
    endpoint_private_access = "true"
    endpoint_public_access  = "true"
  }
}

【讨论】:

  • Terraform 模块实际上很常见的情况是接受子网 ID 作为变量中的字符串列表,就像在问题中一样。例如:registry.terraform.io/modules/terraform-aws-modules/rds/aws/…
  • @MarkB 那是一个模块...我敢打赌,在使用该模块的地方,ID 不是作为变量接收的,而是作为资源或数据源接收的
猜你喜欢
  • 2021-07-26
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多