I have a RDS mysql instance running
-
在默认VPC中为所有默认子网分配
-
有一个安全组,入站规则设置为侦听所有流量,所有协议,所有端口范围和源0.0.0.0/0
-
Publicly accessible设置为True
我能够从SQl Workbench连接到RDS,也可以从本地python脚本连接到RDS
-In my python lambda function -
- 已使用AWSLambdaVPCAccessExecutionRole,lambda_basic_execution分配角色
2.Lambda未分配给任何VPC
我从lambda "errorMessage": "RequestId: xx Process exited before completing request" 得到以下错误消息
代码在尝试连接到DB get_database_connection()和除了块记录消息 logger.error("ERROR: Unexpected error: Could not connect to MySql instance.") 之外的位置失败
lambda甚至可以连接到默认VPC中的RDS实例吗? lambda未分配给任何VPC
Lambda Code
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")
点击此链接[https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html][1]
3 回答
你需要做的是:
为默认VPC创建2个私有子网
转到控制台中的Lambda函数 .
向下滚动并在左侧选择默认VPC .
是的,您的lambda不在vpc中,因此实例无法联系rds公共实例,请按照此文档为您的lambda函数提供Internet“功能”
https://aws.amazon.com/it/premiumsupport/knowledge-center/internet-access-lambda-function/
有许多文档说VPC中有2个私有子网用于lambda,并且使用NAT网关等连接互联网 .
实际上我可以直接从lambda连接到默认VPC中的RDS(不将其放在私有子网中) . 问题是我在pacakage文件夹中导入了pymysql文件,所以我得到了
该连接超时错误 .
我只需要从pymysql(package.mysql)中输入package in
except Exception as error: 确实骗了我