satokaz / hitorigoto

独り言
2 stars 0 forks source link

ZFS Storage Appliance で OCI オブジェクト・ストレージ互換機能を利用する #24

Open satokaz opened 3 years ago

satokaz commented 3 years ago

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 の知識が必要になるので、下記のドキュメントを参照しておく。 特に、バケットやオブジェクト・ストレージのリソースの制限なども理解しておくこと:

ルート・コンパートメント当たりのオブジェクト・ストレージ・ネームスペースの数: 1

下記の例では、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 を構成するための手順は、ざっと下記のような流れになる:

  1. 構成上の注意
  2. ユーザーを作成する
  3. Object を配置する share を決める
  4. ZFS Storage Appliance Object API サービス を有効にする
  5. ユーザーごとの認証用公開キーを作成し ZFS Storage Appliance に登録
  6. OCI CLI を利用してオブジェクト・ストレージを操作する

構成上の注意

時刻同期は確実に

この手の仕組みは、時刻が重要になる。 必ず、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
}

image

ブラウザのロケールを簡単に切り替え可能にしておく (tips)

Chrome 限定の話になってしまうが、ZFS Storage Appliance の BUI は、日本語対応のため項目が日本語表示される。 しかしながら、マニュアルなどは英語のものが多く、そのため、すぐにブラウザの表示言語を変更できるようにしておくと、色々と捗る気がする。 Chrom であれば、下記の拡張機能をインストールしておくことで簡単に実現することができる:

ユーザーを作成する

まずは、ZFS Storage Appliance 上にユーザーを作成する。share とその上に作成される bucket を読み書きするユーザーとなる。

image

Type: Local を指定し、ZFS Storage Appliance 上に作成してみる。 作成したユーザー名は、OCI CLI 利用時の ユーザー OCID としても利用する。(やっと、OCID が出てきた)

image

ちなみに、初めから用意されている 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
  }

Object を配置する share を作成する

ZFS Storge Appliance において、OCI オブジェクト・ストレージの器となる、bucket そのものの配置先は、share となる。 これが、オブジェクトを格納するためのエンドポイントとなる。 既存の Project 配下に作成しても良いし、オブジェクト・ストレージ互換機能専用の Project を作成し、その配下に share を作成しても良い。

image

Project そのものを書き込み先として指定することはできない。Project 配下に必ず share を作成し設定を行うこと。 そして、その share では必ず、share -> protocol -> HTTP の OCI API mode を指定しておく必要がある。

  1. Shares > Filesystems で適当な share を作成。この時、User に先ほど作成したユーザー名をセット
  2. 作成した share をダブルクリック > Protocols > HTTP の OCI API mode を Read/write にセット > APPLY

例として、IP address: 192.168.100.166 がアサインされる、ZFS Storage Appliance 上に Project: oci-project を作成、その配下に、share: oci-object-1 を作成してみる

Project: oci-project

  1. Project そのものに、OCI API mode を設定しなくても良い。設定を継承させたい場合は、セットする。

image

share: oci-object-1

  1. 作成した share の Protocols で、HTTP の OCI API mode を設定すること

エンドポイントは、http://192.168.100.166/oci/n/export/oci-project/oci-object-1/ となる。

image

image

また、share は、OCI CLI の下記オプションに渡す値になる:

--namespace-name, --namespace, -ns [text]

このような条件である場合、-ns へ渡される値は、export/oci-project/oci-object-1 となる

ZFS Storage Appliance Object API サービス を有効にする

ZFS Storage Appliance の BUI にアクセスし、OCI オブジェクト・ストレージ互換機能を有効にする。

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

少し先の項目になってしまうが、OCI CLI からネームスペースを取得してみる。

OCI CLI の oci os ns get コマンドの用途は、ネームスペースを取得するコマンドになる。 OCI オブジェクト・ストレージでは、ルート・コンパートメントに一意のネームスペースが割り当てられているため、必ず値が返ってくる。 ZFS Storage Appliance では、ネームスペースの替わりに、Default path でなんとかしてるっぽい。

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 設定は空でも構わない。

ユーザーの認証用鍵を作成し公開鍵を 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 コマンドを利用して、キー・ペアを作成する。 詳細については、下記のドキュメントを参照:

% 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 へ登録する。

image

ここまでの状態

ここまで設定できれば、ZFS Storage Appliance は、OCI オブジェクト・ストレージとして振る舞える状態になっている。 あとは、クライアントから叩くだけ。 ちなみに、本物 OCI オブジェクト・ストレージのように、S3 互換のプロトコルを利用して、オブジェクトを操作することはできない。 ZFS Storage Appliance は、 S3 互換オブジェクトストレージの機能も提供しているが、この機能経由で、OCI オブジェクト・ストレージ互換機能で読み書きされたオブジェクトを扱うことはできない。 同じ、Share を利用することは可能だが、xattr か何かを使ってうまく干渉しないようにしている。

satokaz commented 3 years ago

ZFS Storage Appliance で OCI オブジェクト・ストレージ互換機能を利用する - OCI CLI から叩く

へ続く