我使用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"
我也有一个RDS在VPC "Alpha":
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
可以访问Bravo VPC内的Elastic Beanstalk实例- Alpha VPC内的任何东西都不能被Bravo VPC访问
- Bravo VPC内的任何东西都不能被Alpha VPC访问
我认为这需要VPC对等连接?
如何在Terraform中实现这一点?
相关但非Terraform:
- 从其他VPC访问私有RDS数据库
- AWS Fargate连接到不同VPC中的RDS
您应该能够像这样设置它:
- 创建Alpha和Bravo之间的VPC对等连接
- 在Alpha的路由表中为Bravo的CIDR范围添加一条路由,并将目的地设置为到Bravo的对等连接(pcx-XXXXXX)
- 在Bravo的路由表中为数据库的ip地址添加一条路由,并将其指向到Alpha的对等连接
这个设置保证了Bravo中的资源只能与Alpha中的数据库通信,其他每个数据包都不能路由到该VPC。
相反的是有点困难-现在这个设置应该阻止从Alpha到Bravo的TCP连接正在建立,因为除了数据库之外没有返回路径。UDP流量仍然可以通过,但它的响应将被丢弃,除非它来自数据库。
此时,您可以在Bravo的子网中设置网络访问控制列表,以拒绝来自Alpha的流量,除了数据库ip。这取决于你的偏执程度或你对隔离的要求——就我个人而言,我不会这样做,但现在是周五下午,我心情很懒;-)。
更新正如Mark B在评论中正确指出的那样,如果底层主机无法恢复,那么RDS集群的私有IP地址可能会在故障转移时更改。
为了解决这些问题,您可以在Alpha中为数据库节点创建单独的子网,并用这些子网的cidr替换我上面描述中的数据库ip。这应该允许更大的灵活性,并允许您绕过NACL问题,因为您可以只编辑新数据库子网的路由表,并只在那里添加对等连接。