【问题标题】:Share RDS instance with another VPC, but no other resources?与另一个 VPC 共享 RDS 实例,但没有其他资源?
【发布时间】:2023-03-28 12:29:01
【问题描述】:

我使用 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 实例。

我想要达到的目标:

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

我认为这需要 VPC 对等互连?

如何在 Terraform 中实现这一点?


相关但不是 Terraform:

【问题讨论】:

    标签: amazon-web-services terraform amazon-vpc terraform-provider-aws aws-vpc-peering


    【解决方案1】:

    你应该可以这样设置:

    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 在 cmets 中正确指出的那样,如果底层主机无法恢复,RDS 集群的私有 IP 地址可能会在故障转移时发生变化。

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

    【讨论】:

    • 我认为 RDS IP 地址不会在服务器故障转移或其他情况下保持静态。我会为数据库集群使用专用子网,并通过对等连接配置到这些子网 CIDR 块的路由。
    • 谢谢@MarkB - 这是我没有想到的一个有效点,我会将它和你的建议添加到答案中。
    猜你喜欢
    • 2019-05-12
    • 2010-12-02
    • 2011-08-17
    • 2017-05-06
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多