Terraform - 在 VPC 对等连接之间授权安全组
Posted
技术标签:
【中文标题】Terraform - 在 VPC 对等连接之间授权安全组【英文标题】:Terraform - Authorizing Security Groups Between VPC Peering Connection 【发布时间】:2020-08-27 13:18:58 【问题描述】:我在 AWS 上运行,我有 VPC-A 和 VPC-B 我在两个 VPC 之间有一个 VPC 对等
我想允许从 VPC-B 中的 SecurityGroupB 到 VPC-A 中的 SecurityGroupA 的流量
到目前为止,我使用 ruby 客户端通过以下调用完成了此操作
security_group_a.authorize_ingress(
ip_permissions: [
from_port: "-1",
ip_protocol: "-1",
to_port: "-1",
user_id_group_pairs: [
description: "Accept all traffic from SecurityGroupB",
group_id: security_group_b.id,
vpc_id: vpc_b.id,
vpc_peering_connection_id: peering_connection_id,
,
],
,
]
)
我查看了 terraform 的 aws_security_group_rule,但找不到与上述设置等效的内容。
当我尝试将安全组 B 放入安全组 A 的入口时,我收到以下错误:
Error: Error authorizing security group rule type ingress: InvalidGroup.NotFound: You have specified two resources that belong to different networks
我在这里做错了什么?假设我设置了对等连接,如何创建规则以允许来自 VPC B 上的安全组的流量进入 VPC A 上的安全组?
【问题讨论】:
【参考方案1】:如果满足以下条件,安全组规则可以引用对等 VPC 中的安全组:
-
VPC 必须在同一地区
对等连接必须处于活动状态
如果对等 VPC 在另一个账户中,则引用必须包含帐号作为前缀。例如,
123456789012/sg-1a2b3c4d
。
只要满足这些条件,你应该没有问题。
以下是 Terraform 资源外观的示例:
resource "aws_security_group_rule" "example"
type = "ingress"
from_port = 0
to_port = 65535
protocol = "tcp"
security_group_id = "sg-123456"
source_security_group_id = "sg-789012"
【讨论】:
有点吹毛求疵,但第三个选项很模糊。如果您省略它,那么 AWS API 会将其解析为正确的账户 ID 并附加它。然后这会创建一个差异,因为 Terraform 将希望将123456789012/sg-1a2b3c4d
更改回 sg-1a2b3c4d
,因为它不知道这种修改。我怀疑如果您不幸在不同账户中的对等 VPC 中获得相同的多个安全组 ID,那么会发生一些不好的事情,因为我不认为安全组 ID 是全球唯一的,并且仅在账户范围内唯一。跨度>
这是令人惊讶的行为,我总是建议人们将帐户 ID 指定为前缀,即使您不介意它创建的 Terraform 差异(或不使用 Terraform)。此外,通过链接到有关 VPC 对等互连和安全组的文档,答案可能会得到改进。【参考方案2】:
所以@Ben Whaley 的回答是在入口规则中指定来自另一个 VPC 的安全组方面是正确的。
关于我收到的错误
Error: Error authorizing security group rule type ingress: InvalidGroup.NotFound: You have specified two resources that belong to different networks
原因是我必须在将安全组添加到入口规则之前添加对 vpc 对等连接的依赖项:
resource "aws_security_group_rule" "vpc_a_to_vpc_b"
security_group_id = var.vpc_a_security_group_id
description = "Allow vpc_b to communicate with vpc_a"
type = "ingress"
from_port = 0
to_port = 0
protocol = "-1"
source_security_group_id = aws_security_group.vpc_b.id
depends_on = [aws_vpc_peering_connection.vpc_a_to_vpc_b]
depends_on
与众不同
【讨论】:
以上是关于Terraform - 在 VPC 对等连接之间授权安全组的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有 Terraform 的 AWS VPC 中的两个子网之间进行路由?
如何使用 terraform 连接不同 VPC 中的副本 Postgres RDS 及其源?