

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# psycopg2 ライブラリを にインポート AWS Lambda して PostgreSQL データベースとやり取りする
<a name="import-psycopg2-library-lambda"></a>

*Amazon Web Services、Louis Hourcade*

## 概要
<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)を使用する新しい関数を作成すると、 AWSによって提供される [Lambda のベースイメージ](https://github.com/aws/aws-lambda-base-images)から Lambda ランタイム環境が作成されます。`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 関数にアタッチします。

このパターンでは、最初の 2 つのオプションについて説明します。

.zip デプロイパッケージを使用すると、Lambda 関数に `pandas` ライブラリを追加するのが比較的簡単になります。Linux マシンにフォルダを作成し、Lambda スクリプトを `pandas` ライブラリとライブラリの依存関係とともにフォルダに追加して、フォルダを圧縮して、Lambda 関数のソースとして提供します。

.zip デプロイパッケージを使用するのは一般的な方法ですが、この方法は `psycopg2` ライブラリでは機能しません。このパターンではまず、.zip デプロイパッケージを使用して `psycopg2` ライブラリを Lambda 関数に追加した場合に表示されるエラーを示します。次に、このパターンでは、Dockerfile から Lambda をデプロイし、`psycopg2` ライブラリが機能するように Lambda イメージを編集する方法を示します。

パターンがデプロイする 3 つのリソースの詳細については、「[追加情報](#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/)」を参照してください。特定のエンドポイントについては、「[Service endpoints and quotas](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` ライブラリを使用する際に直面する可能性のある課題を説明するために、このパターンでは、次の 2 つの Lambda 関数をデプロイします。
+ .zip ファイルから作成された Python ランタイムを含む 1 つの Lambda 関数。`psycopg2` および `pandas` ライブラリは、[pip](https://pypi.org/project/pip/) を使用してこの .zip デプロイパッケージにインストールされます。
+ Dockerfile から作成された Python ランタイムを含む 1 つの Lambda 関数。Dockerfile は、Lambda コンテナイメージに `psycopg2` および `pandas` ライブラリをインストールします。

最初の Lambda 関数は、`pandas` ライブラリとその依存関係を .zip ファイルにインストールし、Lambda はそのライブラリを使用できます。

2 番目の 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/) は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (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>

このパターンでは、 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | ローカルマシンに 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| をブートストラップします 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| .zip ファイルから作成された Lambda 関数をテストします。 | .zip ファイルから作成された Lambda 関数をテストするには、以下を行います。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)Lambda はデフォルトイメージ内に必要な PostgreSQL ライブラリを見つけられないため、`psycopg2` ライブラリを使用できません。 | AWS 全般 | 
| Dockerfile から作成された Lambda 関数をテストします。 | Lambda 関数内で `psycopg2` ライブラリを使用するには、Lambda Amazon マシンイメージ (AMI) を編集する必要があります。Dockerfile から作成された Lambda 関数をテストするには、以下を行います。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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 は、`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 テンプレートは 3 つのリソースを持つ 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` ライブラリをインストールします。