使用 Terraform 在单个安全组中创建多个 CIDR 块

57次阅读
没有评论

问题描述

在使用 Terraform 时面临一个问题,他希望创建一个单独的安全组,该安全组允许来自存储在变量中的所有私有子网的端口27017上的mongo流量通过。他的问题在于,他不确定如何实现这一点,因为他只想要一个安全组,但是foreach却会创建多个安全组,至少在之前对于子网是这样的。
以下是他提供的变量和安全组资源的代码片段:

变量:

variable "subnet_numbers_private" {
  description = "Useless info"
  default = {
    "us-east-1a" = 1
    "us-east-1b" = 2
    "us-east-1c" = 3
  }
}

安全组资源:

resource "aws_security_group" "mongo" {
  for_each = var.subnet_numbers_private
  name        = "Mongo"
  description = "Allow mongo traffic"
  vpc_id      = aws_vpc.Main_VPC.id

  ingress {
    from_port   = 27017
    to_port     = 27017
    protocol    = "tcp"
    cidr_blocks = [cidrsubnet(aws_vpc.Main_VPC.cidr_block, 8, each.value)]
  }

  tags = {
    Name = "Mongo-${each.key}"
  }
}

他目前遇到的问题是,这个代码片段提供了一个错误,他不太了解 Terraform 0.12,所以无法很好地理解错误的含义。

解决方案

经过一番探索,用户找到了解决方案,幸运的是他在以下 Terraform 0.12 博客文章中找到了有关 foreach 的示例链接,帮助他理解问题所在。

步骤

请注意以下操作可能因 Terraform 版本差异而略有不同,建议你使用适合的版本。

方案

这是用户最终解决问题的安全组配置:

resource "aws_security_group" "mongo" {
  name        = "Mongo"
  description = "Allow mongo traffic"
  vpc_id      = aws_vpc.Main_VPC.id

  ingress {
    from_port   = 27017
    to_port     = 27017
    protocol    = "tcp"
    cidr_blocks = [
      for num in var.private_subnet_numbers:
      cidrsubnet(aws_vpc.Main_VPC.cidr_block, 8, num)
    ]
  }

  tags = {
    Name = "Mongo"
  }
}

在上述代码中,他通过使用 for 循环来动态生成 cidr_blocks 列表。他遍历了名为 private_subnet_numbers 的变量中的每个值,并将每个值传递给 cidrsubnet 函数,以生成对应的 CIDR 块。

此外,他还提供了一个有关 foreach 的博客文章链接,帮助其他人理解如何在 Terraform 0.12 中使用此功能。

博客文章链接: https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/

通过这些调整,用户成功地解决了在单个安全组中创建多个 CIDR 块的问题。

请注意,在实际操作中,可能需要根据具体需求进行一些调整,以适应不同的情况和版本变化。

正文完