

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

# 将 psycopg2 库导入到以与你的 PostgreS AWS Lambda QL 数据库进行交互
<a name="import-psycopg2-library-lambda"></a>

*Louis Hourcade，Amazon Web Services*

## Summary
<a name="import-psycopg2-library-lambda-summary"></a>

[Psycopg](https://www.psycopg.org/docs/) 是一款适用于 Python 的 PostgresSQL 数据库适配器。开发人员使用 `psycopg2` 库来编写与 PostgreSQL 数据库交互的 Python 应用程序。

在 Amazon Web Services（AWS）上，开发人员还可以使用 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 来为应用程序或后端服务运行代码。Lambda 是一种事件驱动的无服务器计算服务，它无需预调配或管理服务器即可运行代码。

默认情况下，当您创建使用 [Lambda 支持的 Python 运行时](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)的新函数时，Lambda 运行时环境就是根据 AWS提供的 [Lambda 基础映像](https://github.com/aws/aws-lambda-base-images)创建的。基础映像中不包含库，例如 `pandas` 或 `psycopg2`。要使用库，您需要将其捆绑到自定义包中并将其附加到 Lambda。

有多种方法可以捆绑和附加库，包括以下几种：
+ 从 [.zip 文件存档](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html)部署您的 Lambda 函数。
+ 从自定义容器映像部署您的 Lambda 函数。
+ 创建一个 [Lambda 层](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html#lambda-layer-versions)，并将其附加到您的 Lambda 函数。

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

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

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

有关此模式部署的三种资源的信息，请参阅[其他信息](#import-psycopg2-library-lambda-additional)部分。

## 先决条件和限制
<a name="import-psycopg2-library-lambda-prereqs"></a>

**先决条件**
+  AWS 账户 具有足够权限部署此模式所用 AWS 资源的活跃用户
+ AWS Cloud Development Kit (AWS CDK) 通过运行全局安装 `npm install -g aws-cdk`
+ Git 客户端
+ Python
+ Docker

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**
+ [Lambda 支持](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)的 Python 运行时版本
+ Psycopg2 版本 2.9.3
+ Pandas 版本 1.5.2

## 架构
<a name="import-psycopg2-library-lambda-architecture"></a>

**解决方案概述**

为了说明在 Lambda 中使用 `psycopg2` 库时可能面临的挑战，该模式部署了两个 Lambda 函数：
+ 一个由 .zip 文件创建的、使用 Python 运行时的 Lambda 函数。`psycopg2` 和 `pandas` 库已通过使用 [pip](https://pypi.org/project/pip/) 安装在此 .zip 部署包中。
+ 一个 Lambda 函数包含从 Dockerfile 创建的 Python 运行时。Dockerfile 会将 `psycopg2` 和 `pandas` 库安装到 Lambda 容器映像中。

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

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

## 工具
<a name="import-psycopg2-library-lambda-tools"></a>

**AWS 服务**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一个软件开发框架，可帮助您在代码中定义和预调配 AWS 云基础设施。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。

**其他工具**
+ [Docker](https://www.docker.com/) 是一组平台即服务（PaaS）产品，它们利用操作系统级的虚拟化技术在容器中提供软件。
+ [pandas](https://pandas.pydata.org/) 是一款基于 Python 的开源工具，用于数据分析和操作。
+ [Psycopg](https://www.psycopg.org/docs/) 是一款适用于 Python 语言的 PostgreSQL 数据库适配器，专为多线程应用程序而设计。此模式采用的是 Psycopg 2。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在上的 [import-psycopg2--存储库](https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database)中找到。in-lambda-to-interact with-postgres-database GitHub

## 最佳实践
<a name="import-psycopg2-library-lambda-best-practices"></a>

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

## 操作说明
<a name="import-psycopg2-library-lambda-epics"></a>

### 克隆存储库并配置部署
<a name="clone-the-repository-and-configure-the-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 要在本地计算机上克隆 GitHub 存储库，请运行以下命令：<pre>git clone https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database.git<br />cd AWS-lambda-psycopg2</pre> | 常规 AWS | 
| 配置部署。 | 使用有关您的 AWS 账户以下信息的`app.py`文件进行编辑：<pre>aws_acccount = "AWS_ACCOUNT_ID"<br />region = "AWS_REGION"<br /># Select the CPU architecture you are using to build the image (ARM or X86)<br />architecture = "ARM"</pre> | 常规 AWS | 

### 引导您的 AWS 账户并部署应用程序
<a name="bootstrap-your-aws-account-and-deploy-the-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 引导你的 AWS 账户. | 如果您尚未[引导 AWS 环境](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html)，请使用您的 AWS 账户 AWS 凭证运行以下命令：<pre>cdk bootstrap aws://<tooling-account-id>/<aws-region></pre> | 常规 AWS | 
| 部署模型。 | 要部署 AWS CDK 应用程序，请运行以下命令：<pre>cdk deploy AWSLambdaPyscopg2</pre> | 常规 AWS | 

### 通过 AWS 管理控制台测试 Lambda 函数
<a name="test-the-lambda-functions-from-the-aws-management-console"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 测试从 .zip 文件创建的 Lambda 函数。 | 要测试从 .zip 文件创建的 Lambda 函数，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)由于 Lambda 在默认映像中找不到所需的 PostgreSQL 库，因此它无法使用 `psycopg2` 库。 | 常规 AWS | 
| 测试从 Dockerfile 文件创建的 Lambda 函数。 | 要在 Lambda 函数中使用 `psycopg2` 库，您必须编辑 Lambda 亚马逊机器映像（AMI）。要测试从 Dockerfile 文件创建的 Lambda 函数，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)以下代码显示了 AWS CDK 模板创建的 Dockerfile：<pre># Start from lambda Python3.13 image<br />FROM public.ecr.aws/lambda/python:3.13<br /><br /># Copy the lambda code, together with its requirements<br />COPY lambda/requirements.txt ${LAMBDA_TASK_ROOT}<br />COPY lambda/lambda_code.py ${LAMBDA_TASK_ROOT}<br /><br /># Install postgresql-devel in your image<br />RUN yum install -y gcc postgresql-devel<br /><br /># install the requirements for the Lambda code<br />RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"<br /><br /># Command can be overwritten by providing a different command in the template directly.<br />CMD ["lambda_code.handler"]</pre>Dockerfile 获取提供的 Python 运行时的 Lamb AWS da 镜像并安装 p [ostgresql-devel，其中包含编译直接与 PostgreSQL](https://yum-info.contradodigital.com/view-package/updates/postgresql-devel/) 管理服务器交互的应用程序所需的库。Dockerfile 还会按照 `requirements.txt` 文件的说明安装 `pandas` 和 `psycopg2` 库。 | 常规 AWS | 

## 相关资源
<a name="import-psycopg2-library-lambda-resources"></a>
+ [AWS CDK 文档](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
+ [AWS Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)

## 附加信息
<a name="import-psycopg2-library-lambda-additional"></a>

在这种模式中， AWS CDK 模板提供了一个包含三种资源的 AWS 堆栈：
+ Lambda 函数的 [AWS Identity and Access Management （IAM）角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)
+ 一个带有 Python 运行时的 Lambda 函数。该函数是从 `Constructs/lambda/lambda_deploy.zip` 部署包中部署的。
+ 一个带有 Python 运行时的 Lambda 函数。该函数是从 `Constructs` 文件夹下的 Dockerfile 部署的

两个 Lambda 函数的脚本都会检查 `pandas` 和 `psycopg2` 库是否成功导入：

```
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 脚本、安装 `pandas` 和 `psycopg2` 库并生成 .zip 文件。要自己生成.zip 文件，请运行此 bash 脚本并重新部署堆栈。 AWS CDK 

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