如何在 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
加载中...
5 票,平均:1.00 / 15
8,178
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

隐藏@基础设施工程师

这一切都始于一次非常有趣的采访。
大阪系统解决方案部门的一名职业中期员工。我的
工作是构建和运营服务器和云!
我拥有 LPIC1、AWS SAA 和 OCI 架构师助理资格。

其实我很喜欢拉面,
已经调查过大阪100多家店了(。-∀-)我要努力成为Nibi Beyond

我也在Twitter,所以请关注我(´∇`)
点击右上角的Twitter标记! !