无法从AWS Lambda连接到默认VPC中的AWS RDS实例

时间:2018-06-24 17:48:27

标签: mysql amazon-web-services aws-lambda amazon-rds

我正在运行一个RDS mysql实例

  1. 将其在默认VPC中分配给所有默认子网

  2. 具有一个安全组,入站规则集可监听所有流量,所有 协议,      所有端口范围和源0.0.0.0/0

  3. 公开访问设置为True

我能够从SQl Workbench以及本地python脚本连接到RDS

-在我的python lambda函数中     -

  1. 已为AWSLambdaVPCAccessExecutionRole分配了角色,lambda_basic_execution

    2.Lambda未分配给任何VPC

我从lambda收到以下错误消息  “ errorMessage”:“ RequestId:xx进程在完成请求之前已退出”

代码在尝试连接到数据库get_database_connection()时失败,并且在块日志消息中失败。 logger.error(“错误:意外错误:无法连接到MySql实例。”)

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")

关注此链接 [https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html][1]

3 个答案:

答案 0 :(得分:0)

您需要做的是这样

为默认的VPC创建2个专用子网

xxx.xxx.64.0/20
xxx.xxx.128.0/20

在控制台中转到Lambda函数。

向下滚动并在左侧选择默认的VPC。

Select the 2 Private Subnets as your subnets on your lambda function.

答案 1 :(得分:0)

是的,您的Lambda不在vpc中,因此该实例无法联系rds公共实例,请按照此文档为您的lambda函数提供互联网“功能”

https://aws.amazon.com/it/premiumsupport/knowledge-center/internet-access-lambda-function/

答案 2 :(得分:0)

  • 有很多文档说有2个私有子网 在VPC中使用lambda并使用NAT网关进行Internet连接 等。
  • 实际上,我能够直接从默认VPC连接到RDS lambda(不将其放置在专用子网中)。问题是我在pacakage文件夹中导入了pymysql文件,所以我得到了
    该连接超时错误。
  • 我只需要在pymysql(package.mysql)的package中添加前缀
    例外为错误:为我欺骗了