こんにちは、香田です。
今回はAurora PostgreSQLでpg_cronを使用しジョブをスケジュールする方法について紹介していきます。
pg_cronについて
pg_cronとはPostgreSQLの拡張機能で、通常のcronと同じ構文を使用しデータベースから直接PostgreSQLコマンドをスケジュールすることができます。
例えば特定のテーブルに対して指定した時間にVACCUM処理の実行や、不要な時系列データを毎日DELETEしたり等外部の仕組みを利用せずにPostgreSQLのみでスケジュールジョブを実行することが可能となります。
検証用 PostgreSQL環境の作成
pg_cronをローカルでも検証できるようにDockerでPostgreSQL環境を用意していきます。
下記のDockerfileをを作成します。
FROM postgres:13.3
RUN apt-get update && apt-get -y install postgresql-13-cron
下記のdocker-compose.ymlを作成します。
version: '3'
services:
postgresql:
container_name: postgresql
build: .
image: pg_cron:13.3
environment:
- POSTGRES_DB=dvdrental
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: postgres -c shared_preload_libraries=pg_cron -c cron.database_name=postgres
ports:
- '5432:5432'
コンテナを起動します。
docker-compose up --build -d
PostgreSQLへ接続します。
export PGPASSWORD='postgres'
psql -h 127.0.0.1 -U postgres -d postgres
pg_cron 拡張機能をインストールします。
CREATE EXTENSION pg_cron;
下記のようにcron.schedule
が実行できるはずです。
postgres=# SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
schedule
----------
1
(1 row)
Aurora PostgreSQLの作成
pg_cronはAurora PostgreSQLではエンジンバージョン 12.6 以降でサポートされています。
下記のようにエンジンバージョンが13.3のAurora PostgreSQLを作成しております。
pg_cronを利用する場合、DB パラメータグループのshared_preload_libraries
へ下記のようにpg_cronを追加する必要があります。
shared_preload_libraries
を変更した場合、反映させるにはDBインスタンスの再起動が必要になるので注意してください。
次に作成したAurora PostgreSQLへ接続し、pg_cron 拡張機能をインストールしていきます。
export PG_HOST=<Aurora ライターインスタンス エンドポイント>
psql -h $PG_HOST -U postgres -d postgres
pg_cron 拡張機能をインストールします。
CREATE EXTENSION pg_cron;
サンプルデータベースの準備
pg_cronのcron ジョブ操作にて検証できるようサンプルデータベースを用意します。
PostgreSQLTutorialよりサンプルデータベースをダウンロードし解凍します。
wget https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip
unzip dvdrental.zip
サンプルデータベースをリストアします。
psql -h $PG_HOST -U postgres -d postgres -c "CREATE DATABASE dvdrental"
pg_restore -h $PG_HOST -U postgres -d dvdrental dvdrental.tar
pg_cronでcron ジョブの操作
ここでは、pg_cronを利用したcronジョブの操作方法について簡単に紹介していきます。
Aurora PostgreSQLへ接続します。
export PG_HOST=<Aurora ライターインスタンス エンドポイント>
psql -h $PG_HOST -U postgres -d postgres
テーブル指定しVACUUM 実行するcron ジョブの作成
SELECT cron.schedule('manual vacuum', '30 0 * * *', 'VACUUM category');
デフォルトではpostgresデータベースが指定されるので、dvdrentalデータベースへ変更
UPDATE cron.job SET database = 'dvdrental' WHERE jobid = 1;
作成したcron ジョブのスケジュール更新
UPDATE cron.job SET schedule = '*/1 * * * *' WHERE jobid = 1;
cron ジョブの確認
SELECT * FROM cron.job;
cron ジョブの履歴確認
SELECT * FROM cron.job_run_details;
成功したcron ジョブの確認
SELECT * FROM cron.job_run_details WHERE status = 'succeeded';
失敗したcron ジョブの確認
SELECT * FROM cron.job_run_details WHERE status = 'failed';
cron ジョブの削除
SELECT cron.unschedule(1);
さいごに
Aurora PostgreSQLでpg_cronを使用しジョブをスケジュールする方法いかがでしたでしょうか?
pg_cronを利用することで、定期的なメンテナンス作業の自動化を外部で実行させる必要なくPostgreSQLで完結できる為、運用管理の削減としても有用ではないでしょうか。
最後までご覧いただきありがとうございます。