2. AWS数据平台账号与网络规划

数据仓库不是一台孤立的数据库实例,而是一组需要长期运行、持续接入数据、被多个团队查询和治理的资源集合。如果一开始就把所有服务堆在同一个 AWS 账号、同一个 VPC、同一个大网段里,后面会遇到三个典型问题:权限边界模糊、网络爆炸半径过大、成本与配额无法按团队归集。因此本章的目标不是“把网络连通”,而是为数据仓库搭建一套可隔离、可审计、可扩展的基础环境。

一、多账号策略:先划边界,再谈连通

AWS 多账号的核心价值在于把“管理边界”和“故障边界”分开。对数据平台而言,推荐至少划分四类账号:管理账号(Organizations 根、SCP、账单)、共享服务账号(集中日志、镜像仓库、CI/CD 角色)、数据生产账号(Kinesis、DMS、Glue 抽取任务)、数据仓库账号(Redshift、Lake Formation、Athena、S3 数据湖)。如果存在多个业务域,可在数据生产账号下按业务再拆分子账号,但数据仓库账号通常保持集中,避免形成多个“小仓库”。

账号之间不靠 VPC Peering 全互联,而是通过 Transit Gateway 或 VPC 共享 建立受控连接。跨账号访问 S3、Glue Catalog、Redshift 时,优先使用 IAM Role + 资源策略,而不是长期 Access Key。一个常见的落地做法是:在数据仓库账号中创建 DataWarehouseReader、DataWarehouseETL、DataWarehouseAdmin 三个角色,生产账号通过 sts:AssumeRole 扮演对应角色,权限由 SCP 和 IAM Policy 双重约束。

SCP 只做“最大权限上限”,不直接授予权限。例如在数据生产账号上禁止 redshift:CreateCluster,即使 IAM 允许也无法创建,从而保证仓库资源只出现在仓库账号。

二、VPC 设计与子网划分:按“角色”而不是按“数量”切分

数据仓库 VPC 建议使用 10.20.0.0/16 这类独立私网段,避免与本地 IDC 或其他 VPC 冲突。子网划分不要平均切成几块,而应按“资源角色”划分,并预留足够增长空间。以下是一个可直接参考的示例规划(属于教学示例,实际需结合账号数量和 AZ 调整):

子网名称CIDR可用区承载资源路由
dw-private-a10.20.10.0/24ap-southeast-1aRedshift 集群、Glue ENINAT GW
dw-private-b10.20.11.0/24ap-southeast-1bRedshift 集群、Glue ENINAT GW
dw-endpoint-a10.20.20.0/24ap-southeast-1aVPC Endpoint(S3、Glue、KMS)本地
dw-endpoint-b10.20.21.0/24ap-southeast-1bVPC Endpoint(S3、Glue、KMS)本地
dw-public-a10.20.30.0/24ap-southeast-1aNAT Gateway、堡垒机IGW

关键点有三条。第一,Redshift 和 Glue 必须放在私有子网,且至少跨两个可用区,保证 AZ 故障时仍可访问。第二,S3、Glue、KMS、Secrets Manager 等高频服务应通过 Gateway Endpoint 或 Interface Endpoint 访问,避免数据流量绕行 NAT Gateway 产生额外费用和带宽瓶颈。第三,NAT Gateway 只放在一个公共子网即可,但生产环境建议每个 AZ 各放一个,避免单点。

数据仓库 VPC 网络拓扑与流量路径 VPC 10.20.0.0/16 可用区 ap-southeast-1a dw-private-a 10.20.10.0/24 Redshift 集群节点 / Glue ENI dw-endpoint-a 10.20.20.0/24 S3 Gateway Endpoint / Glue / KMS dw-public-a 10.20.30.0/24 NAT Gateway / 堡垒机 Internet Gateway(仅公共子网) 出站:NAT → IGW;入站:仅堡垒机 可用区 ap-southeast-1b dw-private-b 10.20.11.0/24 Redshift 集群节点 / Glue ENI dw-endpoint-b 10.20.21.0/24 S3 Gateway Endpoint / Glue / KMS Transit Gateway 挂载点 连接生产账号 / 共享服务账号 跨账号访问:AssumeRole + 资源策略 不建立全互联 Peering 跨 AZ 复制

三、安全组与网络 ACL:两层过滤,各司其职

安全组是有状态的实例级防火墙,网络 ACL 是无状态的子网级防火墙。数据仓库的典型配置是:安全组只放行必要端口,网络 ACL 作为兜底。以 Redshift 为例,集群端口默认 5439,只允许来自 Glue 安全组和 BI 查询安全组的入站流量;出站默认全放行,但可通过网络 ACL 限制到特定 CIDR。

# 示例:Redshift 安全组入站规则(教学示例)
Type        Protocol  Port   Source
Redshift    TCP       5439   sg-0glueetl(Glue 连接安全组)
Redshift    TCP       5439   sg-0bi-query(BI 查询安全组)
SSH         TCP       22     sg-0bastion(仅堡垒机,用于运维)

# 示例:网络 ACL 入站规则(无状态,需同时配置返回流量)
Rule 100  Allow  TCP  5439  10.20.10.0/24
Rule 110  Allow  TCP  5439  10.20.11.0/24
Rule 200  Allow  TCP  1024-65535  10.20.0.0/16   # 返回流量
Rule *    Deny   All  All  0.0.0.0/0

这里最容易出错的是网络 ACL 的“无状态”特性:如果只放行入站 5439,却没有放行出站的高位端口,返回包会被丢弃,表现为连接超时。因此实际配置时,建议先保持网络 ACL 默认全放行,等安全组规则稳定后,再逐步收紧网络 ACL,并用 VPC Flow Logs 观察是否有拒绝记录。

不要用安全组互相引用时形成循环依赖。例如 Glue 安全组允许来自 Redshift 安全组,Redshift 安全组又允许来自 Glue 安全组,虽然 AWS 允许这种写法,但排障时很难判断方向。建议按“客户端 → 服务端”单向引用。

四、把规划落到可执行的检查项

完成上述设计后,可以用一份简短的检查表确认基础环境是否就绪。以下字段可直接用于评审或交付前自检:

  • 账号边界:数据仓库账号是否独立?SCP 是否禁止在非仓库账号创建 Redshift/Athena 工作组?
  • 网段:VPC CIDR 是否与本地 IDC、其他 VPC 无重叠?是否预留至少一倍增长空间?
  • 子网:Redshift 与 Glue 是否位于两个以上私有子网?是否配置了 S3 Gateway Endpoint?
  • 路由:私有子网默认路由是否指向 NAT Gateway?公共子网是否只承载 NAT 与堡垒机?
  • 安全组:5439 是否只对 Glue 与 BI 安全组开放?是否存在 0.0.0.0/0 的入站规则?
  • 网络 ACL:是否放行了返回流量高位端口?是否已开启 VPC Flow Logs 并投递到共享日志账号?
  • 跨账号:生产账号是否通过 AssumeRole 访问仓库?是否避免使用长期 Access Key?

这套规划的价值在于:当后续接入新的数据源、增加新的查询团队或迁移到多可用区时,不需要重新设计网络,只需在既有子网和安全组中增加规则或挂载点。数据仓库的基础环境一旦稳定,后续的建模、ETL 调度和权限治理才有可靠的落脚点。