将 psycopg2 库导入到以与你的 PostgreS AWS Lambda QL 数据库进行交互 - AWS 规范指引

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

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

Louis Hourcade,Amazon Web Services

Summary

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

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

默认情况下,当您创建使用 Lambda 支持的 Python 运行时的新函数时,Lambda 运行时环境就是根据 AWS提供的 Lambda 基础映像创建的。基础映像中不包含库,例如 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

限制

产品版本

  • Lambda 支持的 Python 运行时版本

  • Psycopg2 版本 2.9.3

  • Pandas 版本 1.5.2

架构

解决方案概述

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

  • 一个由 .zip 文件创建的、使用 Python 运行时的 Lambda 函数。psycopg2pandas 库已通过使用 pip 安装在此 .zip 部署包中。

  • 一个 Lambda 函数包含从 Dockerfile 创建的 Python 运行时。Dockerfile 会将 psycopg2pandas 库安装到 Lambda 容器映像中。

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

第二个 Lambda 函数则演示了,通过为 Lambda 函数构建容器映像,您可以在 Lambda 中运行 pandaspsycopg2 库。

工具

AWS 服务

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

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

其他工具

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

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

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

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

代码存储库

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

最佳实践

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

操作说明

Task说明所需技能

克隆存储库。

要在本地计算机上克隆 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
Task说明所需技能

引导你的 AWS 账户.

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

cdk bootstrap aws://<tooling-account-id>/<aws-region>
常规 AWS

部署模型。

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

cdk deploy AWSLambdaPyscopg2
常规 AWS
Task说明所需技能

测试从 .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 在默认映像中找不到所需的 PostgreSQL 库,因此它无法使用 psycopg2 库。

常规 AWS

测试从 Dockerfile 文件创建的 Lambda 函数。

要在 Lambda 函数中使用 psycopg2 库,您必须编辑 Lambda 亚马逊机器映像(AMI)。

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

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

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

  3. 创建测试事件,以调用函数。

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

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

# Start from lambda Python3.13 image FROM public.ecr.aws/lambda/python:3.13 # 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 运行时的 Lamb AWS da 镜像并安装 p ostgresql-devel,其中包含编译直接与 PostgreSQL 管理服务器交互的应用程序所需的库。Dockerfile 还会按照 requirements.txt 文件的说明安装 pandaspsycopg2 库。

常规 AWS

相关资源

附加信息

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

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

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

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

两个 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 运行时的 Lambda AWS 提供的基础映像开头。Dockerfile 会在默认映像之上安装 pandaspsycopg2 库。