0

我使用 Terraform 创建了两个 VPC:

resource "aws_vpc" "alpha" {
  cidr_block = "10.16.0.0/16"

  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "Alpha"
  }
}

resource "aws_subnet" "alpha_private_a" {
  vpc_id     = aws_vpc.alpha.id
  cidr_block = "10.16.192.0/24"

  availability_zone = "${var.aws_region}a"

  tags = {
    Name = "Alpha Private A"
  }
}

resource "aws_subnet" "alpha_private_b" {
  vpc_id     = aws_vpc.alpha.id
  cidr_block = "10.16.224.0/24"

  availability_zone = "${var.aws_region}b"

  tags = {
    Name = "Alpha Private B"
  }
}

resource "aws_route_table" "alpha_private" {
  vpc_id = aws_vpc.alpha.id

  tags = {
    Name = "Alpha Private"
  }
}

resource "aws_route_table_association" "alpha_private_a" {
  route_table_id = aws_route_table.alpha_private.id
  subnet_id      = aws_subnet.alpha_private_a.id
}

resource "aws_route_table_association" "alpha_private_b" {
  route_table_id = aws_route_table.alpha_private.id
  subnet_id      = aws_subnet.alpha_private_b.id
}

# The same again for VPC "Bravo"

我在 VPC“Alpha”中也有一个 RDS:

resource "aws_db_subnet_group" "alpha_rds" {
  subnet_ids = [ aws_subnet.alpha_private_a.id, aws_subnet.alpha_private_b.id ]

  tags = {
    Name = "Alpha RDS"
  }
}

resource "aws_db_instance" "alpha" {
  identifier            = "alpha"
  allocated_storage     = 20
  max_allocated_storage = 1000
  storage_type          = "gp2"
  engine                = "postgres"
  engine_version        = "11.8"
  publicly_accessible   = false
  db_subnet_group_name  = aws_db_subnet_group.alpha_rds.name

  performance_insights_enabled = true
  vpc_security_group_ids       = [ aws_security_group.alpha_rds.id ]

  lifecycle {
    prevent_destroy = true
  }
}

然后我在 VPC“Bravo”中有一个 Elastic Beanstalk 实例。

我想要达到的目标:

  • alpha_rds我的 Elastic Beanstalk 实例可以在 Bravo VPC 中访问
  • Bravo VPC 无法访问 Alpha VPC 中的任何其他内容
  • Alpha VPC 无法访问 Bravo VPC 中的任何其他内容

我认为 VPC 对等互连是必需的吗?

如何在 Terraform 中实现这一点?


相关但不是 Terraform:

4

1 回答 1

2

您应该能够像这样设置它:

  1. 在 Alpha 和 Bravo 之间创建 VPC 对等连接
  2. 在 Alpha 的路由表中,为 Bravo 的 CIDR 范围添加一个路由,并将目标设置为对等连接 (pcx-XXXXXX) 到 Bravo
  3. 在 Bravo 的路由表中,为数据库的 IP 地址添加一个路由,并将其指向到 Alpha 的对等连接

这种设置保证,Bravo 中的资源只能与 Alpha 中的数据库通信,无法路由到该 VPC 的所有其他数据包。

反之则更难一些——现在这个设置应该阻止从 Alpha 到 Bravo 的 TCP 连接的建立,因为除了数据库之外没有返回路径。UDP 流量仍然可以通过,但它的响应将被丢弃,除非它来自数据库。

此时,您可以在 Bravo 的子网中设置网络访问控制列表,以拒绝来自 Alpha 的流量,但数据库 IP 除外。这取决于你的偏执程度或你对隔离的要求——我个人不会这样做,但现在是星期五下午,我心情很懒;-)。


更新

正如 Mark B 在评论中正确指出的那样,如果无法恢复底层主机,RDS 集群的私有 IP 地址可能会在故障转移时发生变化。

为了解决这些问题,您可以在 Alpha 中为您的数据库节点创建单独的子网,并将我上面描述中的数据库 IP 替换为这些子网的 CIDR。这应该允许稍微更大的灵活性,并允许您解决 NACL 问题,因为您可以只编辑新数据库子网的路由表,并且只在那里添加对等连接。

于 2021-01-29T15:09:05.753 回答