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

# はじめに
近年AIツール群の利用やデータ分析のために、Cloudサービスからオンプレミスにあるデータベースに接続するニーズが高まっています。
本記事ではIBM Cloud上での実装例としてIBM Cloudのデータ分析基盤であるCloud Pak For Data as a Service(CP4DaaS)からオンプレミスにあるデータベース(PostgreSQL)への接続方法について記載します。

また、本記事ではオンプレミスの環境へセキュアに接続するためにIBM Cloudの新しいソリューションである"Satellite Connector"を使用しています。
本ソリューションを使用することでオンプレミス側にAgent導入用のLinuxサーバー(冗長構成の場合は2台必要)を用意するだけでセキュアなTLSトンネリングによる接続が可能になります。
本サービスを利用すると非常に簡単に接続が作成できるので、IBM Cloud上でデータ分析やAIツールを利用する際はぜひご利用ください。

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

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

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

今回は大阪リージョンに建てたVPCをオンプレミス環境と想定し、その中にデータベースを建てて、CP4DaaSから東京リージョンにSatellite Connectorを用いて接続することを目標とします。

構築手順は以下のdocsを参考に進めます。
[docs : Satellite コネクターの作成](https://cloud.ibm.com/docs/satellite?topic=satellite-create-connector)

今回の構成図は以下の通りです。
![スクリーンショット 2023-10-29 21.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/a28970f4-3b55-af77-3b45-76a4b7ddb781.png)

# 事前準備
すでに以下の環境は構築済みであることを想定します。
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. 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は後ほど使用するのでどこかに記録しておきます。

## 2. ConnectorAgentの作成
次にAgent用サーバーにConnectorAgentを作成します。
### 2-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のコンテナを作成する準備ができました。

### 2-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."}
...
```
最後の行でログを確認していますが、ちゃんと起動していることがわかります。
また、この時点で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)

### 2-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)

### 2-4. CP4Dプラットフォーム接続の作成
CP4DからPostgresqlのデータが見れるようにプラットフォーム接続を作成します。
CP4Dのホーム画面の左側のメニューから「データ」→「プラットフォーム接続」を選択します。
![スクリーンショット_2023-10-27_17_09_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/a9e540fa-e663-0117-7b8a-511ffe580159.png)

「新規作成」ボタンから接続を作成します。
![スクリーンショット_2023-10-27_17_10_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/4936734f-2b99-28f2-ec9f-952547f453bf.png)

接続先であるPostgresqlを選択します。
![スクリーンショット_2023-10-27_17_11_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/f3817ec8-7fee-6f9c-bedb-7bdb0e1a2fba.png)

以下接続の設定を行います。「名前」は接続の名前を任意につけます。
![スクリーンショット 2023-10-27 17.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/5fc4fe33-6027-3c31-2388-9e9a919d3c99.png)
「データベース」にデータベース名を任意に入力し、「ホスト名」はエンドポイントで作成したc-01.private.jp-tok.link.satellite.cloud.ibm.com、「ポート」はエンドポイントアドレスで確認した32780を指定します。
![スクリーンショット 2023-10-28 1.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/3261e155-f8f2-6acb-f443-2d0dca5c9fca.png)

「専用接続」でIBM Cloud Satelliteを選び、最初に作成したConnectorを選択し、「作成」ボタンをクリックしたら作成完了です。
![スクリーンショット 2023-10-27 17.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/809eb548-8a74-55f1-3c00-0ee1cb2eef37.png)

### 2-5. 接続テスト
Postgresqlへの接続をチェックします。作成した接続を選択し、「接続のテスト」を選択します。「テストが正常に終了しました」と表示されたら正しく接続が作成されています。
![スクリーンショット 2023-10-26 10.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/5ce48476-730d-04d0-af24-172d0e9aafd5.png)

### 2-6. データベースの確認
次に実際にデータベースの中身を確認するためにCP4Dのプロジェクトを作成します。CP4Dのホームから左側の「すべてのプロジェクトの表示」を選択します。

![スクリーンショット_2023-10-29_19_13_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/581133b6-dae1-941a-6b0a-0a7cafe5d652.png)

右上の「新規プロジェクト」を選択し、空のプロジェクトを作成します。

![スクリーンショット_2023-10-29_19_13_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/59318a45-f314-bd65-6f26-6c95a7e0fbc9.png)

![スクリーンショット_2023-10-29_19_51_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/e70f6007-0ea3-e040-596e-b11f2519914d.png)

作成できたらプロジェクトを開き、試算メニューから「新規資産」を選択します。

![スクリーンショット_2023-10-29_19_54_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9851690b-7311-21bd-bbe3-72ce1e1baab1.png)
接続を選択。

![スクリーンショット_2023-10-29_19_54_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/2f1de605-2439-ffcf-81ab-2429a3ec22a4.png)

プラットフォームから作成したコネクターを選択します。

![スクリーンショット_2023-10-29_19_56_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9247930f-522c-474e-2b82-5e072a4c1c93.png)

資産にコネクターが表示されました。次に「資産のインポート」を選択します。

![スクリーンショット_2023-10-29_20_53_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/baf31f9a-7ff0-36eb-c6a4-e12768a9636e.png)

資産のインポートではデータベースの中からテーブルをインポートできます。今回はコネクターから「public」スキーマの「test_table」テーブルを選択します。

![スクリーンショット_2023-10-29_20_49_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/e6bf5ef7-c426-facb-0d84-a21cfacd047c.png)

![スクリーンショット_2023-10-29_20_51_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9ae17292-39dc-f3d5-cfa6-3fc292730b9e.png)

資産に先ほどのテーブルが追加されています。

![スクリーンショット_2023-10-29_20_51_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/05262521-9dd7-0f2f-10fe-c1fa0828211d.png)

中身も確認することができます。

![スクリーンショット_2023-10-29_20_51_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/59f25273-30db-a968-6d91-e27eedb3f033.png)