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 对等连接之间授权安全组的主要内容,如果未能解决你的问题,请参考以下文章

京东云VPC对等连接(VPC Peering)

如何在带有 Terraform 的 AWS VPC 中的两个子网之间进行路由?

Terraform 路由表强制每次应用新资源

如何使用 terraform 连接不同 VPC 中的副本 Postgres RDS 及其源?

如何通过对等 VPC 连接访问站点到站点 *** 连接后面的主机

为啥我无法在对等互连后从另一个 VPC 中的 EC2 实例连接 AWS RDS 实例