Open satokaz opened 3 years ago
簡単に言うと、ZFS Storage Appliance の share (共有領域)を OCI Object Store に見立てて利用する事を目的とした機能。
ZFS Storage Appliance では、ZFS Storage Appliance Object API サービス(OCI API mode) を提供する。 この機能を有効にすることで、ZFS Storage Appliance は、OCI オブジェクト・ストレージ互換の API を提供でき、Cloud サービスとして提供される OCI オブジェクト・ストレージ機能をオンプレ上に実装することができ、OCI オブジェクト・ストレージ native API を使用するアプリケーションを変更することなく、それらを利用し、ZFS Storage Appliance にデータを格納することが可能となる。
ZFS Storage Appliance Object API サービス
と言うわけで、必要なものは、ZFS Storage Appliance になる。
機能詳細については、下記のマニュアルを:
利用目的としては、実際のサービスコストを消費することなく、OCI オブジェクト・ストレージ native API を用いたアプリケーションの開発(Bandwidth: read/write limits の操作も可能)、OCI オブジェクト・ストレージと連携したバックアップをオンプレミス上に取得するなどが想定される。
例えば、OCI CLI を改変することなく、oci os コマンドで基本機能の操作ができる。 サポートされる OCI Object Storage API は、下記のマニュアルを参照。Buckets と Object の操作、Multipart Upload のみをサポートしている:
oci os
OCI オブジェクト・ストレージ互換機能のための OCI 契約は必要ない。 が、OCI オブジェクト・ストレージ互換となるため、Oracle Cloud Infrastructure の概念や用語など、事前にいくつか理解しておく必要がある。
特に、下記の項目の用語は把握しておくこと:
OCI のサービスを理解する上でリソースの識別子を覚えておくと良い。 特に、ほとんどの Oracle Cloud Infrastructure リソースに割り当てられる Oracle Cloud Identifier (OCID) というものがあるということを覚えておく必要がある:
リソースの識別子
Oracle Cloud Identifier (OCID)
OCI Object Storage を利用するためには、テナンシとユーザーに割り当てられるリソース識別子である、下記の OCID を把握しておく必要がある:
この 2 つは、すぐに探せるように理解しておくこと:
OCI オブジェクト・ストレージについては、下記のドキュメントが役立つ:
ZFS Storage Appliance の Cloud Backup 機能では、OCI Object Storage の知識が必要になるので、下記のドキュメントを参照しておく。 特に、バケットやオブジェクト・ストレージのリソースの制限なども理解しておくこと:
ルート・コンパートメント当たりのオブジェクト・ストレージ・ネームスペースの数: 1
下記の例では、arhebq9xwolu が、Tenancy に割り当てられたネームスペースになる:
arhebq9xwolu
Root compartment 配下に作成した bucket: satokaz-bucket の URL:
satokaz-bucket
Root 配下に作成される適当な compartment 配下に作成した bucket: bucket-20201022-2319 の URL:
bucket-20201022-2319
上記のことから、Tenancy 内に、どれだけ compartment を切って、bucket を作成しても、ネームスペース: arhebq9xwolu 配下に bucket が配置されることがわかる。
一通り、OCI と OCI オブジェクト・ストレージの学習が済んだら、ZFS Storage Appliance 上に OCI オブジェクト・ストレージ互換機能を構成してみる。
ZFS Storage Appliance で OCI API mode を構成するための手順は、ざっと下記のような流れになる:
この手の仕組みは、時刻が重要になる。 必ず、ZFS Storage Appliance 側、クライアント側共に NTP サービスを利用するように構成し、時刻の差異による問題から開放されるようにしておくこと。 手動で同期しても、徐々にズレて行くので軽視してはいけない。 大事なことなので何度でも。NTP でしっかり時刻同期がされていることを確認すること。じゃないと、下記のようなエラーが出る。 これが、時刻のズレが原因と推測するのは初見では、ほぼ不可能...
ServiceError:
{ "code": "NotAuthenticated", "message": "The required information to complete authentication was not provided", "opc-request-id": "txa26c079985f54f68b5748-005ff95e2e", "status": 401 }
Chrome 限定の話になってしまうが、ZFS Storage Appliance の BUI は、日本語対応のため項目が日本語表示される。 しかしながら、マニュアルなどは英語のものが多く、そのため、すぐにブラウザの表示言語を変更できるようにしておくと、色々と捗る気がする。 Chrom であれば、下記の拡張機能をインストールしておくことで簡単に実現することができる:
まずは、ZFS Storage Appliance 上にユーザーを作成する。share とその上に作成される bucket を読み書きするユーザーとなる。
Configuration > Users
Type: Local を指定し、ZFS Storage Appliance 上に作成してみる。 作成したユーザー名は、OCI CLI 利用時の ユーザー OCID としても利用する。(やっと、OCID が出てきた)
ユーザー OCID
ちなみに、初めから用意されている root ユーザーは、利用できない。 下記のように NotAuthenticated になるので、必ず専用のユーザーを作成しておくこと:
root
NotAuthenticated
% oci os bucket create --endpoint http://192.168.100.166/oci -ns export/oci-project/oci-object-1 --compartment-id export/oci-project/oci-object-1 --name testbucket0 ServiceError: { "code": "NotAuthenticated", "message": "The required information to complete authentication was not provided", "opc-request-id": "txb7a4c32a5ae5452daa32a-0060176fc9", "status": 401 }
ZFS Storge Appliance において、OCI オブジェクト・ストレージの器となる、bucket そのものの配置先は、share となる。 これが、オブジェクトを格納するためのエンドポイントとなる。 既存の Project 配下に作成しても良いし、オブジェクト・ストレージ互換機能専用の Project を作成し、その配下に share を作成しても良い。
share
Project そのものを書き込み先として指定することはできない。Project 配下に必ず share を作成し設定を行うこと。 そして、その share では必ず、share -> protocol -> HTTP の OCI API mode を指定しておく必要がある。
OCI API mode
例として、IP address: 192.168.100.166 がアサインされる、ZFS Storage Appliance 上に Project: oci-project を作成、その配下に、share: oci-object-1 を作成してみる
oci-project
oci-object-1
Project: oci-project
share: oci-object-1
エンドポイントは、http://192.168.100.166/oci/n/export/oci-project/oci-object-1/ となる。
http://192.168.100.166/oci/n/export/oci-project/oci-object-1/
また、share は、OCI CLI の下記オプションに渡す値になる:
--namespace-name, --namespace, -ns [text]
/export/oci-project
/export/oci-project/oci-object-1
このような条件である場合、-ns へ渡される値は、export/oci-project/oci-object-1 となる
export/oci-project/oci-object-1
ZFS Storage Appliance の BUI にアクセスし、OCI オブジェクト・ストレージ互換機能を有効にする。
Enable OCI
Default path
Default path は、オブジェクトを格納するデフォルトの場所となり、OCI API mode が有効になっている share のマウントポイント (/export/oci_satokaz みたいな感じ) を指定する。 クライアントでオブジェクトの場所を指定しない場合は、このパスが使用される。 Default Path にセットされた share のマウントポイントは、オブジェクトストレージサービスにアクセスするクライアントが使用するデフォルトのネームスペース (OCI で言うところの「ルート・コンパートメント当たりのオブジェクト・ストレージ・ネームスペース」)として使用される。
Default Path を設定しなくても、サービスは有効化できる。
Project を、Default path に設定する事もできるが、そのパス直下に bucket を作成することはできないみたいなので、必ず、Project 配下に share を作成し、その share を指定すること。 share が存在しない Project を Default Path に指定すると、下記のエラーが出力される: Default path: Path does not exist: Check that there is a valid share configured for OCI
Project を、Default path に設定する事もできるが、そのパス直下に bucket を作成することはできないみたいなので、必ず、Project 配下に share を作成し、その share を指定すること。
share が存在しない Project を Default Path に指定すると、下記のエラーが出力される:
Default path: Path does not exist: Check that there is a valid share configured for OCI
少し先の項目になってしまうが、OCI CLI からネームスペースを取得してみる。
OCI CLI の oci os ns get コマンドの用途は、ネームスペースを取得するコマンドになる。 OCI オブジェクト・ストレージでは、ルート・コンパートメントに一意のネームスペースが割り当てられているため、必ず値が返ってくる。 ZFS Storage Appliance では、ネームスペースの替わりに、Default path でなんとかしてるっぽい。
oci os ns get
Default path に Project:/export/oci-project/oci-object-1を指定して実行して見た結果:
% oci os ns get --endpoint http://192.168.100.166/oci { "data": "export/oci-project/oci-object-1" }
Default path に何も設定しない場合、OCI CLI の oci os ns get コマンドは、何も返さない。これは、何も設定されていないので、返すべき値がないから。 OCI CLI で --compartment-id, -c [text] と --namespace-name, --namespace, -ns [text] に必ず値をセットして利用するのであれば、Default path 設定は空でも構わない。
--compartment-id, -c [text]
認証は、PEM フォーマットの RSA キー・ペアを作成し、公開鍵を ZFS Storage Appliance に登録することで行う。 PEM フォーマット以外は、Key: Invalid RSA public key (not in PEM format) と怒られるので使えない事に注意。 また、ssh-keygen だと、-m PEM を指定し PEM フォーマットで出力できる事になっているが、この方法で作成した鍵は PEM format として認めてくれないのでダメ。
Key: Invalid RSA public key (not in PEM format)
openssl コマンドを利用して、キー・ペアを作成する。 詳細については、下記のドキュメントを参照:
% mkdir ~/.oci % openssl genrsa -out ~/.oci/oci_api_key.pem 2048 % chmod go-rwx ~/.oci/oci_api_key.pem % openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem writing RSA key % ls ~/.oci ./ ../ oci_api_key.pem oci_api_key_public.pem
作成した公開鍵を ZFS Storage Appliance へ登録する。
ここまで設定できれば、ZFS Storage Appliance は、OCI オブジェクト・ストレージとして振る舞える状態になっている。 あとは、クライアントから叩くだけ。 ちなみに、本物 OCI オブジェクト・ストレージのように、S3 互換のプロトコルを利用して、オブジェクトを操作することはできない。 ZFS Storage Appliance は、 S3 互換オブジェクトストレージの機能も提供しているが、この機能経由で、OCI オブジェクト・ストレージ互換機能で読み書きされたオブジェクトを扱うことはできない。 同じ、Share を利用することは可能だが、xattr か何かを使ってうまく干渉しないようにしている。
ZFS Storage Appliance で OCI オブジェクト・ストレージ互換機能を利用する - OCI CLI から叩く
へ続く
ZFS Storage Appliance で OCI オブジェクト・ストレージ互換機能を利用する
簡単に言うと、ZFS Storage Appliance の share (共有領域)を OCI Object Store に見立てて利用する事を目的とした機能。
ZFS Storage Appliance では、
ZFS Storage Appliance Object API サービス
(OCI API mode) を提供する。 この機能を有効にすることで、ZFS Storage Appliance は、OCI オブジェクト・ストレージ互換の API を提供でき、Cloud サービスとして提供される OCI オブジェクト・ストレージ機能をオンプレ上に実装することができ、OCI オブジェクト・ストレージ native API を使用するアプリケーションを変更することなく、それらを利用し、ZFS Storage Appliance にデータを格納することが可能となる。と言うわけで、必要なものは、ZFS Storage Appliance になる。
機能詳細については、下記のマニュアルを:
利用目的としては、実際のサービスコストを消費することなく、OCI オブジェクト・ストレージ native API を用いたアプリケーションの開発(Bandwidth: read/write limits の操作も可能)、OCI オブジェクト・ストレージと連携したバックアップをオンプレミス上に取得するなどが想定される。
例えば、OCI CLI を改変することなく、
oci os
コマンドで基本機能の操作ができる。 サポートされる OCI Object Storage API は、下記のマニュアルを参照。Buckets と Object の操作、Multipart Upload のみをサポートしている:OCI オブジェクト・ストレージ互換機能を利用する前に
OCI オブジェクト・ストレージ互換機能のための OCI 契約は必要ない。 が、OCI オブジェクト・ストレージ互換となるため、Oracle Cloud Infrastructure の概念や用語など、事前にいくつか理解しておく必要がある。
主な概念および用語
特に、下記の項目の用語は把握しておくこと:
Oracle Cloud Identifier (OCID) について
OCI のサービスを理解する上で
リソースの識別子
を覚えておくと良い。 特に、ほとんどの Oracle Cloud Infrastructure リソースに割り当てられるOracle Cloud Identifier (OCID)
というものがあるということを覚えておく必要がある:テナンシの OCID とユーザーの OCID
OCI Object Storage を利用するためには、テナンシとユーザーに割り当てられるリソース識別子である、下記の OCID を把握しておく必要がある:
この 2 つは、すぐに探せるように理解しておくこと:
OCI オブジェクト・ストレージの概要
OCI オブジェクト・ストレージについては、下記のドキュメントが役立つ:
ZFS Storage Appliance の Cloud Backup 機能では、OCI Object Storage の知識が必要になるので、下記のドキュメントを参照しておく。 特に、バケットやオブジェクト・ストレージのリソースの制限なども理解しておくこと:
下記の例では、
arhebq9xwolu
が、Tenancy に割り当てられたネームスペースになる:Root compartment 配下に作成した bucket:
satokaz-bucket
の URL:Root 配下に作成される適当な compartment 配下に作成した bucket:
bucket-20201022-2319
の URL:上記のことから、Tenancy 内に、どれだけ compartment を切って、bucket を作成しても、ネームスペース:
arhebq9xwolu
配下に bucket が配置されることがわかる。OCI オブジェクト・ストレージ互換機能の構成手順
一通り、OCI と OCI オブジェクト・ストレージの学習が済んだら、ZFS Storage Appliance 上に OCI オブジェクト・ストレージ互換機能を構成してみる。
ZFS Storage Appliance で OCI API mode を構成するための手順は、ざっと下記のような流れになる:
構成上の注意
時刻同期は確実に
この手の仕組みは、時刻が重要になる。 必ず、ZFS Storage Appliance 側、クライアント側共に NTP サービスを利用するように構成し、時刻の差異による問題から開放されるようにしておくこと。 手動で同期しても、徐々にズレて行くので軽視してはいけない。 大事なことなので何度でも。NTP でしっかり時刻同期がされていることを確認すること。じゃないと、下記のようなエラーが出る。 これが、時刻のズレが原因と推測するのは初見では、ほぼ不可能...
ServiceError:
ブラウザのロケールを簡単に切り替え可能にしておく (tips)
Chrome 限定の話になってしまうが、ZFS Storage Appliance の BUI は、日本語対応のため項目が日本語表示される。 しかしながら、マニュアルなどは英語のものが多く、そのため、すぐにブラウザの表示言語を変更できるようにしておくと、色々と捗る気がする。 Chrom であれば、下記の拡張機能をインストールしておくことで簡単に実現することができる:
ユーザーを作成する
まずは、ZFS Storage Appliance 上にユーザーを作成する。share とその上に作成される bucket を読み書きするユーザーとなる。
Configuration > Users
Type: Local を指定し、ZFS Storage Appliance 上に作成してみる。 作成したユーザー名は、OCI CLI 利用時の
ユーザー OCID
としても利用する。(やっと、OCID が出てきた)ちなみに、初めから用意されている
root
ユーザーは、利用できない。 下記のようにNotAuthenticated
になるので、必ず専用のユーザーを作成しておくこと:Object を配置する share を作成する
ZFS Storge Appliance において、OCI オブジェクト・ストレージの器となる、bucket そのものの配置先は、
share
となる。 これが、オブジェクトを格納するためのエンドポイントとなる。 既存の Project 配下に作成しても良いし、オブジェクト・ストレージ互換機能専用の Project を作成し、その配下に share を作成しても良い。Project そのものを書き込み先として指定することはできない。Project 配下に必ず
share
を作成し設定を行うこと。 そして、その share では必ず、share -> protocol -> HTTP のOCI API mode
を指定しておく必要がある。例として、IP address: 192.168.100.166 がアサインされる、ZFS Storage Appliance 上に Project:
oci-project
を作成、その配下に、share:oci-object-1
を作成してみるProject:
oci-project
OCI API mode
を設定しなくても良い。設定を継承させたい場合は、セットする。share:
oci-object-1
エンドポイントは、
http://192.168.100.166/oci/n/export/oci-project/oci-object-1/
となる。また、share は、OCI CLI の下記オプションに渡す値になる:
--namespace-name, --namespace, -ns [text]
oci-project
の mount point は/export/oci-project
に指定されているoci-object-1
の mount point は、/export/oci-project/oci-object-1
に指定されているこのような条件である場合、-ns へ渡される値は、
export/oci-project/oci-object-1
となるZFS Storage Appliance Object API サービス を有効にする
ZFS Storage Appliance の BUI にアクセスし、OCI オブジェクト・ストレージ互換機能を有効にする。
Enable OCI
にチェックを入れ、Default path
を指定するDefault path は、オブジェクトを格納するデフォルトの場所となり、OCI API mode が有効になっている share のマウントポイント (/export/oci_satokaz みたいな感じ) を指定する。 クライアントでオブジェクトの場所を指定しない場合は、このパスが使用される。 Default Path にセットされた share のマウントポイントは、オブジェクトストレージサービスにアクセスするクライアントが使用するデフォルトのネームスペース (OCI で言うところの「ルート・コンパートメント当たりのオブジェクト・ストレージ・ネームスペース」)として使用される。
Default Path を設定しなくても、サービスは有効化できる。
少し先の項目になってしまうが、OCI CLI からネームスペースを取得してみる。
OCI CLI の
oci os ns get
コマンドの用途は、ネームスペースを取得するコマンドになる。 OCI オブジェクト・ストレージでは、ルート・コンパートメントに一意のネームスペースが割り当てられているため、必ず値が返ってくる。 ZFS Storage Appliance では、ネームスペースの替わりに、Default path
でなんとかしてるっぽい。Default path に Project:
/export/oci-project/oci-object-1
を指定して実行して見た結果:Default path
に何も設定しない場合、OCI CLI のoci os ns get
コマンドは、何も返さない。これは、何も設定されていないので、返すべき値がないから。 OCI CLI で--compartment-id, -c [text]
と--namespace-name, --namespace, -ns [text]
に必ず値をセットして利用するのであれば、Default path
設定は空でも構わない。ユーザーの認証用鍵を作成し公開鍵を ZFS Storage Appliance に登録
認証は、PEM フォーマットの RSA キー・ペアを作成し、公開鍵を ZFS Storage Appliance に登録することで行う。 PEM フォーマット以外は、
Key: Invalid RSA public key (not in PEM format)
と怒られるので使えない事に注意。 また、ssh-keygen だと、-m PEM を指定し PEM フォーマットで出力できる事になっているが、この方法で作成した鍵は PEM format として認めてくれないのでダメ。openssl コマンドを利用して、キー・ペアを作成する。 詳細については、下記のドキュメントを参照:
作成した公開鍵を ZFS Storage Appliance へ登録する。
ここまでの状態
ここまで設定できれば、ZFS Storage Appliance は、OCI オブジェクト・ストレージとして振る舞える状態になっている。 あとは、クライアントから叩くだけ。 ちなみに、本物 OCI オブジェクト・ストレージのように、S3 互換のプロトコルを利用して、オブジェクトを操作することはできない。 ZFS Storage Appliance は、 S3 互換オブジェクトストレージの機能も提供しているが、この機能経由で、OCI オブジェクト・ストレージ互換機能で読み書きされたオブジェクトを扱うことはできない。 同じ、Share を利用することは可能だが、xattr か何かを使ってうまく干渉しないようにしている。