[2020年最新版] Db2 Warehouse on CloudにDb2 Data Server CLIからSSL接続する 

#はじめに
Db2 Warehouse on CloudはIBM CloudやAWSで利用できるフルマネージドDWHサービスであり、近年のクラウドへの移行においても多くの会社で利用が進んでいる。リッチなWebコンソールが標準GUIとして用意されており、SQLの実行やユーザー管理など基本的な操作はすべてブラウザから実行可能である。しかし、実際にサービスを利用してデータベースを管理・運用・開発という段階になると多くの場合はCLIからの利用が中心になる。ここではDb2 Data Server CLIを利用してDb2 Warehouse on Cloudに接続する方法を紹介する。Db2 Warehouse on Cloudに接続するCLIはいくつも用意されていて、それらの紹介だけで一つ記事がかけるのでここでは紹介しない。

#Db2 Data Server CLI接続における注意点
Db2 Data Server CLIを利用してDb2 Warehouse on Cloudに接続する方法は最もメジャーではあるものの、残念ながら公開されている多くの情報はそのままでは利用できない。この理由は、Db2 Warehouse on CloudはSSL接続が前提であるのに、公開されている情報はSSLなしでの接続方法であるからだ。というわけでSSL接続するための方法を記載する。

#Db2 Data Server CLIからSSL接続するための手順
以下がSSL接続するための大まかな手順を記載する。Db2 Data Server CLIについてすでに十分な知識がある人は、SSLのキー関連作業のみ必要になっていることがわかると思う。

1. Db2 Data Server CLIのダウンロードとインストール
2. SSLキーストアの作成と登録
3. DB2 Warehouse on Cloudのカタログ
4. 接続確認

各ステップにおける注意点は以下を参照。
##1. Db2 Data Server CLIのダウンロードとインストール
Db2 Data Server CLIのダウンロードはIBMの[fixcentral](https://www.ibm.com/support/fixcentral/)もしくはDb2 Warehouse on CloudのWebコンソールの接続情報ページから取得可能。最新版やバージョン指定をしたい場合はfixcentralからのダウンロードとなる。
###バージョンに関する注意
2020年３月現在のDb2 Warehouse on Cloudとしてはバージョン11.1以上であれば接続を保証するが、可能な限り最新版、最低でも外部表などの利用の観点から、v11.1 fp4以上を推奨する。
##2. SSLキーストアの作成と登録
SSL接続となるため、接続前にキーをストアしたCertDBを作成しておく必要がある。
**step1. CertファイルをDb2 Warehouse on Cloudのコンソールからダウンロード**
CertファイルはWebコンソールのCONNECTION INFORMATIONのDownload SSL Certificateからダウンロードする
<img width="1674" alt="client1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137326/27903db2-8130-0001-6b29-d21a13014d53.png">


**step2. Certファイルを保管するデータベースを作成する**
適当にディレクトリ作成して、その配下にDb2WoCのWebページよりダウンロードしたCertファイルを配置しておく
```~$ mkdir SSL```
```~$ ls SSL
DigiCertGlobalRootCA.crt```

**step3. keystoreDBを作成する。データベース名keystore.kdbおよびパスワードのdb2inst1は適当なものに変更する**
```~/SSL$ gsk8capicmd_64 -keydb -create -db keystore.kdb -pw db2inst1 -stash
~/SSL$ ls
DigiCertGlobalRootCA.crt  keystore.crl  keystore.kdb  keystore.rdb  keystore.sth
```

**step4. Db2WoCから取得したcrtファイルをkeystoreに保管する**
```~SSL$ gsk8capicmd_64 -cert -add -db keystore.kdb -pw db2inst1 -label BLUDB_SSL -file DigiCertGlobalRootCA.crt
```
ちなみに、複数のDb２ Warehouse on Cloudを登録する場合は、このstepからlabelを変更して実行する。

**step5. 作成した2つのファイルの場所を登録する**
```~SSL$ db2 update dbm cfg using SSL_CLNT_KEYDB /home/db2inst1/SSL/keystore.kdb```
```~SSL$ db2 update dbm cfg using SSL_CLNT_STASH /home/db2inst1/SSL/keystore.sth```

##3. DB2 Warehouse on Cloudのカタログ
Db2 Warehouse on Cloudに接続するために、ノード（ホスト）の情報と、ノード上のデータベースの情報の2つを登録する。
**ノード情報の登録**
ポートが５０００１であること、SSL接続をするためオプションを付ける。ノード名をdb2wocsとして登録しているが、好きな名前で良い。
```~$ db2 catalog tcpip node db2wocs remote db2w-xxxxxxxx.db2w.cloud.ibm.com server 50001 security ssl```
**データベースの登録**
Db2 Warehouse on CloudではデータベースはBLUDBというDBが利用可能。このデータベースをローカル名db2wocとして登録する。コマンド末端のdb2wocsは登録したノード名に合わせる。
```~$ db2 catalog db bludb as db2woc at node db2wocs```

##4. 接続確認

```~$ db2 connect to db2woc user kai using パスワード```
   Database Connection Information
 Database server        = DB2/LINUXX8664 11.1.9.0
 SQL authorization ID   = KAI
 Local database alias   = DB2WOC

#よくあるエラー
**SSLのCertファイルの構成ができていないときのエラー出力**
```$ db2 connect to wocs
SQL30081N  A communication error has been detected. Communication protocol
being used: "TCP/IP".  Communication API being used: "SOCKETS".  Location
where the error was detected: "166.9.44.31".  Communication function detecting
the error: "recv".  Protocol specific error code(s): "104", "*", "0".
SQLSTATE=08001```

**ノード情報の設定に間違いがある場合のエラー出力**
```~$ db2 connect to db2woc
SQL30081N  A communication error has been detected. Communication protocol
being used: "SSL".  Communication API being used: "SOCKETS".  Location where
the error was detected: "".  Communication function detecting the error:
"sqlccSSLSocketSetup".  Protocol specific error code(s): "414", "*", "*".
SQLSTATE=08001```

**ノードカタログしたあとにterminateをし忘れたときのエラー出力**
```$ db2 connect to db2woc
SQL10013N  The specified library "GSKit Error: 100" could not be loaded.
SQLSTATE=42724```