如何在 Terraform 中向安全组添加多个规则

目录

大家好!
我是来自Beyond Inc.大阪办公室的拉面大王Hide。
这是我的第十篇帖子。
上次,我写了如何使用 Google Cloud Load Balancing (GCLB) 全局外部 HTTP(S) 负载均衡器设置 URL 重定向!
最新款和传统款的 URL 重定向设置有所不同,这可能有点复杂,但了解一下很有用,所以如果您感兴趣,请看下面的内容!
● 第一部分:如何使用 GCP 的全局外部 HTTP(S) 负载均衡器(传统类型)设置 URL 重定向
● 第二部分:如何使用 GCP 的全局外部 HTTP(S) 负载均衡器设置 URL 重定向
在 Terraform 中向安全组添加多条规则
通常情况下,创建安全组时,需要手动创建多个入站规则,但您可能也希望在 Terraform 中创建一个具有多个入站规则的安全组,并将其附加到实例等。
我们将介绍创建这些多条规则的两种方法。
最终目标是让它看起来像下图一样!
让我们尽力而为!
设定方法
第一种设置方法是在 aws_security_group 中设置两条入口(入站规则)。
这种方法非常简单易用。
resource "aws_security_group" "test-sg" { name = "test-sg" description = "test-sg" egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
第二种设置方法是设置 aws_security_group_rule。
这种方法不是将入口规则写入 aws_security_group,而是写入 aws_security_group_rule。使用此方法,一个 aws_security_group_rule 资源中只能写入一条规则,因此,如果要写入多条规则,则需要创建一个具有不同资源名称的 aws_security_group_rule 资源(如下所示),并将规则添加到该资源中。
但是,虽然正确使用 aws_security_group_rule 可能很有用,但如果您使用此 aws_security_group_rule 设置规则,请务必在设置之前阅读以下内容!
resource "aws_security_group" test-sg" { name = "test-sg" description = "test-sg" egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } } resource "aws_security_group_rule" test-sg-inbound-http" { type = "ingress" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] security_group_id = aws_security_group.test-sg.id } resource "aws_security_group_rule" test-sg-inbound-https" { type = "ingress" from_port = 443 to_port = 443 protocol = "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 添加它们时,
规则会发生冲突,并且在应用时会被创建和删除,从而导致错误……

“绝对不会出故障!你在说什么?”
我相信肯定有人跟我一样这么想,哈哈,我第一次听说的时候也是这么想的。
如果你也有同感,我会把我实际测试的过程记录下来!
在 main.tf 中应用以下内容。
resource "aws_security_group" "test-sg" { name = "test-sg" description = "test-sg" egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group_rule" "test-sg-inbound-https" { type = "ingress" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] security_group_id = aws_security_group.test-sg.id }
首次应用后,AWS 端将显示以下内容。
端口 80 和 443 的入站规则已成功创建,没有任何问题。
但是,当您第二次应用它时,即使您没有对 main.tf 进行任何更改,它也将被标记为已更改,并且 aws_security_group_rule 中设置的任何内容都将被删除。
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" ~ ingress = [ - { - cidr_blocks = [ - "0.0.0.0/0", ] - description = "" - from_port = 443 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 443 }, - { - cidr_blocks = [ - "0.0.0.0/0", ] - description = "" - from_port = 80 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 80 }, + { + cidr_blocks = [ + "0.0.0.0/0", ] + description = null + from_port = 80 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 80 }, ] name = "test-sg" tags = {} # (7 个未更改的属性已隐藏) } 计划:0 个要添加,1 个要更改,0 个要删除。您是否要执行这些操作?Terraform 将执行上述操作。只有“yes”才能被接受。请输入值:yes
第二次应用后,AWS 屏幕将如下所示。aws_security_group_rule 中设置的部分已消失。
官方的 aws_security_group 资源描述中写道:
换句话说,即使你在 aws_security_group_rule 中进行了设置,它也会被 aws_security_group 中的设置覆盖。如果你在不了解这一点的情况下进行操作,可能会非常危险…….
Terraform 目前提供两种安全组规则资源:一种是独立的安全组规则资源(单个入口或出口规则),另一种是入口和出口规则内联定义的安全组资源。
目前,您不能将带有内联规则的安全组与安全组规则资源结合使用,因为这会导致规则设置冲突并覆盖规则。
● 参考: https
概括
这次,我们介绍了如何使用 Terraform 向安全组添加多条规则。您觉得怎么样?
您可以使用 aws_security_group 和 aws_security_group_rule 定义多个规则,但请注意不要同时设置多个规则,因为这可能会导致严重的错误!
使用哪一个取决于你,但除非有特殊原因,否则我认为使用 aws_security_group 设置多个规则更容易管理,也更不容易引起冲突。
创建安全组时请以此为参考!
5
