问题描述
在使用 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 块的问题。
请注意,在实际操作中,可能需要根据具体需求进行一些调整,以适应不同的情况和版本变化。