watsonx.dataからSatellite Connectorを用いたオンプレミスのデータベースへの接続方法

# はじめに
近年基盤モデルや生成AIが人気ですが、2023年の7月にIBMからwatsonxが利用可能になったので、IBMCloudでも生成AIを利用することが可能になりました。本稿ではwatsonxの中のwatsonx.dataについて記載します。

watsonx.dataはすべてのデータ、分析、AI ワークロードを拡張するために最適化したレイクハウスを作成することが可能です。2023年11月現在ではIBM Cloudの他にAWS上にも構築可能で、IBM Cloudではダラス、ワシントンDC、フランクフルトで利用可能です。watsonx.dataについてより詳細な情報は[docs](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-getting-started&locale=ja)を参照ください。

また、本記事ではオンプレミスの環境へセキュアに接続するためにIBM Cloudの新しいソリューションである"Satellite Connector"を使用しています。
本ソリューションを使用することでオンプレミス側にAgent導入用のLinuxサーバー(冗長構成の場合は2台必要)を用意するだけでセキュアなTLSトンネリングによる接続が可能になります。
本稿ではwatsonx.dataからオンプレミス上にあるデータベースへSatellite Connectorを用いたアクセス方法について記載します。

本記事ではSatellite Connectorを用いてwatsonx.dataからオンプレミスのデータベースへの接続に関して記載していますが、冗長化などのより詳細な接続手段について以下の記事、docsも参考になりますので、ぜひご覧ください。

https://qiita.com/testnin2/items/73c3e8275e0e278f2c3c

[docs : Satellite コネクターの概要](https://cloud.ibm.com/docs/satellite?topic=satellite-understand-connectors)

今回は以下のdocsの手順を参考に構築します。
[docs : Satellite コネクターの作成](https://cloud.ibm.com/docs/satellite?topic=satellite-create-connector)
[docs : watsonx.data データベース・カタログペアの追加](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-reg_database)

本稿の構成図は下記の通りです。
![スクリーンショット 2023-11-08 16.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/8cb9921c-7cdc-74f1-12a0-94ba6a89c18f.png)

今回はフランクフルトのwatsonx.dataから東京リージョンにあるSatellite Connectorを経由し、大阪リージョンにあるオンプレミス想定のデータベース(PostgreSQL)に接続方法を記載します。本構成ではwatsonx.dataとSatellite Connectorは別リージョンで構成していますが、同リージョンに作成しても問題ないです。最終的な目標としてwatsonx.dataのポータル画面からデータベース内のテーブルを確認できるようにします。

# 事前準備

すでに以下の環境は構築済みであることを想定します。

1. VPC(大阪リージョン), サブネット(今回は192.168.2.64/26)
2. 1のVPCサブネット内のConnector Agent用仮想サーバー(2Core, 4GB, CentOS, 大阪リージョン, floating IP付与済み)
3. 1のVPCサブネット内のPostgresql用仮想サーバー(2Core, 4GB, ubuntu, 大阪リージョン)

Agent用サーバーからPostgresqlサーバーへJDBCで接続できるようにあらかじめ設定してあるものとします(CP4DaaSからPostgreSQLへの接続はJDBC接続で行います)。
また、オンプレミス想定のVPC環境はSatellite Connector導入のためのFloating IPしか公開されておらず、データベースに関しては外部との通信は一切できない構成になっております。


# 構築手順
## 1. watsonx.dataの構築
まずはじめにwatson.dataを構築していきます。
IBMのポータル画面の左側のメニューから「watsonx」を選びます。
![スクリーンショット_2023-11-08_14_33_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/2ee6d260-3ba6-2093-3f24-dde3274ef852.png)

watsonx.dataの「Get started」ボタンを選択します。
![スクリーンショット_2023-11-08_14_35_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/80160031-57d3-55b5-481c-82a3efc73700.png)

watsonx.dataのオーダー画面に移行するのでロケーションとサービス名を入力します。設定が終わったら、右側の利用条件にチェックを入れ、「作成」ボタンを押して作成します(名前、タグは自由で問題ないです)。
プロモーションクレジットを使用したい場合は右側の「Apply a code」にコードを入力してください。
![スクリーンショット_2023-11-07_13_21_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/3fc76872-34ef-9f0b-8186-2229cbf7730e.png)
![スクリーンショット_2023-11-07_13_21_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/d0942e93-a201-716a-7da7-166741fe6a57.png)

作成されたインスタンスはポータル左上ハンバーガーメニューから「リソースリスト」→「データベース」で確認できます。
![スクリーンショット_2023-11-08_14_51_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/1be20086-a134-dcb4-1df4-8837a698495f.png)

クリックするとwatsonxのサービス画面が出るので、右上の「Webコンソールを開く」を押して、watsonxのポータル画面に移行します。
![スクリーンショット_2023-11-08_14_53_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/7bcacbde-efaf-4424-3bb9-304fdbe06830.png)

watsonxの初期設定を行います。
![スクリーンショット 2023-11-07 13.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/396881b2-3dcd-4d01-ef34-115a871b05aa.png)

バケット構成は「新規IBM管理バケットのプロビジョン」を選択します。
![スクリーンショット 2023-11-07 13.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/8b96a358-bb35-6554-b519-2e114ffe3f4f.png)

カタログ構成では「Apache Iceberg」を選びます。
![スクリーンショット 2023-11-07 13.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/65b8714e-0a38-6244-b987-9a3af0b15e60.png)

エンジン構成ではタイプ「Presto v0.282」、サイズを「スターター」で選びます。
![スクリーンショット 2023-11-07 13.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/e1507c3e-9045-b40a-a636-12a2f42e68b4.png)

以上の項目入力完了したら12分ほどでwatsonx.dataが作成されます。下の画面が表示されてもエンジンがまだ構築されていないのでエンジンが1/1になるまで待ってください。
![スクリーンショット_2023-11-07_13_39_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/f53b434d-dea1-b955-c96d-2ead3be4d557.png)

以上でwatsonx.dataの構築は完了です。

## 2. Satellite Connectorの注文
次に東京リージョンでSatellite Connectorを作成します。ポータル画面の検索機能から「Satellite」を検索します。
![スクリーンショット_2023-10-25_9_37_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/7adf6e85-7606-6323-fb38-e52ce9b8e44e.png)

Satelliteのホーム画面に移行したら、左側メニューの「Connector」を選択し、右上の青い「Connectorの作成」ボタンを選択します。
![スクリーンショット_2023-10-25_9_38_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4b67ac3e-8b71-66d8-d6c8-589f6e3b3157.png)

今回は東京リージョンにConnectorを作成するので、リージョンにjp-tokを指定し、「コネクターの作成ボタン」で作成します。

作成したConnectorを選択すると以下の画面が表示されます。
![スクリーンショット_2023-10-25_12_10_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/e3051005-3d6e-38d3-6f94-3d83be65f6fa.png)
Connector IDは後ほど使用するのでどこかに記録しておきます。

## 3. ConnectorAgentの作成
次にAgent用サーバーにConnectorAgentを作成します。
### 3-1. Agent導入のための準備
まずはじめにConnectorAgentをインストールするため、Agent用サーバーにsshでログインしdockerのインストールを行います。
```linux:dockerのインストール
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
systemctl enable docker
systemctl start docker
```
続いて環境ファイルを作成し、環境変数を設定します。
```linux:ファイル作成
mkdir -p ~/agent/env-files
vi ~/agent/env-files/env.txt
```
`env.txt`の中身は以下の通りに設定します。
```linux:env.txt
SATELLITE_CONNECTOR_ID=U2F0ZWxsaXRlQ29ubmVjdG9yOiJjazk0dDI0dDFjcGQ4dms0NDg1ZyI
SATELLITE_CONNECTOR_IAM_APIKEY=xxxxxxxxxxx
SATELLITE_CONNECTOR_REGION=jp-tok
SATELLITE_CONNECTOR_TAGS=sample tag
```
SATELLITE_CONNECTOR_IDはConnector画面で確認できます。APIKEYはポータルのIAMから作成できます。詳しくは[docs](https://cloud.ibm.com/docs/account?topic=account-userapikey&locale=ja&interface=ui)を参照ください。
これでConnectorAgentのコンテナを作成する準備ができました。

### 3-2. Agentの作成
まずはAgentイメージをpullするため、Container Registoryにログインします。パスワード要求にはAPIKEYを入力します。
```
docker login -u iamapikey icr.io
Password:
Login Succeeded
```
ログインができたらConnectorAgentのイメージをコンテナレジストリからpullします。
```
docker pull icr.io/ibm/satellite-connector/satellite-connector-agent:latest
docker image ls
REPOSITORY                                                 TAG       IMAGE ID       CREATED       SIZE
icr.io/ibm/satellite-connector/satellite-connector-agent   latest    66b5c7f42805   12 days ago   415MB
```
イメージのpullが確認できたので、コンテナを起動します。
```
docker run -d --env-file ~/agent/env-files/env.txt icr.io/ibm/satellite-connector/satellite-connector-agent:latest
aaef3d2f49ded9b800d4a2c254e42caa1941de0930547052b705912b8f4a9ccb
docker ps
CONTAINER ID   IMAGE                                                             COMMAND                   CREATED         STATUS         PORTS     NAMES
aaef3d2f49de   icr.io/ibm/satellite-connector/satellite-connector-agent:latest   "/usr/local/bin/node…"   9 seconds ago   Up 8 seconds             great_colden
docker logs aaef3d2f49de
{"level":30,"time":"2023-10-23T02:29:35.437Z","pid":13,"hostname":"aaef3d2f49de","name":"agentOps","msgid":"A02","msg":"Load SATELLITE_CONNECTOR_ID value from SATELLITE_CONNECTOR_ID environment variable."}
{"level":30,"time":"2023-10-23T02:29:35.438Z","pid":13,"hostname":"aaef3d2f49de","name":"agentOps","msgid":"A02","msg":"Load SATELLITE_CONNECTOR_IAM_APIKEY value from SATELLITE_CONNECTOR_IAM_APIKEY environment variable."}
...
```
`docker log`でログを確認していますが、ちゃんと起動していることがわかります。
また、この時点でSatellite Connectorの画面でもアクティブなエージェントとして作成したコンテナのIDが確認できます。
![スクリーンショット_2023-10-25_14_48_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/aa5b5dcb-dd8a-ecd8-fc70-9184a64fdbc9.png)

### 3-3. ユーザーエンドポイントの設定
次にオンプレミス環境にアクセスするためのエンドポイントをConnector側に作成します。
Connectorメニューから「ユーザーエンドポイント」タブ→「エンドポイントの作成」を選択し、エンドポイントを作成します。
![スクリーンショット_2023-10-25_12_24_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/86eeb4ed-05da-9d58-2973-c918c522ad0b.png)

リソース詳細は任意のエンドポイント名、宛先FQDNまたはIP(今回はDBサーバーである192.168.2.73)、宛先ポートはPostgresqlの外部接続ポートである5432番に設定します。
![スクリーンショット 2023-10-25 12.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/f3807e47-4922-8f7b-0739-b1c38e6d8bb0.png)

以降は特に設定に変更はなので次にを選択しつづけ、最後に「エンドポイントの作成」を選択するとエンドポイントの作成が完了します。
![スクリーンショット 2023-10-25 12.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/7b12c18a-9849-ec64-0278-31b48d981d8c.png)
![スクリーンショット 2023-10-25 12.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4c7ffb35-3933-9764-8d27-00baf0e45971.png)
![スクリーンショット 2023-10-25 12.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/c75497b5-9a33-ff93-6865-7fb8f7d32160.png)

作成が完了するとConnector画面から作成したエンドポイントが確認できます(c-01.private.jp-tok.link.satellite.cloud.ibm.comの32780番ポート)。このエンドポイントとポートは後ほど使用するので記録しておきます。

![スクリーンショット_2023-10-25_12_35_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/40d66c01-3330-fbd8-56c1-e245d4951bd7.png)


## 4. watsonx.dataとデータベースの接続の作成
最後にwatsonx.dataとオンプレミスのデータベースとの接続を作成します。

### 4-1. カタログ・データベースの追加
外部データベースをカタログとデータベースをインフラストラクチャー・マネージャーに追加します。インフラストラクチャー・マネージャーのカタログについては以下を参照ください。
[docs : Presto Overview](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-presto_overview)
[Prestoホワイトペーパー](https://www.ibm.com/downloads/cas/KBY4EKAO)

watsonx.dataポータルの左側の「インフラストラクチャー・マネージャー」を選択します。
![スクリーンショット_2023-11-08_15_28_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4e2927ed-dec0-a832-817d-10539a8639a5.png)

インフラストラクチャー・マネージャーの右上の「コンポーネントの追加」→「データベースの追加」を選びます。
![スクリーンショット_2023-11-08_15_27_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/81767871-3587-5033-ef1d-7d051f259512.png)

データベースの追加では以下のパラメータを入力します。
|パラメーター | 値|
|:--|:--|
|データベースタイプ|PostgreSQL|
|データベース名|オンプレミス内のデータベース名|
|ホスト名|c-01.private.jp-tok.link.satellite.cloud.ibm.com|
|ポート|32780|
|ユーザー名|データベースのユーザー名|
|パスワード|ユーザー名のパスワード|
|カタログ名|Postgresql(任意なカタログ名)|

データベース名、ユーザー名、パスワードはそれぞれオンプレミス上のデータベースで作成したものを入力します。ホスト名、ポートはSatellite Connectorのユーザーエンドポイントからエンドポイントアドレスの値を入力します。

また、パラメータ入力後に「Test connection」をクリックすることで接続ができているかのテストを行うことができます。
![スクリーンショット_2023-11-07_14_15_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/fd281e00-1781-76be-cebb-bce1926b0c41.png)

接続ができていると以下のように「Successful」と表示されます。
![スクリーンショット_2023-11-08_12_16_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9aabbf5e-87a0-5e28-e322-c8efd3e0b7ee.png)


全ての項目を入力後、追加ボタンをクリックしてデータベースを追加します。
作成後、以下のようにカタログとデータベースが追加されていることがわかります。
![スクリーンショット 2023-11-08 15.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/5c90479f-ce4e-d9ef-35c1-d9e891d9dc35.png)

### 4-2. エンジンとカタログの接続
次にエンジンとカタログを接続します。先ほど作成したカタログにカーソルを合わせ、「関連付けの管理」を選択します。
![スクリーンショット_2023-11-08_15_50_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/501f4687-df28-c385-1c32-2eb1c5107a91.png)

エンジンのstarterのチェックボックスにチェックを入れ、「保存してエンジンを再起動する」をクリックします。
![スクリーンショット 2023-11-08 12.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4873d3a4-0789-1618-c0a1-7c472750535a.png)

しばらく待つとstarterとpostgresqlの接続ができていることが確認できます。
![スクリーンショット 2023-11-08 16.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4cbe102f-baee-08ae-d90c-0270e61f71d0.png)

### 4-3. データベースの中身の確認

最後に実際にデータベースの中身を見ることができるのか確認してみます。
左側のメニューの「データマネージャー」を選択します。
![スクリーンショット_2023-11-08_16_01_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/02bfc6bc-51dc-c8f0-6f23-771d507880f9.png)

左側の関連づけられたカタログの中に先ほど作成したカタログのpostgresqlが確認できます。下矢印をクリックするとスキーマや中のテーブルも見ることができます。
![スクリーンショット 2023-11-08 12.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/0b876418-766d-d6de-c46e-91e92de44353.png)

また、テーブルをクリックすると表スキーマからテーブルのパラメータを確認でき、データサンプルからはどのようなデータが入っているかを確認することが可能です。
![スクリーンショット 2023-11-08 12.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/0b984c38-7068-f0f5-9480-a3ff01955151.png)

# まとめ
本記事ではwatsonx.dataと外部データベースの接続手順を紹介しました。これにより複数の外部データベースをwatsonx.dataに集め、データの収集・分析ができるようになるかと思います。watsonx.dataには他にもwatsonx.aiで生成したAIとの連携もできるらしいので試してみたいですね。

watsonxについてより詳しく知りたい場合は以下を参照してみてください。
watsonxの機能・ユースケースなど : [IBM watsonx](https://www.ibm.com/jp-ja/watsonx)
watsonxのチュートリアル : [(docs) Allowing trial experience](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-tutorial_hp_intro)
watsonx.dataのdemo : [Get started with watsonx.data](https://mediacenter.ibm.com/media/watsonx.data+demoA+Get+started+with+watsonx.data/1_brvv64az)
また、Qiitaでwatsonxのタグで調べるとwatsonxの実装についての記事がいくつか出てくるのでそちらも是非ご覧ください。