Lambda + RDS Proxy を利用して Aurora PostgreSQL にアクセスする
検証のためにLambda + RDS Proxy + Aurora PostgreSQL を構築したが、時間がかかったり、はまったりしたのでメモとして残す。
(やりたかったこと)
- Lambda 〜 RDS Proxy 間は、IAM認証を利用
- RDS Proxy から Secrets Manager へアクセス(Lambda にクレデンシャルを埋め込まない)
- Lambda から クエリを投げる
(作業概要)
- EC2 からAurora へアクセス、テーブルを作成
- Lambda 作成 、 Aurora へアクセス(Lambda レイヤーの準備)
- Lambda から Aurora へテストでアクセス(クエリをなげる)
- RDS Proxy 、Secrets Manager 、Lambda の設定
(作業1 .EC2 からAurora へアクセス、テーブルを作成)
EC2 へpsql をインストール
sudo yum -y install postgresql.x86_64
EC2 からAurora へアクセス
psql -h <エンドポイント> -U <ユーザ名>
Aurora にユーザ/データベース/テーブルの作成
create user post_user01 with password '*******';
create database post_user_database owner=post_user01;
create table A(id serial primary key, name text);
insert into A(name) values('rili'),('so!'),('oh!');
GRANT all ON A TO post_user01;
ここでの作業が原因でLambdaでの作業時にはまった。新しくテーブルを作成したが、間違えて「デフォルトのデータベース」上に作成していた。Lambda からは「新しいデータベース」のテーブルにアクセスしてたので、クエリが通らなかった。
(作業2.Lambda 作成 、 Aurora へアクセス(Lambda レイヤーの準備))
Lambda から PostgreSQL にアクセするために、外部ライブラリが必要とのこと。今回は、先人のものを利用することに。下記を参考に作業。本当に感謝です。
(参考にしたサイト)
AWS LambdaでPython外部ライブラリのLayerを作る前に - Qiita
Klayers/deployments/python3.8 at master · keithrozario/Klayers · GitHub
Lambda の作成は下記を参考。こちらも本当に感謝です。
【AWS】LambdaからRDS Proxy経由でPostgreSQLへ接続する | SEのプログラミングと英語の勉強ブログ
(作業3.Lambda から Aurora へテストでアクセス(クエリをなげる))
最初は RDS Proxy を挟まずに、Lambda からアクセス。上述の通り、テーブルの作成場所を誤ったためはまっていました。切り分けとして、実行する SQL を変えてみました。PostgreSQL 上の時刻を確認するクエリを投げたら、応答があったのでデータベース周りを調査して無事解決。
(作業4.RDS Proxy 、Secrets Manager 、Lambda の設定)
RDS Proxy 、Secrets Manager 、Lambda の設定も上記サイトを参考。以下ではまった。
- RDS Proxy のロールに適用するポリシーに誤りがあった。Resource に Secrets Manager に作成した「シークレットのARN」を入れること。
- Lambda のコード内で IAM 認証の記述。「generate_db_auth_token」で token を作成する。その token を利用して DB へアクセするコードを記述。
- Lambda への証明書インポート、コードの記述
※Lambda から Secrets Manager へのアクセスするコードは Secrets Manager コンソールにサンプルコードがあり便利だった。