RDS Custom for Oracle, RDS for Oracle, Oracle On EC2 の比較 [JPOUG Advent Calendar 2021]

[JPOUG Advent Calendar 2021](https://adventar.org/calendars/6527) の5日目のエントリーです。
前の記事は yoshikaw さんの[Oracle Database Express Edition(XE)で21c新機能を試してみる](https://yskwkzhr.blogspot.com/2021/12/trying-out-the-new-21c-features-in-oracle-database-express-edition.html)でした。


#はじめに
Amazon RDS Custom for Oracleは、[10/26に発表](https://aws.amazon.com/jp/about-aws/whats-new/2021/10/amazon-rds-custom-oracle/)されたRDSの新しい形態であり、RDSにもかかわらずOSレイヤへのrootアクセスが可能になります。
また、12/2のre:Inventにおいて、Amazon RDS Custom for SQL Serverが発表されており、力を入れているのが分かります。
Amazon RDSはフルマネージド型のサービスで使い勝手がよかった一方、メンテナンスタイミングや個別パッチの適用においては柔軟性に欠ける点もあり、エンタープライズ・プロジェクトでの利用には二の足を踏んでしまう事も多かったように思います。
RDS Customという形態は、個別パッチ等の適用が可能となることがメリットとなると思われますが、一方でrootアクセスを行えるという事はOS環境もユーザが管理していく必要があり、フルマネージドのメリットが損なわれると考えてます。
どのようなメリット・デメリットがあるのかをそれぞれ比較することで、今後のAWS上のOracle Databaseの選定の一助になればと考えてます。
なお、文中では単にRDSと記載した場合にはCustomではないRDS、RDS Customと記載した場合にはRDS Customを指してます(基本的には両方ともfor Oracleになります)。

#RDS Custom for Oracleの概要
今までのRDSは基本的にAWSのフルマネージド型でOSレイヤへアクセスができなかったのに対し、Custom for OracleではOSレイヤへのrootアクセスも可能となっています。
RDS Customではフルではないがマネージドを実現するために、提供されるOSにはSSM Agentがインストールされており、基本的にはSSM Agentを経由してマネージドな機能が提供されます。
Oracle on EC2との違いとしては、公式では以下のように説明されています。

###[責任分担モデル](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-custom.html#custom-intro.solution)

| 特徴 | Oracle On<br>Amazon EC2 | Amazon RDS<br> for Oracle | Amazon RDS<br>Custom for Oracle |
|---|---|---|-|
| アプリケーションの最適化 | Customer | Customer | Customer|
|スケーリング | Customer | AWS | Shared|
| 高可用性 | Customer | AWS |Shared|
| DBのバックアップ | Customer| AWS | Shared
|DBのパッチ適用 | Customer |AWS  |Shared
|DBのインストール | Customer |AWS |Shared
|OSのパッチ適用 | Customer |AWS |Shared
|OSのインストール | Customer |AWS|Shared
|サーバのメンテナンス | AWS | AWS|AWS
|ハードウェアのライフサイクル | AWS |AWS|AWS 
|電力、ネットワーク、および冷却 | AWS |AWS |AWS

RDS for OracleとOracle On EC2の比較は Classmethodさんの [[2018年版] RDS for Oracle と Oracle on EC2 の比較] (https://dev.classmethod.jp/articles/rds-for-oracle-vs-oracle-on-ec2-2018/) で実施されてますので、同じ切り口でRDS Custom for Oracleも比較してみます。

####比較ポイント

- エディションとバージョン
- 利用料金
- 利用できるリソース
- 機能差
- 構築/運用

#RDSで利用できるエディションとバージョン

RDS Custom、RDSで利用できるエディションとバージョンは以下のような組み合わせになります。
現時点(2021/12/5)ではRDSとしてはOracleの12.1.0.2(～2022/7/31)や12.2.0.1(～2022/3/31)も利用できますが、[サポート切れまで一年もない](https://aws.amazon.com/jp/blogs/news/amazon-rds-for-oracle-12c-retirement/)ので割愛します。基本的には19cのみが利用可能となります。19c のRDSとしてのサポート期限は明示されてませんが、Oracle Databaseとしての期限は現時点では [2027/4/30](https://support.oracle.com/knowledge/Oracle%20Cloud/2413744_1.html) となります。

|   Oracleのエディション、バージョン  |  Oracle On<br>Amazon EC2 | Amazon RDS<br> for Oracle | Amazon RDS<br>Custom for Oracle | 
| --- | --- | --- | ---|
| Enterprise Edition(BYOL) 19c   |  〇   |  〇   | 〇
| Standard Edition2(BYOL) 19c   |  〇 |  〇 | ×
| Standard Edition2(ライセンス込み) 19c   | 〇   |  〇   | ×

#利用料金

2021年12月のインスタンス利用料金になります。

- 料金は以下の条件
    - 東京リージョンの1時間あたりのオンデマンド利用料金
    - EC2はRHEL（Red Hat Enterprise Linux）を対象とします（参考記事同様＆やはり利用が多いと思うので）
    - EC2はほかのインスタンスタイプも利用可能です
    - RDSはシングルAZ（マルチAZの場合には概ね2倍です、RDS CustomはマルチAZには現時点では非対応です[^1]）
    - RDS単価（SE2）はライセンス込みの価格です
    - 利用料「-」のインスタンスタイプは提供されてません
   

[^1]: DataGuardを利用したRead Replica 構成でのマルチAZは可能です [Working with read replicas for RDS Custom for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html)

同じBYOLでもRDSに比べるとRDS Customの方が1-2割程度、高額で設定されてます。

| インスタンスタイプ     | コアカウント | VCPU | メモリ(GiB) | Oracle On<br>Amazon EC2<br>EC2単価 RHEL |   Amazon RDS<br> for Oracle単価（BYOL） |  Amazon RDS<br> for Oracle単価（SE2ライセンス込み） | Amazon RDS<br>Custom for Oracle単価(BYOL) |
| ---------------------- | ------------ | ---- | ----------- | ------------- | -------------------- | --------------- | ---------------------------- |
| t3.micro               | 1            | 2    | 1           | 0.0736$    |  0.026$        | 0.044$                     |  -                 
| t3.small               | 1            | 2    | 2           | 0.0872$    |  0.052$        | 0.088$                     |  -                 
| t3.medium              | 1            | 2    | 4           | 0.1144$    |  0.104$        | 0.176$                     |  -                 
| t3.large               | 1            | 2    | 8           | 0.1688$    |  0.104$        | 0.352$                     |  -                 
| t3.xlarge              | 2            | 4    | 16          | 0.2776$    |  0.416$        | 0.704$                     |  -                 
| t3.2xlarge             | 4            | 8    | 32          | 0.5652$    |  0.832$        | 1.408$                     |  -                 
| m5.large               | 1            | 2    | 8           | 0.184$     |  0.235$        | 0.514$                     |     0.282$            
| m5.xlarge              | 2            | 4    | 16          | 0.308$     |  0.47$         | 1.028$                     |     0.564$            
| m5.2xlarge             | 4            | 8    | 32          | 0.626$     |  0.94$         | 2.056$                     |     1.128$            
| m5.4xlarge             | 8            | 16   | 64          | 1.122$     |  1.88$         | 4.112$                     |     2.256$            
| m5.8xlarge             | 16           | 32   | 128         | 2.114$     |  3.76$         | -                            |   4.512$            
| m5.12xlarge            | 24           | 48   | 192         | 3.106$     |  5.64$         | -                            |   6.768$            
| m5.16xlarge            | 32           | 64   | 256         | 4.098$     |   7.52$         | -                            | 9.024$            
| m5.24xlarge            | 48           | 96   | 384         | 6.082$     |     11.28$        | -                            |13.536$           
| r5.large               | 1            | 2    | 16          | 0.212$     |     0.277$        | 0.556$                     |  0.332$            
| r5.xlarge              | 2            | 4    | 32          | 0.364$     |     0.554$        | 1.112$    |                    0.665$            
| r5.2xlarge             | 4            | 8    | 64          | 0.738$     |     1.108$        | 2.224$                     |  1.33$             
| r5.4xlarge             | 8            | 16   | 128         | 1.346$     |     2.216$        | 4.448$                     |  2.659$            
| r5.8xlarge             | 16           | 32   | 256         | 2.562$     |     4.432$        | -                            |5.318$            
| r5.12xlarge            | 24           | 48   | 384         | 3.778$     |     6.648$        | -                            |7.978$            
| r5.16xlarge            | 32           | 64   | 512         | 4.994$     |     8.864$        | -                            |10.637$           
| r5.24xlarge            | 48           | 96   | 768         | 7.426$     |     13.296$       | -                            |15.955$           
| r5b.large              | 1            | 2    | 16          | 0.241$     |     0.335$        | -                            |-                 
| r5b.xlarge             | 2            | 4    | 32          | 0.422$     |     0.67$         | -                            |-                 
| r5b.2xlarge            | 4            | 8    | 64          | 0.854$     |     1.339$        | -                            |-                 
| r5b.4xlarge            | 8            | 16   | 128         | 1.578$     |     2.679$        | -                            |-                 
| r5b.8xlarge            | 16           | 32   | 256         | 3.026$     |     5.358$        | -                            |-                 
| r5b.12xlarge           | 24           | 48   | 384         | 4.474$     |     8.037$        | -                            |-                 
| r5b.16xlarge           | 32           | 64   | 512         | 5.922$     |     10.715$       | -                            |-                 
| r5b.24xlarge           | 48           | 96   | 768         | 8.818$     |     16.073$       | -                            |-                 
| z1d.large              | 1            | 2    | 16          | 0.287$     |     0.417$        | -                            |-                 
| z1d.xlarge             | 2            | 4    | 32          | 0.514$     |     0.834$        | -                            |-                 
| z1d.2xlarge            | 4            | 8    | 6           | 1.038$     |     1.668$        | -                            |-                 
| z1d.3xlarge            | 6            | 12   | 96          | 1.492$     |     2.502$        | -                            |-                 
| z1d.6xlarge            | 12           | 24   | 192         | 2.854$     |     5.004$        | -                            |-                 
| z1d.12xlarge           | 24           | 48   | 384         | 5.578$     |     10.008$       | -                            |-                 
| x1.16xlarge            | 32           | 64   | 976         | 9.801$     |     16.256$       | -                            |-                 
| x1.32xlarge            | 64           | 128  | 1952        | 19.471$    |     32.512$       | -                            |-                 
| x1e.xlarge             | 2            | 4    | 122         | 1.269$     |     1.9261$       | -                            |-                 
| x1e.2xlarge            | 4            | 8    | 244         | 2.548$     |     3.8522$       | -                            |-                 
| x1e.4xlarge            | 8            | 16   | 488         | 4.966$     |     7.7045$       | -                            |-                 
| x1e.8xlarge            | 16           | 32   | 976         | 9.802$     |     15.409$       | -                            |-                 
| x1e.16xlarge           | 32           | 64   | 1952        | 19.474$    |     30.8179$      | -                            |-                 
| x1e.32xlarge           | 64           | 128  | 3904        | 38.818$    |     61.6358$      | -                            |-                
 



#利用できるリソース

####インスタンスタイプ

上記の利用料金表通りですが、RDS Custom for Oracleで利用可能なインスタンスタイプは m5シリーズもしくはr5シリーズのみとなり、z1d や x1e は利用できません。
RDSやEC2はコア数制限をかけることも可能です。
詳しくは [Amazon RDS for Oracle に R5 インスタンスクラスでの新しいメモリ構成が追加されました]  (https://aws.amazon.com/jp/about-aws/whats-new/2021/06/amazon-rds-for-oracle-now-supports-additional-memory-configurations-of-the-r5-instance-class/)でご確認ください。
Customについても、CustomのイメージはAMIとなるので、該当のAMIに対して [vCPUの指定](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-specify-cpu-options.html#cpu-options-customer-number-of-vCPUs) を行いコア数やHyperThreadingの設定(CPU最適化オプション)をする事は可能ですが、RDSと紐づけられないので現時点では利用できないと思われます。（←前提に[サポートされていない機能](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits)、と記載がありました）

現時点ではEC2や従来型のRDSに比較しても選択できるインスタンスタイプは少ない状況です。
また、[RDS Customの制限](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits)にあるとおり、**Customでは動的なインスタンスタイプの変更が行えません**が、Snapshotを利用しての変更は可能です。

####ストレージ

各構成にアタッチできるストレージは以下のような違いがあります。
RDSとRDS Customは同じ制限となります。
EC2の場合には複数ボリュームをアタッチすることで帯域を拡張することが可能ですが、インスタンス側の制限が上限となります。
また、RDS Customもボリュームタイプの変更(gp2 → io1 のような)が可能なはずなのですが、試した限りではメッセージが出て変更できませんでした(Snapshotを利用しての変更は可能でした)。

|  特徴 |   Oracle On<br>Amazon EC2 | Amazon RDS<br> for Oracle | Amazon RDS<br>Custom for Oracle | 
| --- | --- | --- | ---|
| ストレージタイプ   | gp2<br>io1<br>gp3<br>io2<br>io2 Block Express<br>sc1<br>st1 | gp2<br>io1<br>Magnetic  |  gp2<br>io1 
| 最大サイズ  |  複数EBSの利用により64TB以上可能  | 64TB | 64TB
| 最大IOPS   |  256,000<br>io2 Block Expressの利用<br>r5bインスタンスのみ  |  40,000 <br> io1の利用  |40,000<br>io1の利用
| オートスケーリング | × | 〇 | ×<br>[ユーザガイド](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.create)

なお、CustomにおいてはOS部分、DB HOME部分(/rdsdbbin)は gp3 で自動的に作成され、それぞれ初期値は 26GB、25GB となってました(作成時に指定はできない)。ファイルシステムは ext4 です。
また、DB領域(/rdsdbdata)は指定したサイズのデバイスがマウントされます。中身をみると、指定したサイズの 1/4 のPVが 4本作製され、vgとしてまとめられてます(40GBで指定すると、10GBずつ4本のボリュームが作成されます)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/47f0b2e7-f46b-eff3-780b-2fe94801c95c.png)


<details>
<summary>参考までにvgdisplay -vの結果を張り付けておきます(UUIDは削除してます)</summary><div>

```
  --- Volume group ---
  VG Name               dbn0
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               39.98 GiB
  PE Size               4.00 MiB
  Total PE              10236
  Alloc PE / Size       10236 / 39.98 GiB
  Free  PE / Size       0 / 0

  --- Logical volume ---
  LV Path                /dev/dbn0/lvdbn0
  LV Name                lvdbn0
  VG Name                dbn0
  LV Write Access        read/write
  LV Creation host, time ip-xx-xx-xx-xx, 2021-11-18 14:48:17 +0900
  LV Status              available
  # open                 1
  LV Size                39.98 GiB
  Current LE             10236
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           252:0

  --- Physical volumes ---
  PV Name               /dev/nvme5n1
  PV Status             allocatable
  Total PE / Free PE    2559 / 0

  PV Name               /dev/nvme3n1
  PV Status             allocatable
  Total PE / Free PE    2559 / 0

  PV Name               /dev/nvme1n1
  PV Status             allocatable
  Total PE / Free PE    2559 / 0

  PV Name               /dev/nvme4n1
  PV Status             allocatable
  Total PE / Free PE    2559 / 0

  --- Volume group ---
  VG Name               dbdata01
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               39.98 GiB
  PE Size               4.00 MiB
  Total PE              10235
  Alloc PE / Size       10235 / 39.98 GiB
  Free  PE / Size       0 / 0

  --- Logical volume ---
  LV Path                /dev/dbdata01/lvdbdata01
  LV Name                lvdbdata01
  VG Name                dbdata01
  LV Write Access        read/write
  LV Creation host, time ip-xx-xx-xx-xx, 2021-11-18 14:48:17 +0900
  LV Status              available
  # open                 1
  LV Size                39.98 GiB
  Current LE             10235
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           252:1

  --- Physical volumes ---
  PV Name               /dev/dbn0/lvdbn0
  PV Status             allocatable
  Total PE / Free PE    10235 / 0

```
</div>
</details>




#機能差

本節ではOracle Databaseとしての機能差に絞って記載します。

####RDS Custom for Oracle
RDS Custom for OracleでFALSEになっているオプションはRACやASM等、以下の8個の機能になります。(v$optionで確認)

```
Real Application Clusters
Automatic Storage Management
Oracle Label Security
Oracle Database Vault
Unified Auditing
Management Database
I/O Server
ASM Proxy Instance
```

また、とても重要な点として、**RDS Custom for Oracleでは文字コードが固定で US7ASCII** となります。現時点では変更することはできません。

####RDS for Oracle

- [RDS for Oracle でサポートされていない機能](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Oracle.Concepts.FeatureSupport.html#Oracle.Concepts.FeatureSupport.unsupported)

RDS for Oracle(EE)でFALSEになっているオプション機能も、Customと同様に以下の8個です。

```
Real Application Clusters
Automatic Storage Management
Oracle Label Security
Oracle Database Vault
Unified Auditing
Management Database
I/O Server
ASM Proxy Instance
```

#構築/運用

###構築

クラウド環境上でOracle Databaseの構築に必要な作業は、大きく以下のような順序で実施されると想定してます。

1. OS設定（OSパッチ適用、環境設定）
1. Oracle DBソフトのインストール
1. Oracle DB作成
1. Oracle DB環境設定(初期化パラメータや表領域、スキーマの設定等)
1. Oracle DB HA構成設定（クラスタソフトのインストール・設定）
1. Oracle DB運用設定（ジョブ実行環境の設定・監視設定・バックアップ設定）

以下の図の通り、RDSを利用することで、OS設定(必要なパッチ・カーネルの設定)やソフトウェアのインストール、DBの作成等は不要となります。
そのため、DB環境設定等、DB管理者として必要な作業に集中することができるようになります。
また、運用設定においても、OSへログイン・ファイル配置等が行える事で、オンプレ環境で利用していた運用シェル等や、エクスポート・インポートの機能をそのまま利用することが可能となり、**単純移行・クラウドリフトを行いたい場合にはメリットがある**と考えてます。

|  構築作業  | Oracle On<br>Amazon EC2 | Amazon RDS<br> for Oracle | Amazon RDS<br>Custom for Oracle | 
| --- | --- | --- | --- | 
| 1. OS設定   | 必要 | **不要**  | **不要**<br>(カスタマイズする場合には必要) 
| 2. Oracle DBソフトのインストール  |  必要  |**不要** | **不要**<br>事前のCEV(Custom Engine Version)の作成が必要
| 3. Oracle DB作成  | 必要  |  **不要**  | **不要**
| 4. Oracle DB環境設定 | 必要 | 必要 | 必要 |
| 5. Oracle DB HA構成設定 | 要件による<br>Data Guard設定等を想定 | マルチAZ構成のため**不要**<br>[クロスリージョン自動バックアップ](https://dev.classmethod.jp/articles/rds-for-oracle-supports-cross-region-automated-backup-2/)も可能 | 要件による<br>[Data Guardの設定](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-managing.html#custom-managing.ha)が可能|
| 6. Oracle DB運用設定|  必要<br>エージェントインストール・設定を想定 | 必要<br>他のサーバでジョブ実行を想定<br>監視はCloud Watchへのログエクスポートによるフィルタリングが可能 | 必要<br>エージェントインストール・設定を想定 |



###運用

Oracle Database環境の運用としては、以下のような作業があると想定してます。

- システムメンテナンス運用
- データベースバージョン管理（パッチ適用）
- データベースのバックアップ・リカバリ
- 監視運用（パフォーマンス・リソース監視、死活監視、ログ監視）

RDS、RDS Customを利用した時の運用における違いは以下になります。
RDS Customではバージョン管理やメンテナンスタイミングをユーザの管理下に置けます。
監視機能については、DB部分はRDSイベント通知、OS部分は自動的にインストールされるSSM Agentで監視が可能です。
ただ、SSM Agentでの監視については、デフォルトでアラートログがCloudWatchに連携されたりはしないため、実施するためには作りこみが必要になります。(Oracle On EC2 でもSSM Agentを入れれば同じことは可能となります)


|  運用作業  | Oracle On<br>Amazon EC2 | Amazon RDS<br> for Oracle | Amazon RDS<br>Custom for Oracle | 
| --- | --- | --- | --- | 
| システムメンテナンス運用   | ユーザ管理 | **AWS管理**<br>週次のメンテナンスウィンドウが必要  | ユーザ管理<br>メンテナンスウィンドウは設定される
| データベースバージョン管理<br>(パッチ適用)   | ユーザ管理<br>適用タイミングは選択可能<br>個別パッチ等も適用可能 | パッチ選定・適用作業は**AWS管理**<br>RU(Release Update)もしくはRUR(Release Update Revision)ベースでの適用<br>個別パッチの適用は不可  | パッチ適用作業のみ**AWS管理**<br>パッチ選定・適用タイミングはユーザ管理<br>個別パッチ等も適用可能
| データベースのバックアップ・リカバリ  |  ユーザ管理  | **AWS管理** | **AWS管理**<br>ユーザでの管理も可能
| パフォーマンス監視 | ユーザ管理 |  **AWS管理**<br>[パフォーマンスインサイト](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PerfInsights.html)利用可能 | **AWS管理**が可能<br>SSM Agentの機能が利用可能
| リソース監視 | ユーザ管理 | **AWS管理**<br>CloudWatch利用可能| **AWS管理**が可能<br>SSM Agentの機能が利用可能 |
| 死活監視 | ユーザ管理 | **AWS管理**<br>[RDSイベント通知](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.html)利用可能 |**AWS管理**が可能<br>[RDSイベント通知](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.html)利用可能<br>ユーザ管理での監視も可能|
| ログ監視 |  ユーザ管理 | **AWS管理**<br>CloudWatch利用可能 | **AWS管理**が可能<br>SSM Agentの機能が利用可能 |

#まとめ

現時点で RDS Custom for Oracle のユースケースとしては、以下のような場合かと考えてます。

- オンプレ環境からAWS環境へOracle Databaseの単純移行を行いたいが、バックアップ等はクラウドの機能を利用したい
    - 単純移行なのでOS上の環境構成等はなるべくそのままにしたい
- Oracle環境へのパッチ適用はシステム影響を鑑みて細かく調整したいが、マネージドな機能は利用したい

どちらかというと、新規にAWS上でOracle Databaseを利用したい、というよりもオンプレからの移行の際の選択肢の一つになってくるのかな、と思いました。
一方で、現時点では利用にあたって文字コードが US7ASCII しか利用できない点は、日本での利用においては大きな障害となると考えており、機能改善が待たれるところです。

話はそれますが、Oracle CloudのDBCS(Database Cloud Service)も同じような仕組み（OSへrootログイン可能）なマネージドデータベースとして構成されており、今回はできませんでしたがDBCSとの比較等も別途実施したいと考えてます。