通过AWS-lambda函数访问在EC2实例中运行的数据库

时间:2019-07-16 16:09:42

标签: postgresql amazon-web-services amazon-s3 aws-lambda amazon-vpc

我在python3.6中编写了lambda函数,以访问在 EC2 实例中运行的 postgresql 数据库。

       psycopg2.connect(user="<USER NAME>",
                        password="<PASSWORD>",
                        host="<EC2 IP Address>",
                        port="<PORT NUMBER>",
                        database="<DATABASE NAME>")

创建了具有必需依赖项的部署程序包,并将其作为zip文件上传到AWS lambda。要构建依赖项,我遵循了THIS参考指南。

,并且还将虚拟私有云(VPC)配置为默认值,并且还包含Ec2实例详细信息,但我无法从数据库获得连接。尝试从lambda连接数据库时导致超时。

enter image description here

Lambda函数:

from __future__ import print_function
import json
import ast,datetime
import psycopg2


def lambda_handler(event, context):
    received_event = json.dumps(event, indent=2)
    load = ast.literal_eval(received_event)

    try:
        connection = psycopg2.connect(user="<USER NAME>",
                                        password="<PASSWORD>",
                                        host="<EC2 IP Address>",
                                        # host="localhost",
                                        port="<PORT NUMBER>",
                                        database="<DATABASE NAME>")

        cursor = connection.cursor()
        postgreSQL_select_Query = "select * from test_table limit 10"
        cursor.execute(postgreSQL_select_Query)
        print("Selecting rows from mobile table using cursor.fetchall")
        mobile_records = cursor.fetchall() 

        print("Print each row and it's columns values")
        for row in mobile_records:
            print("Id = ", row[0], )

    except (Exception,) as error :
        print ("Error while fetching data from PostgreSQL", error)
    finally:
        #closing database connection.
        if(connection):
            cursor.close()
            connection.close()
            print("PostgreSQL connection is closed")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!'),
        'dt' : str(datetime.datetime.now())
    }

我在Google上搜索了很多,但是我找不到任何解决方法。有没有办法满足这一要求?

2 个答案:

答案 0 :(得分:0)

为使lambda连接到VPC内的任何资源,它需要将ENI设置到VPC的相关专用子网。您是否已正确设置EC2的VPC关联和安全组? 您可以参考https://docs.aws.amazon.com/lambda/latest/dg/vpc.html

答案 1 :(得分:0)

您的配置必须为:

  • VPC中的数据库
  • Lambda函数配置为使用与数据库相同的VPC
  • 关于Lambda函数(Lambda-SG)的安全组
  • 数据库(DB-SG上的安全组,允许来自相关数据库端口上的Lambda-SG的入站连接

也就是说,DB-SG是指Lambda-SG