跨区域VPC Peering:同账号下EU-West-1 Lambda用SQLAlchemy写入US-East-1 RDS
跨区域Lambda访问RDS的剩余配置步骤
1. 确认Lambda的VPC部署与权限
- 必须把Lambda部署到EU-West-1的自定义VPC子网里,不能用Lambda默认的服务网络。去Lambda控制台「配置」→「VPC」页面,选择对应VPC和子网,同时绑定允许出站访问RDS端口(如MySQL的3306、PostgreSQL的5432)的安全组。
- 给Lambda的IAM角色加上
ec2:DescribeNetworkInterfaces、ec2:CreateNetworkInterface、ec2:DeleteNetworkInterface权限——Lambda要在VPC里创建弹性网卡才能联网,没这些权限会直接失败。
2. 验证VPC Peering状态
- 登录AWS控制台,确认跨区域VPC Peering连接的状态是**「已激活」**。同账号跨区域的Peering只要接受请求就会自动激活,但还是要确认下,避免漏操作。
3. 路由表的精准配置
- EU-West-1(Lambda所在VPC)的子网路由表:添加路由规则,目标填US-East-1 RDS所在VPC的CIDR(10.0.0.0/16),下一跳选VPC Peering连接ID。
- US-East-1(RDS所在VPC)的子网路由表:添加路由规则,目标填EU-West-1 Lambda所在VPC的CIDR(172.0.0.0/27),下一跳选VPC Peering连接ID。
- 注意:如果RDS在私有子网,该子网的路由表必须配置这条规则;如果Lambda部署在多个子网,每个子网的路由表都要加。
4. 安全组的精细化设置
- Lambda的安全组(EU-West-1):出站规则允许访问RDS对应端口,目标可以填US-East-1 RDS的安全组ID(格式为
账户ID:安全组ID,比如123456789012:sg-xxxxxx),或者RDS所在VPC的CIDR,用安全组引用更安全。 - RDS的安全组(US-East-1):入站规则允许来自Lambda所在VPC CIDR(172.0.0.0/27)的对应端口访问,同样可以直接引用Lambda的安全组ID(跨区域需要带账户ID)。
5. RDS的网络配置检查
- 把RDS的「公有可访问性」设为**「否」**,用VPC Peering就不需要公网访问,反而能减少风险。
- 确认RDS所在子网属于US-East-1的目标VPC,且该子网的路由表已配置指向Peering的路由。
- 检查VPC的DNS设置:在VPC控制台「编辑DNS属性」,开启「启用DNS解析」和「启用DNS主机名」——不然Lambda可能解析不了RDS的私有DNS端点。
6. SQLAlchemy连接字符串校验
- 必须用RDS的私有端点,不能用公网端点,示例如下:
# MySQL 连接示例 engine = create_engine('mysql+pymysql://用户名:密码@mydb.xxxxxx.us-east-1.rds.amazonaws.com:3306/数据库名') # PostgreSQL 连接示例 engine = create_engine('postgresql://用户名:密码@mydb.xxxxxx.us-east-1.rds.amazonaws.com:5432/数据库名') - 可以在Lambda里加简单的错误捕获,方便排查问题:
try: with engine.connect() as conn: conn.execute(text("INSERT INTO test_table (col1) VALUES ('test')")) conn.commit() except Exception as e: print(f"连接或写入失败: {str(e)}")
7. 开启VPC Peering的DNS解析
- 在VPC Peering连接的配置页面,确认「接受方VPC的DNS解析」和「请求方VPC的DNS解析」都已启用——这是跨区域解析私有DNS的必要设置。
8. 连通性测试
- 如果Lambda还是连不上,先在EU-West-1的VPC里启动一台EC2,用和Lambda相同的安全组,尝试telnet RDS端点的端口(比如
telnet mydb.xxxxxx.us-east-1.rds.amazonaws.com 3306):- 若EC2能连通,问题大概率在Lambda的IAM权限或VPC配置;
- 若EC2也连不通,回到路由表、安全组或Peering配置排查。
内容的提问来源于stack exchange,提问作者Saad
相关产品推荐
相关产品推荐

