Amazon RDS for Db2: AWSでフルマネージドDb2 データベースを作ってみた!

2023年11月27日のAWS re:Invent 2023 (USで開催されたAWS最大級のイベント)で、Amazon Relational Database Service (Amazon RDS) for Db2のリリース（GA）が発表されました。
フルマネージドなDb2がついにIBM Cloudに加えてAWSでも使えるようになったのです。
当記事ではAmazon RDS for Db2にてデータベースを作る手順を説明します。
(2024年6月17日時点の情報です)
>2024/06/26 その時点のWeb GUIに更新

# 0. 前準備
Db2ライセンスはBYOLとなっており、あらかじめDb2ライセンスを購入していることが前提となっています。
2024/06/17現在、日本で「Through AWS Marcketplace」は使用不可となっています
導入にはIBM Customer Number(ICN)とIBMサイトID(サイト番号)が必要ですので、その値を準備しておきます。

# 1. カスタムパラメータグループの作成
IBM Customer Number(ICN)とIBMサイトID(サイト番号)はパラメータグループ　で指定します。
IBM Customer Number(ICN)とIBMサイトID(サイト番号)をセットしたパラメータグループが未作成の場合は、以下の方法で作成してください。
### 1.1 Amazon RDSのメニューからパラメーターグループをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a10050d1-d639-6085-78da-76c468e08703.png)

### 1.2 「パラメーターグループの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c9e2155a-360c-0796-57a5-19ddb6687544.png)

### 1.3 「パラメーターグループ名」と「説明」を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b5d6e777-9256-9f87-d6e7-626ffe01cd3a.png)


### 1.4 「エンジンのタイプ」と「パラメータグループファミリー」をセットし、「作成」をクリック
**エンジンのタイプ**：
- Db2 Advanced Editionの場合は`IBM Db2 Advanced Edition`
- Db2 Standard Editionの場合は`IBM Db2 Standard Edition`

をプルダウンから選択します。

**パラメータグループファミリー**:
パラメーターグループファミリー」をセット
- Db2 Advanced Editionの場合は`db2-ae-11.5`
- Db2 Standard Editionの場合は`db2-se-11.5`

をプルダウンから選択します。
（最後の数字はDb2のversionです。今後versionが選択できるようになった場合は、導入したいversionの数字を選ぶようにします。2024年6月17日現在は11.5のみです）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/50193f27-3b4e-c9a3-55ca-03bc790a1ff2.png)




新しくパラメータグループが作成されます。

### 1.5 作成したパラメータグループをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/73cb01ad-8afa-0963-d4d8-e1ca3ffec261.png)


入力可能なパラメータ一覧が表示されます:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/68c2f68e-408b-534a-f8fa-3d3d0bf8870e.png)

### 1.6　「編集」をクリックし、　「パラメータをフィルタリング」と書かれたフィルター入力ボックスに、`rds`と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/15e66c4e-d292-b06e-0862-74fe525cba6c.png)

IBM Customer Number(ICN)とIBMサイトID(サイト番号)を入力するパラメーターが表示されます：
- rds.ibm_customer_id
- rds.ibm_site_id

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/44f22a63-3953-b476-097a-843cd4abfb7e.png)

### 1.7　IBM Customer Number(ICN)とIBMサイトID(サイト番号)を入力し、「変更を保存」をクリックします。

- `rds.ibm_customer_id`: IBM Customer Number(ICN)の値を入力
- `rds.ibm_site_id`: IBMサイトID(サイト番号)の値を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c5a9fe0d-7c9e-2efb-749b-4a3d01fd270c.png)

無事保存できました：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1718df94-62f8-8102-9a40-50893ffd264e.png)

# 2. Amazon RDS for Db2 インスタンスの作成
パラメーターグループが作成できたら、Amazon RDS for Db2 インスタンスを作成しましょう。

### 2.1 Amazon RDSのメニューから「データーベース」をクリックし、「データベースの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/585f82e3-3914-4745-cfeb-6e033bfd4538.png)

### 2.2 「データーベースの作成」画面で必要事項を入力後、 一番下にある「データベースの作成」をクリック
画面を下にスクロールしながら入力していってください。
#### 1. データベース作成方法を選択
「標準作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a9739f7f-8215-abae-8fc1-426e092788b4.png)
#### 2. エンジンのオプション
- `エンジンのタイプ`: もちろん`IBM Db2`を選択
- ` エディション`: ライセンスに合わせて「IBM Db2 Standard」 or 「IBM Db2 Advanced」を選択
- `ライセンス`: 「Bring Your Own License(BYOL)」を選択
    - 2024/06/17現在、日本で「Through AWS Marcketplace」は使用不可となっています
- `エンジンバージョン`: 使用するDb2のバージョンを選択（2024年3月25日時点では1つしか選択できません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a53ddecf-6251-94f7-7de3-03b35d88aaf1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d5a34df9-a54f-5938-c58e-b453f245752b.png)

#### 3. テンプレート
ユースケースを選択します。それに合わせた推奨値がこれより下の設定でデフォルトとしてセットされるようです（もちろん変更可能です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/dae3a0a8-478d-79d2-7130-5fe41d99a7ea.png)

#### 4. 設定
必要に応じて編集します:
- `DB インスタンス識別子`: RDSメニューの`データーベース`で表示されるものなので、わかりやすい名前を入れておきましょう。
- 認証情報の設定: 認証情報管理: 管理者パスワードの管理方法です。
  - `セルフマネージド`は自分で管理、`パスワードを自動生成`にチェックを入れるとAmazon RDSがパスワードを自動生成してくれます。
  - 自動生成されたパスワードはデータベース作成中に表示されるバナーの「クレデンシャルの詳細を表示」をクリックすると、パスワードが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/be144662-c90f-00e5-18b2-1fde73fc1697.png)



#### 5. インスタンスの設定
使用するDB インスタンスクラスを選択します。
参考：　[サポートされている RDS for Db2 インスタンスクラス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Db2.Concepts.General.InstanceClasses.html#Db2.Concepts.InstanceClasses.Supported)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/be5736b0-d9c1-6c26-5b8c-68aae51b8bde.png)

#### 6. ストレージ
ストレージタイプ, ストレージ割り当て、ストレージの自動スケーリングは自分の意図する値となるよう確認・設定するようにします。
参考：[Amazon RDS DB インスタンスストレージ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Storage.html) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8259bcc1-0abb-f968-de92-432d1806ff67.png)

#### 7. 可用性と耐久性

どちらか選択します:
スタンバイインスタンスを作成する (本稼働環境向けに推奨):　HA構成
スタンバイインスタンスを作成しないでください: シングル構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a5e7d202-f17a-5fc8-de1a-9eb929019810.png)



#### 8. 接続
必要に応じて編集します:
下記はテスト用のため、パブリックアクセスは「あり」にしています。
またVPC,DB サブネットグループ、VPC セキュリティグループ (ファイアウォール)は新規作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/2276a908-4f7e-fbc1-3e01-fae60b3bf30f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/196b00bc-9eed-48a5-5109-8f7cf1a17c29.png)

#### 9. Tags, データベース認証、　モニタリング
必要に応じて編集します:　下記はデフォルトのままです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b3971fda-824f-ce7a-2c33-266635e2a5c4.png)

#### 10.　追加設定
- 最初のデータベース名: Db2を作成してよい場合はデータベース名を入れます。文字コードはUTF8、テリトリーは US で作成されます。
    - 文字コードをUTF8から変更したい場合など後で詳細を指定して作成したい場合はブランクにしておきます。またLinux 上の DB2 データベースのバックアップを復元する予定がある場合も、データベース名を指定しないでください。
<p></p>

- DB パラメータグループ:  IBM Customer Number(ICN)とIBMサイトID(サイト番号)をセットしたパラメーターグループ名をセットします。


その他は必要に応じて編集します:　下記ピンクで囲った部分をデフォルトから変更しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e6c943bb-3d3a-c01e-fb57-7ea1a9d27660.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9d143113-c483-54b5-4b24-e688711cbac3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/44a00a27-0e0a-837e-fc63-e6d4aeaff8d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8a5b2b2f-195a-7a60-4d0e-e62069b8f528.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/17013230-3cda-792d-1fb7-cf51a761c3e1.png)





一番下には設定した構成でのコスト見積が表示されます。
設定入力が完了したら「データベースの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b8a935a4-fc65-cba4-567b-aa2be37283e5.png)


### 2.3 ステータスが「利用可能」になるまで待つ
データベースの一覧画面に戻ります。最初はステータスが「作成中」となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b8fbeb49-1d9b-ab98-b07c-9e137273927e.png)

この間、**管理者パスワードを自動生成した場合は「認証情報の詳細表示」をクリックしてパスワードを確認しておきます。表示できるのはこの1回のみらしいので、必ずここでメモっておきます**。

ステータスが「利用可能」になったら作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0231accf-cd02-87ef-8598-37b2b403de60.png)

VPC,DB サブネットグループ、VPC セキュリティグループ (ファイアウォール)を新規作成すると15分くらいかかりました。それらを既存のものを使用した場合はDBインスタンスの作成のみとなり、数分で完了するとのことです。


# 3. 接続確認
接続確認は何らかのDb2クライアントが必要です。
ここでは「[M1 Mac上でcolimaを使ってDb2 Community Edition Docker イメージを動かす](https://qiita.com/nishikyon/items/553b5c4dff473d9b6322)」で導入したDocker版のDb2 Community Edition を使って接続してみました。

参考: [IBM Db2 CLP を使用して RDS for Db2 DB インスタンスに接続する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-connecting-with-clp-client.html)

尚、DBeaverでの接続方法はこちらに説明がありました:
[DBeaver を使用して RDS for Db2 DB インスタンスに接続する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/db2-connecting-with-dbeaver.html)


## 3.1 事前準備: 接続情報の取得
接続に必要な以下の情報を取得します。
- エンドポイント
- ポート
- DB名
#### 1. データベースの画面から接続したいDBの「DB識別子」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/943b3cea-2846-de8b-cdf2-b766a82997ed.png)

#### 2.　「接続とセキュリティ」 タブから`エンドポイント`と`ポート`を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/541a4692-5183-f936-49a0-d6eaed501b6b.png)

#### 3.　「設定」 タブから`DB名`を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/854f1fb6-582d-0a2e-680b-26994784ff93.png)
ちなみに自分で決めたDB名だと思うので、覚えていれば見るまでもないです。

## 3.2 IBM Db2 CLP でnodeとdbを登録

> 「[M1 Mac上でcolimaを使ってDb2 Community Edition Docker イメージを動かす](https://qiita.com/nishikyon/items/553b5c4dff473d9b6322)」で導入したDocker版のDb2 Community Editionを使用する場合はまず以下のコマンドでコンテナのシェルに入ってください。
>```
>docker exec -ti db2server bash -c "su - db2inst1"
>```
>`db2server`はコンテナ名なので必要に応じて変更してください。

エンドポイント、DB名、ポートは[3.1 事前準備: 接続情報の取得](#31-事前準備-接続情報の取得)で取得したものを使用します。
&lt;任意のnode名&gt;は2つのコマンドで同じにします(8文字以内)。
&lt;任意のDB別名&gt; はデータベース名と同じにしても問題ありません。DB接続時に使用する名前です(8文字以内)。接続先が異なる同じDB名のDBがある場合は、それぞれユニークになるような別名にします。
尚、`as <任意のDB別名>` はオプションで省略可能です。

`db2 catalog tcpip node <任意のnode名> remote <エンドポイント> server <ポート>`

`db2 catalog db <DB名> as <任意のDB別名> at node <任意のnode名>　 authentication server_encrypt
`

コマンド例

```zsh
 db2 catalog TCPIP node awsnode remote database-1.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com server 50000
 db2 catalog database rdstest1 as rdstest1 at node awsnode authentication server_encrypt
```

最後にキャッシュをリフレッシュするため、以下のコマンドを実行します。

```sh
db2 terminate
```

## 3.2 IBM Db2 CLP で接続
`db2 connect to <カタログしたDB別名またはDB名> user <userid> using <password>`
- &lt;カタログしたDB別名またはDB名&gt;  は`as <任意のDB別名>`で設定した場合はDB別名を、設定しなかった場合はDB名を入れます。
- &lt;userid&gt; は作成時にしてしたマスターユーザー名(変更してなければデフォルト値は`admin`です)
- &lt;password&gt; はマスターユーザーのパスワードです。


例：

```sh
 db2 connect to rdstest1 user admin using xxxxxxx
```

実行例:
```
[db2inst1@db2server ~]$ db2 connect to rdstest1 user admin using xxxxxxxxxxxxxx

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.9.0
 SQL authorization ID   = ADMIN
 Local database alias   = RDSTEST1

[db2inst1@db2server ~]$
```

Queryを実行してみます
```sql
db2 "select current server from sysibm.dual"
```
作成したDB名が結果として表示されます。
実行例：
```
[db2inst1@db2server ~]$ db2 "select current server from sysibm.dual"

1
------------------
RDSTEST1

  1 record(s) selected.

[db2inst1@db2server ~]$
```
DBへの接続が確認できました！

念の為、最後に接続は切断しておきます：
```
db2 terminate
```

実行例:
```
[db2inst1@db2server ~]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@db2server ~]$
```

以上です。

# 補足
ちなみに当たり前ですが、Db2 CLIでのExport/Import/Load(Client)は普通にできました。

実行例：　上記Docker版のDb2 Community Edition 使用
```shell
[db2inst1@db2server work]$ db2 "export to authors.csv of del select * from AUTHORS "
SQL3104N  The Export utility is beginning to export data to file
"authors.csv".

SQL3105N  The Export utility has finished exporting "489" rows.


Number of rows exported: 489

[db2inst1@db2server work]$ more authors.csv
1,"Merritt",,"Eric"
2,"Linda",,"Mui"
3,"Alecos",,"Papadatos"
4,"Paul","C.van","Oorschot"
5,"David",,"Cronin"
6,"Richard",,"Blum"
7,"Yuval","Noah","Harari"
8,"Paul",,"Albitz"
9,"David",,"Beazley"
10,"John","Paul","Shen"
11,"Andrew",,"Miller"
12,"Melanie",,"Swan"
13,"Neal",,"Ford"
14,"Nir",,"Shavit"
15,"Tim",,"Kindberg"
16,"Mike",,"McQuaid"
17,"Brian","P.","Hogan"
18,"Jean-Philippe",,"Aumasson"
19,"Lance",,"Fortnow"
20,"Richard","C.","Jeffrey"
21,"William","L.","Simon"
22,"Magnus","Lie","Hetland"
23,"Mike",,"McShaffry"
24,"Norman",,"Matloff"
25,"John","E.","Hopcroft"
26,"S.",,"Sudarshan"
27,"Bruce",,"Eckel"
28,"Bill",,"Gates"
29,"Shane",,"Harvie"
30,"Ralph","P.","Grimaldi"
31,"Garry",,"Kasparov"
32,"Lawrence","C.","Paulson"
33,"Donella","H.","Meadows"
34,"Maria",,"Levitin"
35,"Joy","A.","Thomas"
36,"Scott",,"Rosenberg"
37,"Mark",,"Nelson"
38,"Hal",,"Abelson"
39,"Ray",,"Seyfarth"
40,"Fred",,"Turner"
41,"Andrew",,"Honig"
[db2inst1@db2server work]$ db2 " delete from AUTHORS"
DB20000I  The SQL command completed successfully.
[db2inst1@db2server work]$ db2 "select count(*) author_count from authors"

AUTHOR_COUNT
------------
           0

  1 record(s) selected.

[db2inst1@db2server work]$ db2 " import from authors.csv of del insert into authors"
SQL3109N  The utility is beginning to load data from file "authors.csv".

SQL3110N  The utility has completed processing.  "489" rows were read from the
input file.

SQL3221W  ...Begin COMMIT WORK. Input Record Count = "489".

SQL3222W  ...COMMIT of any database changes was successful.

SQL3149N  "489" rows were processed from the input file.  "489" rows were
successfully inserted into the table.  "0" rows were rejected.


Number of rows read         = 489
Number of rows skipped      = 0
Number of rows inserted     = 489
Number of rows updated      = 0
Number of rows rejected     = 0
Number of rows committed    = 489

[db2inst1@db2server work]$ db2 "select count(*) author_count from authors"

AUTHOR_COUNT
------------
         489

  1 record(s) selected.

[db2inst1@db2server work]$ db2 "load client from /database/config/db2inst1/work/authors.csv of del replace into authors nonrecoverable without prompting"
SQL3109N  The utility is beginning to load data from file
"/database/config/db2inst1/work/authors.csv".

SQL3500W  The utility is beginning the "LOAD" phase at time "03/25/2024
09:39:20.688951".

SQL3519W  Begin Load Consistency Point. Input record count = "0".

SQL3520W  Load Consistency Point was successful.

SQL3110N  The utility has completed processing.  "489" rows were read from the
input file.

SQL3519W  Begin Load Consistency Point. Input record count = "489".

SQL3520W  Load Consistency Point was successful.

SQL3515W  The utility has finished the "LOAD" phase at time "03/25/2024
09:39:20.790948".

SQL3500W  The utility is beginning the "BUILD" phase at time "03/25/2024
09:39:20.796263".

SQL3213I  The indexing mode is "REBUILD".

SQL3515W  The utility has finished the "BUILD" phase at time "03/25/2024
09:39:20.881994".


Number of rows read         = 489
Number of rows skipped      = 0
Number of rows loaded       = 489
Number of rows rejected     = 0
Number of rows deleted      = 0
Number of rows committed    = 489

[db2inst1@db2server work]$