无法公开 AWS Aurora Postgres RDS

Posted

技术标签:

【中文标题】无法公开 AWS Aurora Postgres RDS【英文标题】:Can't make AWS Aurora Postgres RDS publicly available 【发布时间】:2021-12-28 19:34:55 【问题描述】:

我正在尝试启动一个 Aurora Postgres 集群,但我似乎无法通过 Internet 提供它。我正在使用 Terraform 对基础架构进行编码。

我创建了一个安全组以允许外部访问,并且它附加到集群使用的 VPC 子网。不过,我似乎无法从本地机器访问端点。

我不知道我错过了什么。

module "vpc" 
  source  = "terraform-aws-modules/vpc/aws"
  version = ">=3.11.0"

  name = "vpc-auroradb-$var.environment"
  cidr = var.vpc_cidr_block

  azs              = var.availability_zones
  private_subnets  = var.vpc_private_subnets
  public_subnets   = var.vpc_public_subnets
  database_subnets = var.vpc_database_subnets

  enable_nat_gateway   = true
  enable_dns_hostnames = true
  enable_dns_support   = true
  create_igw           = true
  create_database_internet_gateway_route = true
  create_database_nat_gateway_route = true
  create_database_subnet_group = true
  create_database_subnet_route_table = true


module "aurora_cluster" 
  source  = "terraform-aws-modules/rds-aurora/aws"
  version = ">=6.1.3"

  name           = "bambi-$var.environment"
  engine         = "aurora-postgresql"
  engine_version = "12.8"
  instance_class = "db.t4g.large"
  publicly_accessible = true
  instances = 
    1 = 
        identifier = "bambi-1"
    
    2 = 
      identifier = "bambi-2"
    
  

  autoscaling_enabled      = true
  autoscaling_min_capacity = 2
  autoscaling_max_capacity = 3

  vpc_id                 = module.vpc.vpc_id
  db_subnet_group_name   = module.vpc.database_subnet_group_name
  create_db_subnet_group = false
  create_security_group = false

  iam_database_authentication_enabled = true

  storage_encrypted   = true
  apply_immediately   = true
  monitoring_interval = 30

  db_parameter_group_name         = aws_db_parameter_group.parameter_group.id
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.parameter_group.id

  vpc_security_group_ids = [aws_security_group.sg_public.id]

  enabled_cloudwatch_logs_exports = ["postgresql"]


resource "aws_security_group" "sg_public" 
  vpc_id = module.vpc.vpc_id

  ingress 
    from_port   = 5432
    to_port     = 5432
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # Allowing traffic in from all sources
  

  egress 
    from_port   = 0             # Allowing any incoming port
    to_port     = 0             # Allowing any outgoing port
    protocol    = "-1"          # Allowing any outgoing protocol 
    cidr_blocks = ["0.0.0.0/0"] # Allowing traffic out to all IP addresses
  

【问题讨论】:

您得到的确切错误是什么?网络超时?你的地形对我来说看起来是正确的。您可能想要登录 AWS Web 控制台并仔细检查 Aurora 实例是否正在运行,并且公共可访问性功能已实际启用。我认为您可能会遇到问题,因为您同时启用了create_database_nat_gateway_routecreate_database_internet_gateway_route。这些设置相互冲突。您应该禁用数据库 NAT 网关路由。 感谢指点!事实上,正如您所提到的以及下面详述的 Ervin,我确实在我的 VPC 模块上启用了两个相互冲突的设置。谢谢! 【参考方案1】:

从使用的 VPC 模块的documentation 中,为了对数据库具有公共访问权限,您需要以下内容:

create_database_subnet_group           = true
create_database_subnet_route_table     = true
create_database_internet_gateway_route = true

enable_dns_hostnames = true
enable_dns_support   = true

create_database_nat_gateway_route 不应该是真的。如果我们看一下github上的模块代码:

resource "aws_route" "database_internet_gateway" 
  count = var.create_vpc && var.create_igw && var.create_database_subnet_route_table && length(var.database_subnets) > 0 && var.create_database_internet_gateway_route && false == var.create_database_nat_gateway_route ? 1 : 0

  route_table_id         = aws_route_table.database[0].id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.this[0].id

  timeouts 
    create = "5m"
  

我们可以看到互联网网关路由的count 将是0。这意味着不会为数据库子网创建允许公共 Internet 访问的路由。

另一方面,将create_database_internet_gateway_route 设置为true 也会阻止通过 NAT 网关的访问,因为路由表不会有正确的路由。

resource "aws_route" "database_nat_gateway" 
  count = var.create_vpc && var.create_database_subnet_route_table && length(var.database_subnets) > 0 && false == var.create_database_internet_gateway_route && var.create_database_nat_gateway_route && var.enable_nat_gateway ? var.single_nat_gateway ? 1 : length(var.database_subnets) : 0

  route_table_id         = element(aws_route_table.database.*.id, count.index)
  destination_cidr_block = "0.0.0.0/0"
  nat_gateway_id         = element(aws_nat_gateway.this.*.id, count.index)

  timeouts 
    create = "5m"
  

基本上你通过将两个变量都设置为 true 来阻止所有流量。

【讨论】:

非常感谢您的详细解答!你是绝对正确的。它现在正在工作。

以上是关于无法公开 AWS Aurora Postgres RDS的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 AWS S3 复制到 Aurora Postgres

Amazon Aurora Postgres 是不是支持 lambda 调用?

Lambda 在本地连接到 Aurora MySql - 部署到 AWS 时超时

“TRUNCATE”处或附近的语法错误 - Aurora Postgres 10.12

连接到 Aurora AWS 无服务器

AWS Aurora MySQL 无服务器:如何从 MySQL Workbench 连接