使用动态块作为安全组入口规则的 Terraform 问题
Posted
技术标签:
【中文标题】使用动态块作为安全组入口规则的 Terraform 问题【英文标题】:Terraform issue with using dynamic block for ingress rules on security group 【发布时间】:2021-07-08 13:05:24 【问题描述】:我基本上是在尝试创建一个规则,以允许来自 ip 地址 x.x.x.x/32(其中 x.x.x.x 是真实 IP 地址)的 ssh、rdp 和 http 流量。
这是我的 tf 文件
resource "aws_security_group" "allow_internet"
name = "allow_internet"
description = "allow_internet_from_my_connection"
vpc_id = aws_vpc.dee_vpc.id
dynamic "ingress"
for_each = var.sg_protocols
iterator = protocol
content
from_port = 0
to_port = 0
protocol = protocol.value
cidr_blocks = ["x.x.x.x/32"]
这是我的变量
variable "sg_protocols"
type = list(string)
description = "list of ingress ports"
default = ["rdp", "ssh", "rdp"]
我收到以下错误
λ terraform plan
Error: Invalid number literal
on securitygroup.tf line 14, in resource "aws_security_group" "allow_internet":
14: cidr_blocks = [x.x.x.x/32]
Failed to recognize the value of this number literal.
【问题讨论】:
修正默认 = ["rdp", "ssh", "http"] 【参考方案1】:这是错误的用法:
to_port from_port 协议具体用法可以参考https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group。
如果你想使用动态块,你需要创建一个更复杂的对象来保存上面提到的 3 个参数的值。
而且动态块的语法也不正确。
试试这个:
resource "aws_security_group" "allow_internet"
name = "allow_internet"
description = "allow_internet_from_my_connection"
vpc_id = aws_vpc.test_vpc.id
dynamic "ingress"
for_each = var.sg_protocols
content
from_port = ingress.value["from_port"]
to_port = ingress.value["to_port"]
protocol = ingress.value["protocol"]
cidr_blocks = ["10.10.10.10/32"]
variable "sg_protocols"
type = list(object(
from_port = number
to_port = number
protocol = string
))
default = [
from_port = 80
to_port = 80
protocol = "tcp"
,
from_port = 22
to_port = 22
protocol = "tcp"
]
【讨论】:
谢谢@nyxx88,这对我来说更有意义了 或者你可以只使用type = any
(而不是定义对象)以上是关于使用动态块作为安全组入口规则的 Terraform 问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Terraform (AWS) 将安全组添加到另一个安全组的入站规则作为源