gitkadoの気まぐれ日記

島根在住エンジニアが何かに興味を持ったらブログを更新します

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.solibpq.so.5シンボリックリンクを作成する
    • psqlpg_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のフォルダ構成ライブラリ読み込みについて初めて調べました。
途中投げ出しかけましたが、実現できてよかった。

成果物

https://github.com/gitkado/lambda-psql-shell