AWS LambdaからRDS(PostgresSQL)に接続したい
色々制約がある中での試行なので、上手く行かないものが多い。
制約は以下
- OS: Windows11
- Pythonをインストールできない[1]
-
LambdaはPython[2]変更して良い許可が出たので、次点Node.jsで検討する - Pythonのバージョンは3.9から3.13のいずれか[3]
-
DBはPostgresSQL[4]変更して良い許可が出たので、Auroraなども含めて検討する - AWS CloudShellは環境を作成できない環境[1:1]
- Docker desktop, Docker CLIはインストールできない[1:2]
- Windowsマシンから接続できるLinux環境はある
- LinuxにはPython 3.6.8が入っている
- 現状、Linux環境からAWSに接続する方法は不明
- 2025-08-04時点のPythonのサポート状況
https://devguide.python.org/versions/#status-of-python-versions より
前提
- RDSのDB作成は完了。
AWS側のRDSとLambdaの接続も問題なく出来ている見込み。(DB側からLambdaを作成したので、関連するセキュリティロールなどの設定は問題なく出来ているはず)
ただし、接続確認のためにLambdaを書いてみたが、psycopg2
がインポートできないので接続出来ているかは不明。 - AWS、Linux、Dockerは素人。
要望(できればこうしたい)
複数のLambdaからDBに接続したいので、psycopg2
は「レイヤー」として追加して使いまわしたい。
■試したこと1
psycopg2
を使ったDB接続を試そうとしたが、import psycopg2
の箇所でエラーになった。
調べてみると、デフォルトで使えるように設定されていないライブラリらしいので、手動で使えるようにする必要があるそう
要約すると以下のようなことが書いてある気がする
-
psycopg2
は、.zipのアップロードでは使えるようにできない - DockerfileからLambdaをデプロイし、Lambdaイメージを編集して
psycopg2
を使えるようにするのが良く(?)、その方法がいろいろと書いてある。
ただし、最後にpython
のコマンドが必要そうなので、PythonをインストールできないWindows11マシンでは厳しそう。
何調べたか覚えていないので、特に過去のことは記載しない。
Python 3.10で使える、psycopg2
のレイヤーを追加する方法。
1.Amazon Linux 2のDockerコンテナ起動
このタイトルがよく分からなかったけど、Docker Desktopアプリからそれっぽいのを選択したら良さそう?
とりあえずDocker desktopをインストールしてみる
Docker desktopのインストールにはシステム管理者の認証が必要なようなので、断念
目標:AWS LambdaからRDS(PostgresSQL)に接続して、テーブル操作ができるようにする
今の問題:Lambdaでimport psycopg2
がエラーになる
理由:外部ライブラリであるpsycopg2
は、LambdaのPython環境にデフォルトでは含まれていない
解決策:psycopg2
のデプロイパッケージをアップロードする
次の問題:pysycopg2
のデプロイパッケージを用意できない
理由:pip install psycopg2
が実行できないので、ライブラリをインストールできない
解決策1:WindowsマシンにPythonをインストールする マシンの制約でPythonをインストールできない
解決策2:用意されたLinux環境で用意する Linux環境への接続が複雑なので、ファイルをやり取りする方法が不明(※調査の余地あり?)
解決策3:Dockerを利用する Docker desktop, Docker CLIのインストールができない
解決策4:(最終手段?)制約掛けている側にレイヤーを準備してもらう
解決策5:制約掛けている側に、WindowsマシンでPythonを使えるようにしてもらう
解決策6:制約掛けている側に、WindowsマシンでDocker desktop/CLIを使えるようにしてもらう
Python+PostgresSQLの組み合わせを変える方向で検討する。
候補はそれぞれ以下のとおり。
- Lambda:Python, Node.js, C#
- RDS:PostgresSQL, MySQL, Aurora, Microsoft SQL Server
MySQLのDBを用意したけど、a5から接続できない。多分セキュリティロールのインバウンド/アウトバウンドの設定が問題
用意されていたLinux環境でpip install
ができることを確認。
pip install
をpip3 install
、もしくはpython -m pip install
に置き換えるとできる。
あと、インストール先が/usr/src/
になっていたのも、操作権限が無いとかでインストールできなかったから、python -m pip install psycopg2 -t ~/xxx/packages/
みたいにインストールするフォルダをアクセス可能なhome
内に変えたらエラーも表示されなくなった。
以前、会社の人はLambda(Python)+RDS(Aurora(MySQL))で開発したそう。
利用したライブラリ?は「SQLAlchemy」
AWS公式のレイヤー作成時の階層構造について
表は一部抜粋
各 Lambda ランタイムのレイヤーパス
関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt ディレクトリに読み込みます。Lambda ランタイムごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。Lambda がレイヤーコンテンツを確実に取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダパスにある必要があります。
ランタイム パス Python python
Python python/lib/python3.x/site-packages
(サイトディレクトリ)
※python3.x
は対象のバージョンの数字とする
S3からアップロードの「S3」ってS3の中のどこ??
S3は汎用バケットに新しくバケット作って、そこに上げたら良さそうだった
LambdaからSELECTはできたのでクローズ