PL/Rust を使って Rust 言語で PostgreSQL 関数を記述する - Amazon Relational Database Service

PL/Rust を使って Rust 言語で PostgreSQL 関数を記述する

PL/Rust は、PostgreSQL のための信頼できる Rust 言語エクステンションです。ストアドプロシージャ、関数、SQL から呼び出し可能なその他のプロシージャルコードに使用できます。PL/Rust 言語拡張は次のバージョンで利用可能です。

  • RDS for PostgreSQL 16.1 またはそれ以降の 16 バージョン

  • RDS for PostgreSQL 15.2-R2 またはそれ以降の 15 バージョン

  • RDS for PostgreSQL 14.9 またはそれ以降の 14 バージョン

  • RDS for PostgreSQL 13.12 またはそれ以降の 13 バージョン

詳細については、GitHub の「PL/Rust」を参照してください。

PL/Rust の設定

DB インスタンスに plrust 拡張機能をインストールするには、DBインスタンスに関連付けられた DB パラメータグループの shared_preload_libraries パラメータに plrust を追加します。plrust 拡張機能をインストールすると、関数を作成できます。

shared_preload_libraries パラメータを変更するには、DB インスタンスをカスタムパラメータグループに関連付ける必要があります。カスタム DB パラメータグループの作成については、「Amazon RDS のパラメータグループ」を参照してください。

plust 拡張機能は、AWS Management Console または AWS CLI を使用してインストールできます。

以下のステップでは、DB インスタンスがカスタム DB パラメータグループに関連付けられていることを前提としています。

plust 拡張機能を shared_preload_libraries パラメータにインストールする

rds_superuser グループ (ロール) のメンバーであるアカウントを使用して、次のステップを完了します。

  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、データベースを選択します。

  3. DB インスタンスの名前を選択して、その詳細を表示します。

  4. DB インスタンスの [設定] タブを開き、DB インスタンスパラメータグループのリンクを探します。

  5. リンクを選択して、DB クラスターに関連付けられたカスタムパラメータを開きます。

  6. パラメータ検索フィールドに、shared_pre を入力して shared_preload_libraries パラメータを検索します。

  7. プロパティ値にアクセスするには、[Edit parameters] (パラメータの編集) を選択します。

  8. [値] フィールドのリストに plrust を追加します。値のリスト内の項目を区切るにはカンマを使用します。

  9. DB インスタンスを再起動して、shared_preload_libraries パラメータの変更を有効にします。最初の再起動が完了するまでにさらに時間がかかる場合があります。

  10. インスタンスが使用可能になったら、plrust が初期化されていることを確認します。psql を使用して DB インスタンスに接続し、次のコマンドを実行します。

    SHOW shared_preload_libraries;

    出力は以下のようになります。

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)
shared_preload_libraries パラメータに pltrust 拡張機能をインストールする

rds_superuser グループ (ロール) のメンバーであるアカウントを使用して、次のステップを完了します。

  1. shared_preload_libraries パラメータに plrust を追加するには、modify-db-parameter-group AWS CLI コマンドを使用します。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=plrust,ApplyMethod=pending-reboot" \ --region aws-region
  2. reboot-db-instance AWS CLI コマンドを使用して DB インスタンスを再起動し、plrust ライブラリを初期化します。最初の再起動が完了するまでにさらに時間がかかる場合があります。

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. インスタンスが使用可能になったら、plrust が初期化されていることを確認できます。psql を使用して DB インスタンスに接続し、次のコマンドを実行します。

    SHOW shared_preload_libraries;

    出力は以下のようになります。

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)

PL/Rust を使った関数の作成

PL/Rust は関数を動的ライブラリとしてコンパイルし、ロードして実行します。

次の Rust 関数は、配列から複数を除外します。

postgres=> CREATE LANGUAGE plrust; CREATE EXTENSION
CREATE OR REPLACE FUNCTION filter_multiples(a BIGINT[], multiple BIGINT) RETURNS BIGINT[] IMMUTABLE STRICT LANGUAGE PLRUST AS $$ Ok(Some(a.into_iter().filter(|x| x.unwrap() % multiple != 0).collect())) $$; WITH gen_values AS ( SELECT ARRAY(SELECT * FROM generate_series(1,100)) as arr) SELECT filter_multiples(arr, 3) from gen_values;

PL/Rust の入ったクレートを使用する

RDS for PostgreSQL バージョン 16.3-R2 以降、15.7-R2 以降の 15 バージョン、14.12-R2 以降の 14 バージョン、および 13.15-R2 以降の 13 バージョンでは、PL/Rust は追加のクレートをサポートしています。

  • url

  • regex

  • serde

  • serde_json

RDS for PostgreSQL バージョン 15.5-R2 以降、14.10-R2 以降の 14 バージョン、および 13.13-R2 以降の 13 バージョンでは、PL/Rust は 2 つの追加のクレートをサポートしています。

  • croaring-rs

  • num-bigint

Amazon RDS for PostgreSQL バージョン 15.4、14.9、13.12 以降、PL/Rust は、次のクレートをサポートします。

  • aes

  • ctr

  • rand

これらのクレートではデフォルト機能のみがサポートされています。新しい RDS for PostgreSQL バージョンには、更新されたバージョンのクレートが含まれているため、古いバージョンのクレートはサポートされなくなる可能性があります。

メジャーバージョンアップグレードを行う際のベストプラクティスに従って、お使いの PL/Rust 関数が新しいメジャーバージョンと互換性があるかどうかをテストしてください。詳細については、「Amazon RDS ユーザーガイド」のブログ「Amazon RDS を PostgreSQL のメジャーバージョンとマイナーバージョンにアップグレードするためのベストプラクティス」と「Amazon RDS の PostgreSQL DB エンジンのアップグレード」を参照してください。

PL/Rust 関数を作成する際の依存関係の使用例については、「依存関係を使う」を参照してください。

PL/Rust の制限事項

デフォルトでは、データベースユーザーは PL/Rust を使用できません。PL/Rust へのアクセスを提供するには、rds_superuser 権限を持つユーザーとして接続し、次のコマンドを実行します。

postgres=> GRANT USAGE ON LANGUAGE PLRUST TO user;