将 psycopg2 库导入 AWS Lambda 到以与你的 Postgre 数据库进行交互 SQL - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 psycopg2 库导入 AWS Lambda 到以与你的 Postgre 数据库进行交互 SQL

由 Louis Hourcade 创作 () AWS

摘要

Psycopg 是一款适用于 Python 的 Postgres 数据库SQL适配器。开发人员使用该psycopg2库来编写与 Postgre SQL 数据库交互的 Python 应用程序。

在 Amazon Web Services (AWS) 上,开发人员还使用AWS Lambda为应用程序或后端服务运行代码。Lambda 是一种无服务器、事件驱动的计算服务,无需预置或管理服务器即可运行代码。

默认情况下,当您创建使用 Python 运行时(版本 3.9、3.8 或 3.7)的新函数时,Lambda 运行时环境是根据提供的 L ambda 基础映像创建的。 AWS基础映像中不包含库,例如pandaspsycopg2。要使用库,您需要将其捆绑到自定义包中并将其附加到 Lambda。

有多种方法可以捆绑和附加库,包括以下几种:

  • .zip 文件档案中部署您的 Lambda 函数。

  • 从自定义容器镜像部署您的 Lambda 函数。

  • 创建一个 Lambda 层,并将其附加到您的 Lambda 函数。

此模式演示了前两个选项。

使用.zip 部署包,将pandas库添加到您的 Lambda 函数相对简单。在您的 Linux 计算机上创建一个文件夹,将 Lambda 脚本与pandas库和库的依赖项一起添加到该文件夹,压缩该文件夹,然后将其作为 Lambda 函数的源代码提供。

尽管使用.zip 部署包是一种常见的做法,但这种方法不适用于该psycopg2库。此模式首先显示您使用.zip 部署包将psycopg2库添加到 Lambda 函数时遇到的错误。然后,该模式显示了如何从 Dockerfile 部署 Lambda 以及如何编辑 Lambda 映像以使库正常运行。psycopg2

有关该模式部署的三种资源的信息,请参阅 “其他信息” 部分。

先决条件和限制

先决条件

  • AWS 账户 具有足够权限部署此模式所用 AWS 资源的活跃用户

  • AWS Cloud Development Kit (AWS CDK) 通过运行全局安装 npm install -g aws-cdk

  • 一个 Git 客户端

  • Python

  • Docker

限制

产品版本

  • AWSLambda 运行时版本:Python 3.8(该模式可以适用于其他 Python 版本。)

  • Psycopg2 版本 2.9.3

  • 熊猫版 1.5.2

架构

解决方案概述

为了说明在 Lambda 中使用该psycopg2库时可能面临的挑战,该模式部署了两个 Lambda 函数:

第一个 Lambda 函数将pandas库及其依赖项安装在.zip 文件中,Lambda 可以使用该库。

第二个 Lambda 函数演示,通过为 Lambda 函数构建容器镜像,您可以在 Lambda 中运行和pandaspsycopg2

工具

AWS 服务

  • AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置AWS云基础架构。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

其他工具

  • Docker 是一组平台即服务(PaaS)产品,它们使用操作系统级别的虚拟化技术在容器中交付软件。

  • p@@ andas 是一款基于 Python 的开源工具,用于数据分析和操作。

  • Psycopg 是一款适用于 Python 语言的 Postgre SQL 数据库适配器,专为多线程应用程序而设计。此模式使用 Psycopg 2。

  • Python 是通用的计算机编程语言。

代码存储库

此模式的代码可在上的 import-psycopg2--存储库中找到。in-lambda-to-interact with-postgres-database GitHub

最佳实践

此模式为您提供了一个使用 AWS CDK 从 Dockerfile 创建 Lambda 函数的工作示例。如果您在应用程序中重复使用此代码,请确保部署的资源满足所有安全要求。使用诸如 Checkov 之类的工具,它可以在部署基础架构之前扫描云基础设施配置,以发现配置错误。

操作说明

任务描述所需技能

克隆存储库。

要在本地计算机上克隆 GitHub 存储库,请运行以下命令:

git clone https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database.git cd AWS-lambda-psycopg2
将军 AWS

配置您的部署。

使用有关您的 AWS 账户以下信息的app.py文件进行编辑:

aws_acccount = "AWS_ACCOUNT_ID" region = "AWS_REGION" # Select the CPU architecture you are using to build the image (ARM or X86) architecture = "ARM"
将军 AWS
任务描述所需技能

引导你的 AWS 账户.

如果您尚未引导AWS环境,请使用您的账户 AWS 凭据运行以下命令: AWS

cdk bootstrap aws://<tooling-account-id>/<aws-region>
将军 AWS

部署代码。

要部署 AWS CDK 应用程序,请运行以下命令:

cdk deploy AWSLambdaPyscopg2
将军 AWS
任务描述所需技能

测试根据.zip 文件创建的 Lambda 函数。

要测试通过.zip 文件创建的 Lambda 函数,请执行以下操作:

  1. 登录控制台,然后在上打开 Lambda 控制台。https://console.aws.amazon.com/lambda/

  2. 选择 lambda-from-zip Lambda 函数。

  3. 创建一个测试事件来调用该函数。

  4. 调用该函数时,该函数应引发包含以下消息的错误:

    "errorMessage": Unable to import module 'lambda_code': libpq.so.5: cannot open shared object, "stackTrace": [] "errorType": Runtime.ImportModuleError",
  5. 打开 Amazon CloudWatch 控制台,网址为https://console.aws.amazon.com/cloudwatch/。 CloudWatch 日志显示pandas库已成功导入,但psycopg2库导入失败。

由于 Lambda 在默认镜像中找不到所需的 Postgre SQL 库,因此它无法使用该库。psycopg2

将军 AWS

测试从 Dockerfile 创建的 Lambda 函数。

要在 Lambda 函数中使用该psycopg2库,您必须编辑 Lambda Amazon 系统映像 ()。AMI

要测试从 Dockerfile 创建的 Lambda 函数,请执行以下操作:

  1. 登录控制台,然后打开 Lambda 控制台。

  2. 选择 lambda-from-docker Lambda 函数。

  3. 创建一个测试事件来调用该函数。

  4. 调用时,该函数应成功运行。

以下代码显示了 AWS CDK 模板创建的 Dockerfile:

# Start from lambda Python3.8 image FROM public.ecr.aws/lambda/python:3.8 # Copy the lambda code, together with its requirements COPY lambda/requirements.txt ${LAMBDA_TASK_ROOT} COPY lambda/lambda_code.py ${LAMBDA_TASK_ROOT} # Install postgresql-devel in your image RUN yum install -y gcc postgresql-devel # install the requirements for the Lambda code RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # Command can be overwritten by providing a different command in the template directly. CMD ["lambda_code.handler"]

Dockerfile 采用提供的 Python 3.8 运行时的 Lamb AWS da 镜像并安装 p ostgresql-devel,其中包含编译直接与 Postgre 管理服务器交互的应用程序所需的库。SQLDockerfile 还会安装文件中指示的pandasrequirements.txtpsycopg2库。

将军 AWS

相关资源

其他信息

在这种模式中, AWS CDK 模板提供了一个包含三种资源的 AWS 堆栈:

  • Lambda 函数的 AWS Identity and Access Management (IAM) 角色

  • 一个带有 Python 3.8 运行时的 Lambda 函数。该函数是从部署包中Constructs/lambda/lambda_deploy.zip部署的。

  • 一个带有 Python 3.8 运行时的 Lambda 函数。该函数是从文件夹下的 Dockerfile 部署的 Constructs

两个 Lambda 函数的脚本都会检查pandaspsycopg2库是否成功导入:

import pandas print("pandas successfully imported") import psycopg2 print("psycopg2 successfully imported") def handler(event, context): """Function that checks whether psycopg2 and pandas are successfully imported or not""" return {"Status": "psycopg2 and pandas successfully imported"}

lambda_deploy.zip部署包是使用 Constructs/lambda/build.sh bash 脚本构建的。此脚本创建文件夹、复制 Lambda 脚本、安装pandaspsycopg2库并生成.zip 文件。要自己生成.zip 文件,请运行此 bash 脚本并重新部署堆栈。 AWS CDK

Dockerfile 以为带有 Python 3.8 运行时的 Lambda AWS 提供的基础映像开头。Dockerfile 会在默认映像之上安装pandaspsycopg2库。

此模式显示了一种在 Lambda 中使用psycopg2库的方法,即从 Dockerfile 创建函数并向 Lambda 映像添加所需的依赖项。有关实现此目的的其他方法,请参阅 GitHub awslambda-ps ycopg2 存储库。