

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 psycopg2 程式庫匯入 AWS Lambda ，以與您的 PostgreSQL 資料庫互動
<a name="import-psycopg2-library-lambda"></a>

*Louis Hourcade，Amazon Web Services*

## 總結
<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 執行期環境會從 提供的 [Lambda 基礎映像](https://github.com/aws/aws-lambda-base-images)建立 AWS。基本映像`psycopg2`中不包含 `pandas`或 等程式庫。若要使用程式庫，您需要將其封裝在自訂套件中，並將其連接到 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 版

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

**解決方案概觀 **

為了說明在 Lambda 中使用程式`psycopg2`庫時可能面臨的挑戰， 模式會部署兩個 Lambda 函數：
+ 一個 Lambda 函數，其中包含從 .zip 檔案建立的 Python 執行期。`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/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 的 [import-psycopg2-in-lambda-to-interact-with-postgres-database](https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database) 儲存庫中使用。

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

此模式提供您使用 從 Dockerfile AWS CDK 建立 Lambda 函數的工作範例。如果您在應用程式中重複使用此程式碼，請確定部署的資源符合所有安全需求。使用 [Checkov](https://www.checkov.io/) 等工具，在部署基礎設施之前掃描雲端基礎設施組態以尋找組態錯誤。

## 史詩
<a name="import-psycopg2-library-lambda-epics"></a>

### 複製儲存庫並設定部署
<a name="clone-the-repository-and-configure-the-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要在本機電腦上複製 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 | 
| 設定您的部署。 | 使用下列資訊編輯 `app.py` 檔案 AWS 帳戶：<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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導您的 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試從 .zip 檔案建立的 Lambda 函數。 | 若要測試從 .zip 檔案建立的 Lambda 函數，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)由於 Lambda 在預設映像中找不到所需的 PostgreSQL 程式庫，因此無法使用程式`psycopg2`庫。 | 一般 AWS | 
| 測試從 Dockerfile 建立的 Lambda 函數。 | 若要在 Lambda 函數中使用程式`psycopg2`庫，您必須編輯 Lambda Amazon Machine Image (AMI)。若要測試從 Dockerfile 建立的 Lambda 函數，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 執行時間取得 AWS 提供的 Lambda 映像，並安裝 [postgresql-devel](https://yum-info.contradodigital.com/view-package/updates/postgresql-devel/)，其中包含編譯直接與 PostgreSQL 管理伺服器互動之應用程式所需的程式庫。Dockerfile 也會安裝 `pandas`和 `psycopg2`程式庫，這些程式庫會顯示在 `requirements.txt` 檔案中。 | 一般 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`程式庫。