Google Cloud SQL をお触りしてみた（v15対応）

本エントリーは[PostgreSQL Advent Calendar 2023](https://qiita.com/advent-calendar/2023/postgresql)のシリーズ２の11日目です

# はじめに
PostgreSQL Advent Calendarへの投稿、５年目になりました

今年は本業がかなり忙しく、PostgreSQLアンカンファレンスにもなかなか参加できず、ましてや何かをOUTPUTする時間の確保も難しい状況でした
PostgreSQL Conference Japan 2023 には参加しようと段取りしてましたが、急遽体調不良でキャンセルすることに:sob::mask:
体調管理は大事です！いつどこで何が起きるか？はわからないものです。
***
継続は力なり。でアドベントカレンダーには投稿しよう！と思ったのも遅く、すでに満席状態。シリーズ２を作って頂きこの度の投稿に至ります。
今年のトピックのAlloyDB AI や pgVectorについては多くの方が投稿されていますので、初心に帰り、Cloud SQL を起動してみます。
# 本記事のテーマ
Google Cloud コンソールのSQLサービスのメニューに遷移すると、「ご利用開始の手順」が記載されています。
その手順に従って、進めて行きます。
前回の投稿（2020/12/17）からの差分をピックアップしていきたいと思います。
※2023/12/09時点の記事です
# 本題
## ご利用開始の手順
1. インスタンスの作成
データベース エンジンと初期構成を選択する
2. ネットワークを設定して接続する
Cloud SQL Proxy などのネットワーク セキュリティ オプションを確認します。次に、クラウド サービスまたはローカルマシンに接続します。
:information_source:`今回はプライベートIPのみ設定します`
3. データを取り込む
Cloud Storage からインポートするか、データベースの移行を使用します。
:information_source:`今回はデータインポートは行わないです`

## 調理します！
1. インスタンスの作成
「インスタンスを作成」ボタンをポチります。
日本語ドキュメントだと、利用できるバージョンは次のとおりです

https://cloud.google.com/sql/docs/postgres/db-versions?hl=ja#major_and_minor_versions_supported_by

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/e0559de2-b234-2537-9a8c-29b7ecbf64d9.png" WIDTH="67%">

また、各バージョンの利用開始日は次の通りです

|| CloudSQLの利用開始日 | PostgreSQLのリリース日 |
|:-----------|:------------:|:------------:|
|PostgreSQL 16|          |[2023-09-14](https://www.postgresql.org/docs/16/release-16.html) |
|PostgreSQL 15|2023/05/24|[2022-10-13](https://www.postgresql.org/docs/15/release-15.html) |
|PostgreSQL 14|2021/11/11|[2021-09-30](https://www.postgresql.org/docs/14/release-14.html) |
|PostgreSQL 13|2020/11/05|[2020-09-24](https://www.postgresql.org/docs/13/release-13.html) |
|PostgreSQL 12|2020/05/21|[2019-10-03](https://www.postgresql.org/docs/12/release-12.html) |
|PostgreSQL 11|2019/09/27|[2018-10-18](https://www.postgresql.org/docs/11/release-11.html) |
|PostgreSQL 10|2020/03/27|[2017-10-05](https://www.postgresql.org/docs/10/release-10.html) |
|PostgreSQL 9.6|2018/04/01|[2016-09-29](https://www.postgresql.org/docs/9.6/release-9-6.html) |

データベース エンジンの選択は、「PostgreSQL を選択」し、PostgreSQL インスタンスの作成画面に移ります
<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/7a4d909b-6206-400b-d81d-8a11d425551e.png" WIDTH="67%">

- インスタンスID
- 管理ユーザ postgres のパスワード
- データベースのバージョン
を設定します

:::note info
前回の投稿では、エディションはありませんでした。

Cloud SQL のエディションによって、選択できるデータベースのバージョンが変わります
![スクリーンショット 2023-12-09 143227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/f490689b-aa94-f9cf-72c9-02100382c3fc.png)

Enterprise PLUSは最新版から２バージョンが選択できます
![スクリーンショット 2023-12-09 143252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/ace33bcb-7833-9115-0887-c51fe2b01434.png)

Enterprise は、利用できるすべてのバージョンが選択できます
![スクリーンショット 2023-12-09 143309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/c6d767db-4690-aa83-5b1d-e9380c8cd6b3.png)

エディションごとにプリセットが選択できるようになっています
本番環境プリセットを比較してみました。
<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/8a70cac1-a49b-6e90-cd78-f8985812814f.png" WIDTH="67%">
:::

今回は（課金も怖いので）Enterprise エディションで、サンドボックスプリセットを選択します。

- リージョンとゾーンを設定します。
アイオワから東京に変更します
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/e448fb6a-1dda-8039-7164-9af91e91f273.png" WIDTH="67%">
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/9d92d131-ef3b-5f5d-b643-0331c544dcfd.png" WIDTH="67%">

> 以前から日本は割高ですが、円安もあって更に割高感がマシマシ

- 可用性
シングルゾーンにします
- インスタンスのカスタマイズ
マシンの構成、ストレージタイプは、そのままにします
- 接続設定
パブリックIPは割り当てず、VPC内のみで確認しようと思います
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/b05f166f-2737-967c-7644-7d79e9323ee3.png" WIDTH="67%">
- データの保護
- メンテナンス
- フラグ（データベースパラメータ）
は、標準設定とします
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/117d1e58-acf7-7a44-2be9-08902222aa96.png" WIDTH="67%">

インスタンス作成前に費用内訳（概算）が確認できます
<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/8cda7bb4-7567-406d-c0a5-5d18ca4348ea.png" WIDTH="67%">

> ん～:thinking:
サンドボックスと言いながらも、１日６５０円位かかる。
もたもた１週間かけてると、４，５５０円。個人で負担するには高いなぁ。

インスタンス作成ボタンを押します
デプロイされます

利用できる拡張機能ですが、このあたりのドキュメント

https://cloud.google.com/sql/docs/postgres/extensions?hl=ja

から確認できます

その他の拡張機能

https://cloud.google.com/sql/docs/postgres/extensions?hl=ja#miscellaneous-extensions

にいました！ ***pgVector*** !!!
> 0.5.0が使用できる見たいです

<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/2f0412b4-b2e1-8657-e1b1-7f64959422f8.png" WIDTH="67%">

デプロイされました。７分くらいかかりました
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/9659ee70-d238-10f8-51c5-592edeaeb263.png" WIDTH="67%">
<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/8dce1df9-a613-a4fa-0b77-229102cc198a.png" WIDTH="67%">

## 実食！お味はいかが？（接続確認）
:::note warn
プライベートIP構成だと、CLOUD SHELLから簡単には利用できないです:innocent:
:::

### Cloud SQL のプライベートIP と パブリックIPの違い
今回の検証期間で、公式ドキュメントを見つけられなかったのですが、
- パブリックIPは、外部アクセスできる（グローバルIPをマッピングできる）VPC内のIPアドレス
- プライベートIPは、プロジェクト内に定義されるVPCとは別のGoogle Cloud が管理するVPC内のIPアドレス

のようです。

### 確認環境構築
今回の接続確認では、プロジェクト内VPCでGCEを１インスタンス立ち上げて確認します
> CloudSQLへプライベートIPでアクセスできるように、VPCネットワークの設定で、VPCネットワークピアリングとプライベートサービスアクセスの設定を行っておきます。

接続確認用なので、GCEインスタンスは可能な限り小さなインスタンスにします（課金！）
![スクリーンショット 2023-12-10 114351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/b04d0679-f5e6-8ac6-fe49-0912a098b5be.png)

デプロイが終わったら、ブラウザSSHでサーバ接続します
psqlクライアントをインストールします
``` 
sudo apt install -y postgresql-client
```

```
tail /var/log/apt/history.log
```
psql のバージョン確認
```
psql --version
```
![スクリーンショット 2023-12-10 115147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/1a6f1cd1-2467-984d-bbbf-007211eca643.png)
> 事前検証時にpsqlは導入済みなんですけどね:sweat_smile:

### 検証作業
```
psql "host=xx.xx.xx.xx user=postgres" 
```
で接続します。
アドレスは、Cloud SQL インスタンス情報に表示されている `プライベートIPアドレス` を指定します
![スクリーンショット 2023-12-10 120310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/dfef855b-e200-a33e-a906-ca2fe6dbdad2.png)
`\l` でデータベース一覧を確認（ページャが入っちゃうので別画面コピー）
![スクリーンショット 2023-12-10 120344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/c4356000-1aed-2a3b-94d8-7059b55673c5.png)

接続できました！:smiley:

## デザートをお付けします（追加の確認作業）

### 旬なものが必要ですよね
Google Cloud blog (2023年7月13日) が気になっていたんですよね。

https://cloud.google.com/blog/ja/products/databases/using-pgvector-llms-and-langchain-with-google-cloud-databases

> 合間を見つけてはpgVectorが何者なのか？をググったり、chatGPTってみたり、google bard先生にご指南を受けたりしてましたが、全然理解できない。。。ポンコツです:sunglasses:

環境作ったので、とりあえずコピペで実行してみます
word2vecとかでサンプルデータを作っても良かったのですが、vector型の確認が目的ですので、それらしいデータで確認します
こちらの`jwsan-2145`を利用させていただきました

http://www.utm.inf.uec.ac.jp/JWSAN/

テーブル定義
```SQL
CREATE TABLE vitem (
    pairid text PRIMARY KEY,
    word1 text,
    word2 text,
    embedding vector(6)
)
```
特にエラーは出ませんでした
![スクリーンショット 2023-12-10 130346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/d756e67b-8815-3cf2-564d-bc4f74e48c3a.png)

１件だけ追加し検索してみて、特に問題はなさそうですので、再作成して全件登録してみます

![スクリーンショット 2023-12-10 131902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/5280d44f-81d6-ee4f-73d2-e8471e713312.png)
> 色々エラーは出てますが、リアリティがあるのでそのまま添付します

テストデータをINSERTします

確認方法ですが
`心地よい＋楽しい`のベクトルデータ？を指定してCOS類似値（`<=>`）で検索しました
```
SELECT * FROM vitem WHERE pairid = 'p0107';
 pairid |  word1   | word2  |        embedding        
--------+----------+--------+-------------------------
 p0107  | 心地良い | 楽しい | [3,3.44,4.48,180,130,0]
(1 row)
```
なんか結果が返却されましたので、動作としては問題なさそうです
```
postgres=> SELECT *, embedding <-> '[3,3.44,4.48,180,130,0]' as cossim 
FROM vitem
ORDER BY embedding <-> '[3,3.44,4.48,180,130,0]'
LIMIT 5;
 pairid |  word1   |   word2    |        embedding        |       cossim       
--------+----------+------------+-------------------------+--------------------
 p0107  | 心地良い | 楽しい     | [3,3.44,4.48,180,130,0] |                  0
 p0493  | 入れる   | 差し込む   | [2,3.77,4.38,180,130,0] | 1.0577806679290358
 p0152  | 煩い     | 騒々しい   | [3,2.94,3.7,180,130,1]  | 1.3632314066259898
 p0137  | 尊い     | 恐れ多い   | [3,2.67,3.86,180,130,1] | 1.4061650568420978
 p0289  | 交ぜる   | 掻き混ぜる | [2,3.69,4.2,180,130,1]  | 1.4631815113102964
(5 rows)
```

>正しいのか？はデータの準備自体があっているのか？がわかっていなので、よくわかんないです。
期待したのは、`心地よい`と`楽しい`に類似するキーワードが出てくると思ってました（そんなに甘くない世界:sob:）
ベクトルとして指定する値がここじゃないのかもしれませんし、そもそも値が大きすぎる気もしますし。

<IMG SRC="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321061/281e7cab-8ca9-883f-b2f1-d0550b4e0a88.png" WIDTH="67%">

# 最後に
- 環境構築は頻繁に行うものではないので、見ることも少ないと思いますが、提供サービスの変化によりポチる前の確認・検討事項も変化します。
- デプロイ直前でやめてしまえば、環境構築時に必要な情報は確認できそうです
- クライアント端末パソコンの性能価格比も向上し、クラウドのインスタンスを起動しなくても、dockerやpostgreSQL WASM で確認が行えるようになっています

:::note warn
pgVectorの使い方はよくわかんない（勉強不足）
- クラウド外部への通信料（データ可搬コスト）を低減させベクトル解析や近似検索を行えるようになる？
- 近似検索は膨大な量データになるとマシンスペックが必要になる？
:::

最後までお読みいただき、ありがとうございます。少しでもお役に立てれば幸いです。