如何通过VPC Endpoint实现VPC-1的Lambda访问VPC-2 EC2内的SQL数据库?
通过VPC Endpoint实现跨VPC Lambda访问EC2 SQL数据库(禁用VPC对等)
要在禁用VPC对等的前提下,让VPC-1的Lambda访问VPC-2 EC2上的SQL数据库,你需要利用VPC Endpoint Service(基于PrivateLink) + Interface VPC Endpoint的组合方案,以下是具体配置步骤:
一、基础设施配置
VPC-2(EC2 SQL数据库所在环境)
- 创建Network Load Balancer(NLB)
- 在VPC-2的子网中部署NLB,监听SQL数据库对应的端口(比如MySQL用3306,SQL Server用1433)
- 创建目标组,将运行SQL的EC2实例添加到目标组,确保NLB能把流量转发到EC2的SQL端口
- 配置VPC Endpoint Service
- 基于刚才创建的NLB创建VPC Endpoint Service,允许指定的AWS账户(即VPC-1所属账户)访问
- 若为同一账户下的资源,可关闭“Require acceptance for endpoint connections”选项,避免手动审批连接请求
- 安全组规则调整
- EC2实例的安全组:允许NLB所在安全组的流量访问SQL端口
- NLB的安全组:允许后续VPC-1中Interface Endpoint所在安全组的流量访问监听端口
VPC-1(Lambda所在环境)
- 创建Interface VPC Endpoint
- 选择VPC-2中创建的VPC Endpoint Service,指定VPC-1内Lambda部署所在的子网
- 配置Endpoint的安全组:允许Lambda所在安全组的流量访问SQL端口
- Lambda网络配置
- 确保Lambda部署在VPC-1的子网中,关联的安全组允许出站访问Interface Endpoint的SQL端口
- 给Lambda的IAM执行角色添加
ec2:DescribeNetworkInterfaces权限(Lambda在VPC内运行需要该权限管理弹性网卡)
二、代码层面配置
- 修改数据库连接字符串
- 替换原来EC2的私有IP为Interface VPC Endpoint的DNS名称(可在AWS控制台的Endpoint详情页获取)
- 端口保持SQL数据库的原有端口
- 示例代码(Python MySQL)
import mysql.connector def lambda_handler(event, context): db_config = { 'user': 'your_db_username', 'password': 'your_db_password', 'host': 'vpce-xxxx-yyyy.vpce-svc-zzzz.us-east-1.vpce.amazonaws.com', # Endpoint的DNS地址 'database': 'your_target_db', 'port': 3306 } conn = None cursor = None try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor() cursor.execute("SELECT COUNT(*) FROM your_table") result = cursor.fetchone() return {"statusCode": 200, "message": "Connection successful", "data": result} except Exception as e: return {"statusCode": 500, "error": f"Database connection failed: {str(e)}"} finally: if cursor: cursor.close() if conn and conn.is_connected(): conn.close()
- 关键注意事项
- 若使用IAM认证的SQL服务(比如部分EC2上的自定义SQL实现了IAM认证),需给Lambda的IAM角色添加对应的数据库访问权限
- 可通过Lambda执行简单的DNS解析测试(比如用Python的
socket.gethostbyname())验证Endpoint的DNS是否能正常解析
内容的提问来源于stack exchange,提问作者Anuj Kadam
相关产品推荐
相关产品推荐

