はじめに
こんにちは。株式会社ジールの@yakisobapanです。
Amazon RDSにて、Rustを用いたユーザー定義関数の作成ができるようになりましたので、試してみました。
目次
- アップデート内容
- アーキテクチャ
- やってみた
- 所感
アップデート内容
RDS for PostgreSQLでプログラミング言語”Rust”がサポートされ、Rustを利用した高度なユーザー定義関数の作成ができるようになりました。
Amazon RDS for PostgreSQL が Rust をサポートし、高パフォーマンスのデータベース機能を構築できるようになりました
(2023/05/23 What's New with AWS?より)
アーキテクチャ
やってみた
DBの構築
- DBインスタンスの作成
RDSコンソールより、下記の要件でDBインスタンスを作成します。
・DBタイプ:PostgreSQL
・バージョン:PostgreSQL 15.2 以降
・パラメータグループ:カスタム1
*注釈でも説明していますが、Rustの拡張機能をインストールするため、
デフォルトではなく、カスタムパラメータグループを指定します。
PL/Rustのセットアップ
- plrust 拡張機能のインストール
・下記順序で”DB インスタンスパラメータグループ”リンクを選択します。
データベース>
対象のクラスター>
設定タブ>
DB インスタンスパラメータグループ>
・検索窓より「shared_preload_libraries」を探し、対象を”✓”し、
”パラメータの編集”押下します。
・”値”に「plrust」を入力し、”変更の保存”を押下します。
・変更したパラメータを適用するため、”アクション”から、DBを再起動します。
- 設定の確認
・DB接続後、下記クエリを実行して、
拡張機能がインストールされているか確認します。
SHOW shared_preload_libraries;
- 関数の実行
・Rustを利用して書かれたファンクションを実行してみます。
/*
1~100の中で3で割り切れない数値を配列で出力する
filter_multiplesという関数を作成
*/
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) --1-100の数値を生成して配列に格納
SELECT filter_multiples(arr, 3) --filter_multiplesに引数を渡して実行結果を表示
from gen_values;
・実行してみると、結果が返されていることがわかります。
所感
PL/Rustでしかできないようなことは、まだ見い出せていませんが、今回PL/Rustが追加されたことで、間違いなく開発の幅が広がったのではないのでしょうか!
またRustは、まったくの初見でしたので、新しい言語に触れる良い機会になりました。
勉強も兼ねて、もう少し深堀して触ってみようと思いますので、どうぞお楽しみに!
参考
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください:
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
-
rustの拡張機能をインストールするためには、カスタムパラメータグループを設定する必要があります。
パラメータグループ>
パラメータグループの作成
・デフォルトパラメータグループを使用すると、パラメータ編集時にエラーとなります。
⇒ 保存中のエラー: Cannot modify a default parameter group. Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue
↩