lambdaからpsqlおよびpg_dumpを実行する
lambdaからpsqlおよびpg_dumpを実行する
Dockerコンテナ起動
- 目的はpostgresqlソースを取得すること
- lambda実行環境を再現したDockerImageじゃないとOS依存部分でコケる
FROM lambci/lambda:build-ruby2.5 # postgresql install RUN yum install -y postgresql-devel CMD "/bin/bash"
$ docker build -t lambda-ruby2.5-psql . $ docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.5-psql
postgresqlソース取得
/var/task
にソースを集約させる- デプロイされるlambdaのソース一式は
/var/task
に配置される
$ mkdir /var/task/lib $ mkdir /var/task/lib64 # デフォルトでpostgresql9.2がインストールされたためpgsql92 $ cp -a /usr/lib64/pgsql92 /var/task/lib64/pgsql92 # pgsql92で使用しているのがlibpq.so.5.5 $ cp -a /usr/lib64/libpq.so.5.5 /var/task/lib/libpq.so.5.5
libpq.soへのシンボリックリンク作成【ハマりポイント】
libpq.so
とlibpq.so.5
のシンボリックリンクを作成するpsql
やpg_dump
が内部でlibpq.so
を呼び出しているため
/var/task/lib
に作成する- 環境変数
LD_LIBRARY_PATH
に/var/task/lib
が含まれるため
- 環境変数
# シンボリックリンク作成 $ ln -s /var/task/lib64/pgsql92/libpq.so /var/task/lib/libpq.so $ ln -s /var/task/lib/libpq.so.5.5 /var/task/lib/libpq.so.5
lambdaから呼び出し
- 上で
/var/task
に配置/作成したソースと下のrbファイルを一緒にlambdaにデプロイして実行する /var/task/lib64/pgsql92/bin/psql
もシンボリックリンク作ればpsql
で呼び出せそうです
require 'json' def handler(event:, context:) # psqlコマンドの確認としてバージョン出力させます { statusCode: 200, body: JSON.generate(`/var/task/lib64/pgsql92/bin/psql --version`) } end # => {"statusCode":200,"body":"\"psql (PostgreSQL) 9.2.24\\n\""}
まとめ
Linuxのフォルダ構成やライブラリ読み込みについて初めて調べました。
途中投げ出しかけましたが、実現できてよかった。