如何在 Terraform 中向安全组添加多个规则
你好!
我是Beyond大阪事务所的拉面大王Hide。
这是我的第 10 篇文章。
上次,我写了有关如何使用 Google Cloud Load Balancing (GCLB) 的全球外部 HTTP(S) 负载均衡器配置 URL 重定向的文章!
最新型号和传统型号的 URL 重定向设置有所不同,因此有点困难,但了解一下很有用,所以如果您有兴趣,请看一下以下内容!
● 第 1 部分:如何使用 GCP 的全球外部 HTTP(S) 负载均衡器配置 URL 重定向设置(传统类型)
● 第 2 部分:如何使用 GCP 的全球外部 HTTP(S) 负载均衡器配置 URL 重定向设置
在 Terraform 中向安全组添加多个规则
通常,在创建安全组时,您会手动创建多个入站规则,但在 Terraform 中,您也希望创建一个具有多个入站规则的安全组并将其附加到实例。
我们将介绍两种创建这些多个规则的方法。
最终的目标是让它看起来像下图一样!
让我们尽力而为吧!
设定方法
首先,第一种设置方法是在aws_security_group中设置两个ingress(入站规则)。
这非常简单并且非常容易使用。
资源“aws_security_group”“test-sg”{名称=“test-sg”描述=“test-sg”出口{from_port=0to_port=0协议=“-1”cidr_blocks=[“0.0.0.0/0”]}入口 { from_port = 80 to_port = 80 协议 = "tcp" cidr_blocks = ["0.0.0.0/0"] } 入口 { from_port = 443 to_port = 443 协议 = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
第二种配置方法是配置 aws_security_group_rule。
您可以将其写入 aws_security_group_rule 中,而不是将其写入 aws_security_group 中。使用此方法,您只能在一个 aws_security_group_rule 资源中写入一条规则,因此如果您要写入多条规则,请创建一个具有不同资源名称的 aws_security_group_rule 资源,如下所示,然后这是添加规则的方法。
但是,如果使用得当的话可能会很方便,但是如果您使用此 aws_security_group_rule 来设置规则,请务必在设置之前阅读以下内容!
资源“aws_security_group”test-sg“{名称=“test-sg”描述=“test-sg”出口{from_port = 0 to_port = 0协议=“-1”cidr_blocks = [“0.0.0.0/0”] ipv6_cidr_blocks = ["::/0"] } } 资源 "aws_security_group_rule" "test-sg-inbound-http" { type = "ingress" from_port = 80 to_port = 80 协议 = "tcp" cidr_blocks = [ "0.0.0.0/0" ] security_group_id = aws_security_group.test-sg.id } 资源 "aws_security_group_rule" "test-sg-inbound-https" { type = "ingress" from_port = 443 to_port = 443 协议 = "tcp" cidr_blocks = [ "0.0.0.0/0 "] security_group_id = aws_security_group.test-sg.id }
请勿在 aws_security_group 和 aws_security_group_rule 中同时设置规则
“我在 aws_security_group 中设置了 ingress,但是
我想添加另一个入口,因此使用 aws_security_group_rule 添加它! ”
我是这样想的,并在 aws_security_group 中设置了入口规则,但是如果我将其添加到 aws_security_group_rule 中,
规则会发生冲突,并在应用时创建或删除,从而导致错误...
“这不可能是bug!你在说什么?”
我确信有人有这样的想法,当我第一次了解到它时,我也是完全一样的方式哈哈
对于那些人,我会留下我实际验证过的日志!
在下面的main.tf中应用。
资源“aws_security_group”“test-sg”{名称=“test-sg”描述=“test-sg”出口{from_port=0to_port=0协议=“-1”cidr_blocks=[“0.0.0.0/0”]}入口 { from_port = 80 to_port = 80 协议 = "tcp" cidr_blocks = ["0.0.0.0/0"] } } 资源 "aws_security_group_rule" "test-sg-inbound-https" { type = "ingress" from_port = 443 to_port =第443章 协议=“tcp” cidr_blocks=[“0.0.0.0/0”]
第一个应用在 AWS 端将如下所示。
端口 80 和 443 的入站规则已创建,没有任何问题。
但是,当您第二次应用它时,它会发生更改,并且 aws_security_group_rule 中的设置将被删除,即使 main.tf 没有进行任何更改。
aws_security_group.test-sg:刷新状态... [id=sg-063e7c33de8e1dc09] aws_security_group_rule.test-sg-inbound-https:刷新状态... [id=sgrule-4193634971] aws_instance.test:刷新状态... [ id=i-07125d27a59e1b8f5] Terraform 使用选定的提供程序生成以下执行计划。资源操作用以下符号指示:~就地更新 Terraform 将执行以下操作:# aws_security_group.test-sg 将在- 中更新。地点〜资源“aws_security_group”“test-sg”{id =“sg-063e7c33de8e1dc09”〜入口= [ - { - cidr_blocks = [ - “0.0.0.0/0”,] - 描述=“” - from_port = 443 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - 协议 = "tcp" - security_groups = [] - self = false - to_port = 443 }, - { - cidr_blocks = [ - "0.0.0.0/0", ] - 描述 = "" - from_port = 80 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - 协议 = "tcp" - security_groups = [] - self = false - to_port = 80 }, + { + cidr_blocks = [ + "0.0.0.0/0", ] + 描述 = null + from_port = 80 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + 协议 = "tcp" + security_groups = [] + self = false + to_port = 80 }, ] name = "test-sg" 标签 = {} # (隐藏 7 个未更改的属性) } 计划:0 表示添加,1 表示更改,0 表示销毁 您要执行这些操作吗? Terraform 只会执行上述操作。输入一个值:是
第二次应用后的AWS屏幕如下。 aws_security_group_rule 中设置的部分已消失。 。 。
官方 aws_security_group 资源描述如下:
简而言之,即使您在 aws_security_group_rule 中设置,它也会被 aws_security_group 中设置的内容覆盖。如果你在不知情的情况下操作它,那可能会很可怕......
Terraform 目前提供独立的安全组规则资源(单个入口或出口规则)和包含内联定义的入口和出口规则的安全组资源。
具有内联规则的安全组当前无法与安全组规则资源结合使用。这样做会导致规则配置冲突并覆盖规则。
● 参考: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
概括
这次我介绍了如何使用Terraform向安全组添加多个规则,您觉得怎么样?
您可以使用 aws_security_group 和 aws_security_group_rule 定义多个规则,但请注意不要同时设置规则,否则最终可能会犯下可怕的错误!
我将由您决定使用哪一个,但除非有特殊原因,否则我认为通过在 aws_security_group 中设置多个规则更容易管理和避免冲突。
请在创建安全组时参考!