Closed14

AWS LambdaからRDS(PostgresSQL)に接続したい

motonamotona

色々制約がある中での試行なので、上手く行かないものが多い。
制約は以下

  • 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に接続する方法は不明

脚注
  1. 制約掛けている側に依頼すればできるようになる可能性がある ↩︎ ↩︎ ↩︎

  2. 好きに変えられるかもしれない ↩︎

  3. 3.9は2025年10月でサポート終了、3.13はbugfix。また、これは2026年3月までの利用見込みのため、実質3.10から3.12の3つが選択肢 ↩︎

  4. 相談すれば変更できるかも? ↩︎

motonamotona

前提

  1. RDSのDB作成は完了。
    AWS側のRDSとLambdaの接続も問題なく出来ている見込み。(DB側からLambdaを作成したので、関連するセキュリティロールなどの設定は問題なく出来ているはず)
    ただし、接続確認のためにLambdaを書いてみたが、psycopg2がインポートできないので接続出来ているかは不明。
  2. AWS、Linux、Dockerは素人。

要望(できればこうしたい)

複数のLambdaからDBに接続したいので、psycopg2は「レイヤー」として追加して使いまわしたい。

motonamotona

■試したこと1
psycopg2を使ったDB接続を試そうとしたが、import psycopg2の箇所でエラーになった。
調べてみると、デフォルトで使えるように設定されていないライブラリらしいので、手動で使えるようにする必要があるそう

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html

要約すると以下のようなことが書いてある気がする

  • psycopg2は、.zipのアップロードでは使えるようにできない
  • DockerfileからLambdaをデプロイし、Lambdaイメージを編集してpsycopg2を使えるようにするのが良く(?)、その方法がいろいろと書いてある。

ただし、最後にpythonのコマンドが必要そうなので、PythonをインストールできないWindows11マシンでは厳しそう。

motonamotona

何調べたか覚えていないので、特に過去のことは記載しない。

motonamotona

https://qiita.com/daiki7010/items/30754fc71f1ee7dd307e

Python 3.10で使える、psycopg2のレイヤーを追加する方法。

1.Amazon Linux 2のDockerコンテナ起動

このタイトルがよく分からなかったけど、Docker Desktopアプリからそれっぽいのを選択したら良さそう?
とりあえずDocker desktopをインストールしてみる
Docker desktopのインストールにはシステム管理者の認証が必要なようなので、断念

motonamotona

目標:AWS LambdaからRDS(PostgresSQL)に接続して、テーブル操作ができるようにする

今の問題:Lambdaでimport psycopg2がエラーになる
理由:外部ライブラリであるpsycopg2は、LambdaのPython環境にデフォルトでは含まれていない
解決策psycopg2のデプロイパッケージをアップロードする

次の問題pysycopg2のデプロイパッケージを用意できない
理由pip install psycopg2が実行できないので、ライブラリをインストールできない
解決策1WindowsマシンにPythonをインストールする マシンの制約でPythonをインストールできない
解決策2用意されたLinux環境で用意する Linux環境への接続が複雑なので、ファイルをやり取りする方法が不明(※調査の余地あり?)
解決策3Dockerを利用する Docker desktop, Docker CLIのインストールができない
解決策4:(最終手段?)制約掛けている側にレイヤーを準備してもらう
解決策5:制約掛けている側に、WindowsマシンでPythonを使えるようにしてもらう
解決策6:制約掛けている側に、WindowsマシンでDocker desktop/CLIを使えるようにしてもらう

motonamotona

Python+PostgresSQLの組み合わせを変える方向で検討する。

候補はそれぞれ以下のとおり。

  • Lambda:Python, Node.js, C#
  • RDS:PostgresSQL, MySQL, Aurora, Microsoft SQL Server
motonamotona

MySQLのDBを用意したけど、a5から接続できない。多分セキュリティロールのインバウンド/アウトバウンドの設定が問題

motonamotona

用意されていたLinux環境でpip installができることを確認。
pip installpip3 install、もしくはpython -m pip installに置き換えるとできる。
あと、インストール先が/usr/src/になっていたのも、操作権限が無いとかでインストールできなかったから、python -m pip install psycopg2 -t ~/xxx/packages/みたいにインストールするフォルダをアクセス可能なhome内に変えたらエラーも表示されなくなった。

motonamotona

以前、会社の人はLambda(Python)+RDS(Aurora(MySQL))で開発したそう。
利用したライブラリ?は「SQLAlchemy」

motonamotona

AWS公式のレイヤー作成時の階層構造について

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/packaging-layers.html

表は一部抜粋

各 Lambda ランタイムのレイヤーパス

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt ディレクトリに読み込みます。Lambda ランタイムごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。Lambda がレイヤーコンテンツを確実に取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダパスにある必要があります。

ランタイム パス
Python python
Python python/lib/python3.x/site-packages (サイトディレクトリ)

python3.xは対象のバージョンの数字とする

motonamotona

S3からアップロードの「S3」ってS3の中のどこ??

motonamotona

S3は汎用バケットに新しくバケット作って、そこに上げたら良さそうだった

motonamotona

LambdaからSELECTはできたのでクローズ

このスクラップは28日前にクローズされました