AWS/Azure 経験者がはじめる OCI 入門 ～ Storage編 ～

#はじめに
本記事では、AWS/Azure と言った パブリッククラウド に続いて **Oracle Cloud Infrastructure (OCI)** の 学習を始めた筆者が、同じく 第２、第３のパブリッククラウド として OCI の 学習を 始めた方 向けに、OCI の 特徴や、他のパブリッククラウド との相違点 などについて、ご紹介していく内容となっています。

第４弾となる今回は、**Storage編** となります。

>第１弾 概要編：[https://qiita.com/Skogkatter112/items/98c6f815b4e0b6556b7e](https://qiita.com/Skogkatter112/items/98c6f815b4e0b6556b7e) 
第２弾 IAM/IDCS編：[https://qiita.com/Skogkatter112/items/51b619026aa53a9c6069](https://qiita.com/Skogkatter112/items/51b619026aa53a9c6069)
第３弾 Compute編：[https://qiita.com/Skogkatter112/items/540da610c7938cb74b55](https://qiita.com/Skogkatter112/items/540da610c7938cb74b55)

#ストレージサービスの種類
以下は、OCI で提供しているストレージサービス と AWS/Azure のストレージサービスをマッピングしてみたものになります。（参考：[Cloud Service Mapping](https://www.oracle.com/cloud/iaas/cloud-service-mapping.html)）
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/aa8950d3-4cbc-507d-ae69-cbf5f90e3027.png)](https://www.oracle.com/cloud/iaas/cloud-service-mapping.html)
それぞれどういった機能があるのか、各項目で詳しく見て行きたいと思います。
※長くなってしまったので、他は飛ばして 興味のあるストレージだけでも 読んで頂けると幸いです…!!

#１．ローカルNVMe [[資料](https://speakerdeck.com/ocise/ociji-shu-zi-liao-burotukuboriyumu-gai-yao?slide=4)]
###概要
OCI の ローカルストレージ として記載している `ローカルNVMe` ですが、独立したひとつのサービスとして提供されている訳ではありません。コンピュート・インスタンスの `DenseI/O タイプ` というインスタンス・タイプに内蔵されているストレージとなっています。

コンピュート・インスタンス の ローカルに アタッチされた ディスク である為、**レイテンシが低く、高いI/O 性能を発揮** できる、という特徴があります。性能については シェイプごとに最小 IOPS が定義されており、<font color="LightCoral">**"Performance SLA の対象"**</font> となっている点も大きなポイントと言えます。

また、ローカルストレージと言うと、**インスタンスの起動・停止に伴って データが消えるのではないか？** と思われるかもしれませんが、ローカルNVMe は、永続データ領域 となっている為、<font color="LightCoral">**インスタンスを削除しない限り、データは保持されます**</font>。

###データ保護の実装
ローカルNVMe は、OCI による デバイスのRAID、スナップショット、バックアップなどが行われない為、ユーザーの責任において、これらのデバイス上で <font color="LightCoral">**RAID構成を取るなど、データの耐久性を管理する**</font> 必要があります。

但し、ローカルNVMe のディスク数は、利用しているコンピュート・インスタンスの **シェイプに応じて決まる** ので、**小さいシェイプでは、RAID構成を取ることは出来なくなります**。その場合は、別途ブロック・ボリュームなどにデータを退避させるなどの考慮が必要となります。

参考までに、東京リージョンで利用可能な VM.DenseIO タイプのインスタンス シェイプ と そのディスク数 の 例を 以下に示します。※2020/10/6 現在
(最新情報は [マニュアル](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm) または 実際のインスタンス作成画面 から確認できます)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/de8308f4-bc69-ba35-ce8f-e70965cfe0e6.png)
](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm)

#２．ブロック・ボリューム [[資料](https://speakerdeck.com/ocise/ociji-shu-zi-liao-burotukuboriyumu-gai-yao?slide=9)]
###概要
ブロック・ボリュームは、**コンピュート・インスタンスに アタッチして使用する、ブロックレベルでアクセスするタイプ の ストレージサービス** です。標準で **透過的暗号化** がされています。<font color="silver">（OCI では、コンピュート・インスタンスのシステム領域が保存されたストレージを **ブート・ボリューム** と呼びますが、実態としてはブロック・ボリュームとほとんど同じものとなっています。）</font>

ブロック・ボリュームは 全て **NVMe SSD** をベースとしたストレージとなっており、コンピュート・インスタンスにアタッチする際に `iSCSI` または `準仮想化` による接続方法が選択できます。
ディスクの種類としては NVMe SSD のみですが、性能に応じて 下記 **３種類から用途にあったタイプを選ぶ** ことが出来ます。また、性能については、<font color="LightCoral">**Balanced 以上のタイプであれば、"Performance SLA の対象"**</font>となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/6b07011d-d237-5a42-9e8f-0104fddaf50e.png)

<font color="LightCoral">**「追加費用なしに」 標準で 高い IOPS を持つ ストレージが利用できる（＋SLA 対象!!）**</font> というのが 嬉しいポイント です…!!
但し、AWS の EBS最適化オプション といった機能は 現時点では提供されていない為、ネットワークレイテンシなどが シビアになるケースにおいては、必要に応じて **コンピュート・インスタンスのシェイプを大きなモノに変更する**／**DenseIOタイプのシェイプを選択する**／**vNICを分けてOS上で実装する**、といった対応を検討する必要があります。


###機能① マルチアタッチ
ブロック・ボリューム は、**複数のコンピュート・インスタンスからアタッチさせることが可能** です。例えば、クラスタソフトウェアと組み合わせた `高可用性アーキテクチャの実装` や、書込むユーザーは１人で、読取りユーザーが複数いる `共有カタログ・コンテンツの実現` をしたい場合などに利用できるかと思います。

マルチアタッチを行う場合は、ブロック・ボリュームを実際の **コンピュート・インスタンスにアタッチする際に、アクセス・タイプを指定** することで 設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/9a46b4bb-79c0-e7a5-919b-f917e1934bd4.png)

###機能② リサイズ
当然ながら、ブロック・ボリュームも 一度作成した容量から リサイズすることが可能となっています。但し、**拡張のみに対応しており、縮小はできません**。また、１つのストレージ辺り、最大サイズは 32TB までとなっています。

リサイズの実施 は、<font color="LightCoral">**オンライン状態（コンピュート・インスタンスにアタッチした状態のまま）でも可能**</font> です。
尚、他のパブリッククラウドでは サイズの変更後、再度リサイズするまでに時間制約が設けられているケースがあるかと思いますが、ブロック・ボリュームについては、特にそういった制約はなく、自由に変更できます。


###機能③ バックアップ・リストア
バックアップの取得方式は、以下 **２通り** あります。いずれも、バックアップ開始時点でボリューム上にあるデータの **Poin-in-timeのスナップショット が取得** できます。

- **１．オンデマンドの "手動" バックアップ**  
コンソール画面などから、`フルバックアップ` もしくは 前回からの `増分バックアップ` を選択し、ユーザーの任意のタイミングで取得する方法。  
- **２．ポリシーベースの "自動" バックアップ**  
`バックアップポリシー` と呼ばれる、バックアップ取得頻度、保持期間、フル または 増分 のいずれかで取得するか、などが定義されたポリシー に従って、自動で取得するバックアップ方法。  
※ ポリシーは、OCI で 事前定義された `Bronze`、`Silver`、`Gold` のポリシー (年1回のフルバックアップ + α ) から選択することもできますし、ユーザーが 独自に定義することも可能です。  
[<img width="520" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/ef5a4b98-6b22-5823-9226-151a40cefdb3.png">](https://speakerdeck.com/ocise/ociji-shu-zi-liao-burotukuboriyumu-gai-yao?slide=19)  

取得した **バックアップは オブジェクト・ストレージに保持** され、その **容量に応じて費用が発生** します。<font color="silver">（ユーザーが作成した任意のオブジェクト・ストレージではなく、OCI 側の持つオブジェクト・ストレージ）</font>

リストアする場合、元となるブロック・ボリュームの 可用性ドメイン (AD) を問わず、同一リージョン内に **新規ボリュームとしてリストアすることも可能** ですし、また、バックアップを **別リージョンにコピーすることも可能** となっています。
ユーザーが独自に定義したバックアップ・ポリシーを使用することで、別リージョンへのバックアップを自動化することも可能となっています。ただし、その場合はコピー先のリージョンは予め定められたペア・リージョンのみが選択可能となります。（**東京の場合は、大阪リージョンで固定**）

<img width="580" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/0bb210f6-d2ad-5477-c70e-eed5f4879298.png">

###機能④ ボリューム・グループ
個々のブロック・ボリュームをバックアップする分には、先ほどの機能で要件を満たせますが、**複数ボリュームを 一つの単位としてまとめて、同時に バックアップを取得したい** ケースなどが あるかと思います。`ボリューム・グループ` は、そういったケースで活躍する機能となっています。

ボリューム・グループには、ブロック・ボリュームだけでなく、**ブート・ボリューム も 含めることが出来る** ため、コンピュート・インスタンスにアタッチしているボリューム 全体の Poin-in-time のスナップショットが取得できます。

OCI のカスタム・イメージは、AWS の AMI のように、アタッチされているブロック・ボリュームまで含めたイメージではない為、<font color="LightCoral">**コンピュート・インスタンス全体のバックアップを目的とした場合は、こちらのボリューム・グループの機能を用いて、全体のバックアップを取得するのが良い**</font> のではないかと思います。

その他 注意点としては、現時点では「**ボリューム・グループの自動バックアップは提供されていない**」（＝手動 または API等の作り込みが必要）、という点と、「**複数 可用性ドメイン（AD）を跨いでボリューム・グループを作成することはできない**」（＝ボリューム・グループに含められるのは 単一 可用性ドメインのみ）という点です。


#３．ファイル・ストレージ [[資料](https://speakerdeck.com/ocise/ociji-shu-zi-liao-huairusutorezi-gai-yao)]
###概要
OCI の ファイル・ストレージは、`NFSv3`プロトコルで 利用可能な **共有ファイルストレージ のサービス** です。１つの可用性ドメイン内で複数のフォルトドメインに跨って冗長化されており、ブロック・ボリューム同様、標準で暗号化が行われています。
また、**最大 8 エクサバイトまで**、という大容量なストレージとなっています。

補足となりますが、ファイル・ストレージ・サービスのプロトコルは `NFSv3` のみ なので、`SMB` プロトコルが必要な場合、マネージドではありませんが、別途 コンピュート・インスタンス＋ブロック・ボリュームを使った "**Oracle Linux Storage Appliance**" の構築も検討すると良いかもしれません。([参考ブログ](https://k-kane.hatenablog.jp/entry/2019/03/02/131620))

###構成要素
ファイル・ストレージ・サービスは、以下のコンポーネントで構成されます。

- **マウント・ターゲット**
マウント・ターゲットとは、クライアントから ファイル・システムへのアクセスする際に使用する、IP アドレス といった接続先情報を持つ **NFS エンド・ポイント** です。特定の可用性ドメイン／特定のサブネット に作成します。
※ マウント・ターゲットでは **３つの 内部 IP アドレスを必要とする** 為、サブネットは `/30以上` のものを使用する必要があります。また、マウント・ターゲットが使用する **プライベート IP アドレスは ユーザーには表示されない**為、特に理由がなければ、<font color="LightCoral">**意図せず重複してしまうことを避けるため、マウント・ターゲット専用のサブネットを用意しましょう**</font>。

- **ファイル・システム**
一般的な用語なので、特に説明不要かと思いますが、マウント・ターゲットに割り当てる、ファイルを格納するためのリソースです。１つのマウント・ターゲットにつき、**100 個のファイル・システムを割り当てることが可能** です。

- **エクスポート**
マウント・ターゲットに ファイル・システムを関連付ける際に必要となる、**ファイル・システムを一意に識別するためのパス** を意味します。クライアントが ファイル・ストレージに対してマウントコマンドを実行する際、マウント・ターゲットの IP アドレスと、このエクスポート・パスを用いて、`mount <マウント・ターゲット>:/<エクスポート・パス> /mnt/～` といった形で利用します。
(例：*sudo mount 10.0.0.6:/FileStorage-01 /mnt/FileStorage-01*)

あるサブネットに NAS を作成<font color="silver">（≒ **マウント・ターゲット** の作成）</font>し、その上に１つ以上のファイルシステムを構築<font color="silver">（≒ **ファイル・システム** の作成）</font>、そのファイルシステムを一意に識別するためのパスを設定<font color="silver">（≒ **エクスポート** の作成）</font>している、といったイメージでしょうか。

尚、マウント時は、ファイル・ストレージ・サービスの性能を引き出すため、<font color="LightCoral">**マウント・オプションは指定しないことが推奨**</font> されています。

###機能① エクスポート・オプション
ファイル・ストレージ・サービスへの アクセス制御を行う場合、OCI の仮想ネットワークのファイアウォール機能である `セキュリティ・リスト` などを用いて、マウント・ターゲットへのアクセス可否を設定することが出来ます。
エクスポート・オプションというのは、**「アクセス可否」よりも より詳細な制御（read/write 権限の設定など）が行える機能** となっています。

作成した `エクスポート` コンポーネントの詳細画面（または CLI/API 等）から、`NFSエクスポート・オプション` の設定が行えます。初期状態では、**すべての NFS クライアントに フルアクセス が許可された状態** になっています。

オンプレミスで Linux NFS サーバの設定をされたことがある方は イメージして頂き易いかと思いますが、下記画面のように、UID や GID によって、アクセス制御を行うことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/bd18cc28-d4a3-6ff4-276d-e71bbb272c71.png)

###機能② スナップショット
ファイル・ストレージ・サービスでは、ファイルシステムのポイント・イン・タイム・スナップショットが取得できます。取得できる スナップショット数 は ファイル・システムごとに **最大10,000** となっています。

スナップショットを実行すると、ファイル・システムのルートフォルダの配下の、`.snapshot` という名前の 隠しディレクトリ配下に、その時点の スナップショット が作成されます。リストア時は このディレクトリから ファイル毎 または 全体をリストアできます。

スナップショットに必要となる容量は、対象のファイル・システム内で、<font color="LightCoral">**何も変更されていない状態でスナップショットを取得した場合は、追加のストレージ容量は消費されません**</font> が、<font color="LightCoral">**スナップショット取得後に変更された容量に応じて、使用量が加算**</font> されていきます。（参考：[ファイル・ストレージの使用量について](https://docs.cloud.oracle.com/ja-jp/iaas/Content/File/Concepts/FSutilization.htm#MeteringandServiceCost)）


#４．オブジェクト・ストレージ [[資料](https://speakerdeck.com/ocise/ociji-shu-zi-liao-obuziekutosutorezi-gai-yao?slide=4)]
###概要
オブジェクト・ストレージは、複数 可用性ドメイン間 で冗長化されており、**高耐久性・大容量向きのストレージサービス** となっています。ブロック・ボリューム、ファイル・ストレージ同様、標準で 透過的暗号化 がされています。

オブジェクト・ストレージの操作については、**OCI で提供されている SDK、CLI、GUI、REST API の他に**、「**<font color="LightCoral">AWS の S3 互換 API が利用できる</font>**」、というのが ポイントです。（参考：[S3 互換 API について](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Object/Tasks/designatingcompartments.htm)）

リージョンに紐づくサービスとなっており、ユーザーが定義した **プライベート仮想ネットワーク の 外で 利用するサービス** となっています。プライベートサブネット空間にあるリソース から オブジェクト・ストレージ へ アクセスする場合は、`サービス・ゲートウェイ` というコンポーネントを作成することで、サービス間の連携が可能です。
<font color="silver">サービス・ゲートウェイ は、AWS S3 における **VPC エンドポイント** の イメージです。</font>

AWS S3 の 利用経験がある方だと、オブジェクト・ストレージは`結果整合性` なのだろう、と思われるかもしれませんが、<font color="LightCoral">**OCI の オブジェクト・ストレージ は** `強い一貫性`**（取得時に常に最新データを提供）となっています**</font>。

###２つのストレージタイプ
オブジェクト・ストレージには、`標準ストレージタイプ` と、`アーカイブ・ストレージタイプ` の２種類があります。

アーカイブ・ストレージは、標準タイプと比較して、**データの取得に時間を要するタイプになりますが、その分、1GB あたりの使用料が かなり安価に利用** できます。
<font color="silver">AWS サービスでいう **S3 Glacier**、Azure サービスでいう **Azure Archive Stroage** に当たるサービスです。</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/2c4e1e62-18b1-cc12-95a1-e8de886914c7.png)

###構成要素
オブジェクト・ストレージの構成要素は、以下のようになっています。
`名前空間` は ユーザーが意識して作成するものではありませんが、OCI のテナント作成時に割り当てられた文字列で、バケットへアクセスする際の URI などに組み込まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/b2616ad0-2e66-8e69-f547-b1f00bebaa58.png)

###機能① 事前認証済みリクエスト
オブジェクト・ストレージへのアクセスは、デフォルトでは `プライベート` 設定となっている為、バケット や オブジェクト に アクセス するには、適切な権限設定が されている必要があります。

設定を `パブリック` に変更してしまうことで 誰からでもアクセスが可能になりますが、**事前認証済みリクエスト** を利用することで、**ある一定期間だけ 有効な URL を発行** することができます。

<font color="LightCoral">**権限設定を行うよりも手軽で、パブリックに変更するよりは セキュアに利用できる**</font> ので、簡単なコンテンツ共有などで活躍します。

事前認証済みリクエストの作成時に、有効期間が指定でき、**指定した期間内であっても、不要になれば 削除することで アクセス できなくすることが 可能** です。

###機能② オブジェクトのライフサイクル管理
`ライフサイクル・ポリシー・ルール` を設定することで、**指定した日数が経過したオブジェクトを自動的にアーカイブ・ストレージへ移動する** または **削除する** ことが可能です。ルールは、`バケット単位` または `プレフィックス単位` で設定することができ、いつでも有効化／無効化できます。

###機能③ バージョニング
バケット単位で `バージョニング設定` が行えます。設定を行うと、<font color="LightCoral">**新規オブジェクトがアップロード、更新、削除された際に自動的にバージョニング**</font>されます。
誤って上書きしてしまったり、削除してしまった際にも、過去のバージョンを指定することで、オブジェクトを取得することが可能です。

ただし、全てのバージョンを削除しない限り、**単なる削除では 当然それまでのバージョンは残り続ける** という点と、それら **全てのバージョンに対してストレージ料金がかかる**、という点に注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/9dc10399-cf0d-4abe-5759-ddb4866d5995.png)

また、現時点では 指定したバージョン数のみ保持し、それ以上のバージョンは自動的に削除する、といった機能は提供されていない為、実現には 作り込みが必要となります。

###機能④ レプリケーション
オブジェクト・ストレージに バックアップデータを格納し、別のバケットへ退避したいケースなど、バケット同士で データをレプリケーションさせたい場合があるかと思います。

オブジェクト・ストレージに `レプリケーション設定` を行うことで、<font color="LightCoral">**オブジェクトの作成・更新・削除をトリガーとして、自動的にレプリケーション先となるバケットへデータを反映してくれる**</font> ようになります。尚、レプリケーションは **バケット単位での設定** となります。

注意点としては、同一リージョンのバケット／別リージョンのバケット どちらも レプリケーション先 として 設定が 可能なのですが、**異なるテナントの オブジェクト・ストレージへの同期は、現時点では行えません**。また、双方向のレプリケーションは行えず、レプリケーション先として設定されたバケットは、`読取り専用` となる点も ご注意ください。

レプリケーション時に必要となる通信料ですが、別リージョンへのレプリケーションの場合、OCI の バックボーン回線を経由する形になり、アウトバウンド通信料の対象となります。（但し、月10TB まで無料／同一リージョン内であれば完全無償）

###(おまけ) 静的Webホスティングについて
AWS S3 において 有名な 静的Webホスティング ですが、残念ながら OCI の オブジェクト・ストレージでは 現時点では提供されていない機能となっています。


#最後に
いかがでしょうか。
ブロック・ボリューム／オブジェクト・ストレージについては、[30日間の無償トライアル環境](https://www.oracle.com/jp/cloud/free/) が 終了した後も ずっと利用することができる サービス となっています。
ファイル・ストレージについても、クレジットがある期間であれば、簡単に試して頂けるので、是非 実際に 構築してみて頂けると幸いです。

Oracle Cloud Free Tier
https://www.oracle.com/jp/cloud/free/