Aurora PostgreSQLでpg_cronを使用しジョブをスケジュールする

こんにちは、香田です。

今回は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で完結できる為、運用管理の削減としても有用ではないでしょうか。

最後までご覧いただきありがとうございます。

SNSでもご購読できます。