【アップデート】RDSでPL/Rust を使用してPostgreSQL 関数を作成する

# はじめに
こんにちは。株式会社ジールの[@yakisobapan](https://qiita.com/yakisobapan)です。

Amazon RDSにて、**Rustを用いたユーザー定義関数の作成**ができるようになりましたので、試してみました。

# 目次
 - アップデート内容
 - アーキテクチャ
 - やってみた
 - 所感


# アップデート内容

RDS for PostgreSQLでプログラミング言語”Rust”がサポートされ、Rustを利用した高度なユーザー定義関数の作成ができるようになりました。

>Amazon RDS for PostgreSQL が Rust をサポートし、高パフォーマンスのデータベース機能を構築できるようになりました
（2023/05/23 What's New with AWS?より）

https://aws.amazon.com/about-aws/whats-new/2023/05/amazon-rds-postgresql-rust/


# アーキテクチャ
簡単に、以下のような構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/5519d22e-e78d-2659-e384-c1133afaa9b0.png)

# やってみた

**DBの構築**

- DBインスタンスの作成
RDSコンソールより、下記の要件でDBインスタンスを作成します。

・DBタイプ：PostgreSQL
・バージョン：PostgreSQL 15.2 以降
・パラメータグループ：カスタム[^1]
 　*注釈でも説明していますが、Rustの拡張機能をインストールするため、
　　デフォルトではなく、カスタムパラメータグループを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/4456e2b1-5e95-91cb-1394-950df7f94d71.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/fd185130-b689-5518-ac8a-230e09863f68.png" width=40%>

**PL/Rustのセットアップ**

- plrust 拡張機能のインストール

・下記順序で”DB インスタンスパラメータグループ”リンクを選択します。

　データベース>
　対象のクラスター>
　設定タブ>
　DB インスタンスパラメータグループ>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/2fd3e2fe-749f-e9d1-5e9c-81f0aa10bb0c.png" width=40%>

・検索窓より「shared_preload_libraries」を探し、対象を”✓”し、
　”パラメータの編集”押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/9340aeb7-c30b-5e6b-80e4-21d2de6246dc.png)

・”値”に「plrust」を入力し、”変更の保存”を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/ba574715-ad53-734d-cf76-b4e8a9e2bb3a.png)

・変更したパラメータを適用するため、”アクション”から、DBを再起動します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/e2b73760-deb7-1a70-cc81-94e3a3f3dd0f.png" width=40%>

- 設定の確認

・DB接続後、下記クエリを実行して、
　拡張機能がインストールされているか確認します。

```sql:Install Check
SHOW shared_preload_libraries;
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/77b2d301-b67d-fbb0-6447-e21ba3fc237f.png" width=40%>

- 関数の実行
・Rustを利用して書かれたファンクションを実行してみます。

```sql:UDF with 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;
```

・実行してみると、結果が返されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/4dcee987-33fd-8660-587a-32db86541924.png)

# 所感

PL/Rustでしかできないようなことは、まだ見い出せていませんが、今回PL/Rustが追加されたことで、間違いなく開発の幅が広がったのではないのでしょうか！

またRustは、まったくの初見でしたので、新しい言語に触れる良い機会になりました。
勉強も兼ねて、もう少し深堀して触ってみようと思いますので、どうぞお楽しみに！

# 参考

https://aws.amazon.com/about-aws/whats-new/2023/05/amazon-rds-postgresql-rust/

https://docs.amazonaws.cn/en_us/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Extensions.html#PostgreSQL.Concepts.General.Using.PL_Rust




[^1]: rustの拡張機能をインストールするためには、カスタムパラメータグループを設定する必要があります。
パラメータグループ>
パラメータグループの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/8a8ec806-88b7-4720-4345-aafca3e8573d.png)
・デフォルトパラメータグループを使用すると、パラメータ編集時にエラーとなります。
 ⇒ 保存中のエラー: Cannot modify a default parameter group. Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/08e7dbda-a1d9-5417-ac53-2bf6929eb531.png)




***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area