无法从 AWS Lambda 连接到默认 VPC 中的 AWS RDS 实例
unable to connect to AWS RDS instance in default VPC from AWS Lambda
我有一个 RDS mysql 实例 运行
它在默认 VPC 中分配给所有默认子网
有一个安全组,入站规则设置为监听所有流量,所有
协议,
所有端口范围和源 0.0.0.0/0
公开访问设置为 True
我能够从 SQl Workbench 以及本地 python 脚本
连接到 RDS
-在我的 python lambda 函数中
-
已为 AWSLambdaVPCAccessExecutionRole 分配角色,lambda_basic_execution
2.Lambda 未分配给任何 VPC
我从 lambda 收到以下错误消息
"errorMessage": "RequestId: xx Process exited before completing request"
代码在尝试连接到 DB get_database_connection() 和 except 块日志消息 logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")[=49 时失败=]
lambda 甚至可以连接到默认 VPC 中的 RDS 实例吗?
lambda 未分配给任何 VPC
Lambda 代码
import sys
import logging
import package.pymysql
import logging
import package.pymysql.cursors
DATABASE_HOST = 'XXX'
DATABASE_USER = 'XXX'
DATABASE_PASSWORD = 'XXX'
DATABASE_DB_NAME = 'XXX'
port = 3306
def get_database_connection():
"Build a database connection"
conn = pymysql.connect(DATABASE_HOST, user=DATABASE_USER,
passwd=DATABASE_PASSWORD, db=DATABASE_DB_NAME, connect_timeout=5)
return conn
try:
conn = get_database_connection()
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def lambda_handler(event, context):
print("Lambda executed")
关注了这个 link
[https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html][1]
你需要做的是:
为默认 VPC 创建 2 个私有子网
xxx.xxx.64.0/20
xxx.xxx.128.0/20
在控制台中转到您的 Lambda 函数。
向下滚动并在左侧 select 默认 VPC。
Select the 2 Private Subnets as your subnets on your lambda function.
是的,您的 lambda 不在 vpc 中,因此实例无法联系 rds public 实例,请按照此文档为您的 lambda 函数提供互联网 "functionality"
https://aws.amazon.com/it/premiumsupport/knowledge-center/internet-access-lambda-function/
- 有很多文档说有 2 个私有子网
在您的 VPC 中使用 lambda 并使用 NAT 网关连接互联网
等..
- 实际上,我可以直接从默认 VPC 连接到 RDS
lambda(不将其放在私有子网中)。问题是我在 pacakage 文件夹中导入了 pymysql 文件,所以我得到
该连接超时错误。
- 我只需要在 pymysql 的包中添加前缀 (package.mysql)
异常异常除外: 对我有用
我有一个 RDS mysql 实例 运行
它在默认 VPC 中分配给所有默认子网
有一个安全组,入站规则设置为监听所有流量,所有 协议, 所有端口范围和源 0.0.0.0/0
公开访问设置为 True
我能够从 SQl Workbench 以及本地 python 脚本
连接到 RDS-在我的 python lambda 函数中 -
已为 AWSLambdaVPCAccessExecutionRole 分配角色,lambda_basic_execution
2.Lambda 未分配给任何 VPC
我从 lambda 收到以下错误消息 "errorMessage": "RequestId: xx Process exited before completing request"
代码在尝试连接到 DB get_database_connection() 和 except 块日志消息 logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")[=49 时失败=]
lambda 甚至可以连接到默认 VPC 中的 RDS 实例吗? lambda 未分配给任何 VPC
Lambda 代码
import sys
import logging
import package.pymysql
import logging
import package.pymysql.cursors
DATABASE_HOST = 'XXX'
DATABASE_USER = 'XXX'
DATABASE_PASSWORD = 'XXX'
DATABASE_DB_NAME = 'XXX'
port = 3306
def get_database_connection():
"Build a database connection"
conn = pymysql.connect(DATABASE_HOST, user=DATABASE_USER,
passwd=DATABASE_PASSWORD, db=DATABASE_DB_NAME, connect_timeout=5)
return conn
try:
conn = get_database_connection()
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def lambda_handler(event, context):
print("Lambda executed")
关注了这个 link [https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html][1]
你需要做的是:
为默认 VPC 创建 2 个私有子网
xxx.xxx.64.0/20
xxx.xxx.128.0/20
在控制台中转到您的 Lambda 函数。
向下滚动并在左侧 select 默认 VPC。
Select the 2 Private Subnets as your subnets on your lambda function.
是的,您的 lambda 不在 vpc 中,因此实例无法联系 rds public 实例,请按照此文档为您的 lambda 函数提供互联网 "functionality"
https://aws.amazon.com/it/premiumsupport/knowledge-center/internet-access-lambda-function/
- 有很多文档说有 2 个私有子网 在您的 VPC 中使用 lambda 并使用 NAT 网关连接互联网 等..
- 实际上,我可以直接从默认 VPC 连接到 RDS
lambda(不将其放在私有子网中)。问题是我在 pacakage 文件夹中导入了 pymysql 文件,所以我得到
该连接超时错误。 - 我只需要在 pymysql 的包中添加前缀 (package.mysql)
异常异常除外: 对我有用