選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

將 psycopg2 程式庫匯入 AWS Lambda ,以與您的 PostgreSQL 資料庫互動 - AWS 方案指引

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

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

將 psycopg2 程式庫匯入 AWS Lambda ,以與您的 PostgreSQL 資料庫互動

由 Louis Hourcade (AWS) 建立

Summary

Psycopg 是適用於 Python 的 PostgresSQL 資料庫轉接器。開發人員使用 psycopg2程式庫撰寫與 PostgreSQL 資料庫互動的 Python 應用程式。

在 Amazon Web Services (AWS) 上,開發人員也會使用 AWS Lambda來執行應用程式或後端服務的程式碼。Lambda 是一種無伺服器、事件驅動的運算服務,無需佈建或管理伺服器即可執行程式碼。

根據預設,當您建立使用 Python 執行期 (3.9、3.8 或 3.7 版) 的新函數時,Lambda 執行期環境會從 提供的 Lambda 基礎映像建立。 AWS基本映像psycopg2中不包含 pandas或 等程式庫。若要使用程式庫,您需要將其封裝在自訂套件中,並將其連接至 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

限制

產品版本

  • AWS Lambda 執行時間版本:Python 3.8 (模式可以適用於其他 Python 版本。)

  • Psycopg2 2.9.3 版

  • Pandas 1.5.2 版

架構

解決方案概觀

為了說明在 Lambda 中使用psycopg2程式庫時可能面臨的挑戰, 模式會部署兩個 Lambda 函數:

  • 一個 Lambda 函數搭配從 .zip 檔案建立的 Python 3.8 執行期。psycopg2pandas程式庫是使用 pip 安裝在此 .zip 部署套件中。

  • 從 Dockerfile 建立的具有 Python 3.8 執行期的 Lambda 函數。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 是一種一般用途的電腦程式設計語言。

程式碼儲存庫

此模式的程式碼可在 GitHub 的 import-psycopg2-in-lambda-to-interact-with-postgres-database 儲存庫中使用。

最佳實務

此模式提供您使用 從 Dockerfile AWS CDK 建立 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

設定您的部署。

使用下列資訊編輯 app.py 檔案 AWS 帳戶:

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

複製儲存庫並設定部署

任務描述所需的技能

複製儲存庫。

若要複製本機電腦上的 GitHub 儲存庫,請執行下列命令:

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

設定您的部署。

使用下列資訊編輯 app.py 檔案 AWS 帳戶:

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

引導您的 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. 登入 主控台,並在 https://https://console.aws.amazon.com/lambda/ 開啟 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. https://console.aws.amazon.com/cloudwatch/ 開啟 Amazon CloudWatch 主控台。CloudWatch 日誌顯示已成功匯入程式pandas庫,但psycopg2程式庫匯入失敗。

由於 Lambda 在預設映像中找不到所需的 PostgreSQL 程式庫,因此無法使用程式psycopg2庫。

一般 AWS

測試從 Dockerfile 建立的 Lambda 函數。

若要在 Lambda 函數中使用psycopg2程式庫,您必須編輯 Lambda Amazon Machine Image (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 執行時間 AWS 的 Lambda 映像,並安裝 postgresql-devel,其中包含編譯直接與 PostgreSQL 管理伺服器互動之應用程式所需的程式庫。Dockerfile 也會安裝 pandaspsycopg2程式庫,這些程式庫會顯示在 requirements.txt 檔案中。

一般 AWS

從 AWS 管理主控台測試 Lambda 函數

任務描述所需的技能

測試從 .zip 檔案建立的 Lambda 函數。

若要測試從 .zip 檔案建立的 Lambda 函數,請執行下列動作:

  1. 登入 主控台,並在 https://https://console.aws.amazon.com/lambda/ 開啟 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. https://console.aws.amazon.com/cloudwatch/ 開啟 Amazon CloudWatch 主控台。CloudWatch 日誌顯示已成功匯入程式pandas庫,但psycopg2程式庫匯入失敗。

由於 Lambda 在預設映像中找不到所需的 PostgreSQL 程式庫,因此無法使用程式psycopg2庫。

一般 AWS

測試從 Dockerfile 建立的 Lambda 函數。

若要在 Lambda 函數中使用psycopg2程式庫,您必須編輯 Lambda Amazon Machine Image (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 執行時間 AWS 的 Lambda 映像,並安裝 postgresql-devel,其中包含編譯直接與 PostgreSQL 管理伺服器互動之應用程式所需的程式庫。Dockerfile 也會安裝 pandaspsycopg2程式庫,這些程式庫會顯示在 requirements.txt 檔案中。

一般 AWS

相關資源

其他資訊

在此模式中, AWS CDK 範本提供具有三個資源的 AWS 堆疊:

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

  • 具有 Python 3.8 執行時間的 Lambda 函數。函數是從部署套件Constructs/lambda/lambda_deploy.zip部署。

  • 具有 Python 3.8 執行時間的 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 3.8 執行時間的 Lambda AWS 基本映像。Dockerfile 會在預設映像的頂端安裝 pandaspsycopg2程式庫。

此模式顯示從 Dockerfile 建立函數,並將必要的相依性新增至 Lambda 映像,藉此在 Lambda 中使用psycopg2程式庫的一種方式。如需達成此目標的其他方法,請參閱 GitHub awslambda-psycopg2 儲存庫。

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。