見出し画像

S3オブジェクトストレージを設定してみた

世の中的にはオブジェクトストレージを使っている方も多く、最近は ZFS Storage でもお問い合わせをいただく。今回はちょっとしたつまずきポイントををご紹介しつつ、ZFS Storage にS3互換の設定をする方法をご紹介したい。

大まかな流れ

設定の設定の大まかなな流れは以下の通りだ。

  1. HTTPサービスにシステム全体でS3互換モードを有効にする設定をする。

  2. アクセスキーとシークレットキーを作成する。

  3. バケットを格納するシェアを作成して、S3互換モードを利用する設定をする。

  4. 接続試験を行う。

4については、アクセスキーとシークレットキーをご自分の環境に合うように変更して頂く必要があるが、boto3でのサンプルコードをご提供しておく。秘密情報をハードコーディングしてあったり、SSLの警告を無視したりとダメなコードの見本だが、接続試験には使っていただけると思う。なお、現状有姿でのご提供であり、ご自分の責任でご利用いただきたい。

https://gitlab.com/hisao.tsujimura/public/-/tree/master/object_storage/zfssa_s3

S3互換モードを有効にする

最初に行うべきは、S3互換モードを有効にする事だ。NFSやSMBなどが使われる事が多い事もあって、HTTPはデフォルトでは有効になっていない。有効にするには、Configuration(構成)、Services(サービス) の順に選び、サービス一覧に表示されているHTTPの行の一番右にある電源ボタンマークのアイコンをクリックする。

図1: サービス一覧

つぎに、HTTPのラベルをクリックすると、システム全体のHTTPサービスの設定が表示される。

図2: システム全体のHTTPサービスの設定

S3とかかれているラベルの部分をクリックすると、図3のようにS3 APIの設定が表示される。Enable S3(S3を有効にする)にチェックを入れ、S3互換サービスに使うシェアへのパスを入力し 、さらにマスターパスフレーズを入力してAPPLY(適用)を押すと、S3互換サービスが有効になる。

図3: S3 API の設定

アクセスキーとシークレットキーを作成する

ここまででサービスは起動したが、API経由でアクセスするために、ユーザーの鍵を作る必要がある。図4のように Key(鍵)とかかれているラベルの左に + マークのようなボタンがあるのでこれを押してユーザーの鍵を作成する。

図4: 椎茸マークを押してキーを作成
図5: 鍵作成のダイアログ

ここでは、アクセスキーとZFS Storage上のユーザーを関連付け、アクセスキー (access key)とシークレットキー(secret key; 秘密鍵)を作成する。

語句に一貫性がなくても申し訳ないが、Keyname (鍵名)は後にアクセスキーとして提示される値だ。User(ユーザー名)はZFS Storage に既に作られているユーザーを指定するか、ここで指定した名前と同じ名称で別途新規に作成する必要がある。私の場合は、mys3userが既に作成されていたので、それを選んだ。

必要な情報を入力して、ADD(追加)を押すと、秘密鍵(secret key)が生成されて次のようなダイアログが表示される。

図6: 生成された鍵が表示されてるダイアログ

この画面が表示されたら、DOWNLOAD .CSV FILEというボタンを押して保管していただきたい。

「OKを押したら、秘密鍵が表示できないんですけど!」

うっかりOKを押してしまった筆者

セキュリティ上の問題で、OKを押すと二度と秘密鍵が表示される事はない。お問い合わせをいただいても知る方法はないので、くれぐれも保管して頂きたい。

アクセスキーとシークレットキーはCSVファイルでダウンロードされ、例えば、以下のように書かれている。

$ cat s3_keys.csv
access_key,secret_key
mys3user_key,4723ce30ee623d971a6b0d3a6411560a44a0d6521dcec0420a4f167cb5777119

バケットを格納するシェアを作成する

バケットを格納するシェアを作るには、画面上部のShares(シェア)のメニューをクリックする。

図7 シェアメニューは画面上部、中央よりやや右側

現在作成されているシェアの一覧が表示されるので Filesystems (ファイルシステム)の左側の椎茸マークをクリックする。

図8 シェアの一覧
図9 新規シェアの作成ダイアログ

シェア名はここでは、mys3 とした。シェアの作成時そのまま作ると、他のユーザーやグループの権限がない。内部では、APIでコールされた鍵に紐付けられたユーザーでアクセスするので、権限をきちんと与える必要がある。今回は練習のためにフルオープンにしてある。

OKを押し、シェアを作成したら、このシェアでS3互換モードを使う事を示す必要がある。Protocols(プロトコル)をクリックしてスクロールしていくと、以下のような設定が表示される。Inherit from project (プロジェクトから継承)のチェックを外し、S3 API mode の書き込み設定をする。ここでは、read/write (読み取り・書き込み)を選ぶ。

図10 S3 API の書き込みモードの設定

なお、APIのエンドポイントは、S3 API mode の下に小さな字で表示される。
サンプルコードではシェアの名前やZFSSAの名前などから内部でエンドポイントの文字列を生成して、新しくバケットを作成するリクエストを出している。

よく見かけるエラー

残念ながらエラーはつきものである。いくつか挙げておく。

access key Id you provided does not exist

botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the CreateBucket operation: The AWS access key Id you provided does not exist in our records.

アクセスキーやシークレットキーが異なる場合に表示される。

Internal Server Error (HTTP 500)

botocore.exceptions.ClientError: An error occurred (500) when calling the CreateBucket operation (reached max retries: 4): Internal Server Error

本当に ZFS Storage 側の問題の場合もあるが、よくあるのは、ZFS Storage のユーザー名と、鍵を作成したときのユーザー(User)に指定した値が異なっていた場合だ。この場合、鍵を再度作っていただく必要がある。また、シェアの権限が十分でない場合にも発生する。

Time Skew

ZFS Storage の時刻と、クライアントの時刻が大きく異なっていると認証で失敗する。NTPサービスなどを活用して、時刻は合わせておいていただきたい。

botocore.exceptions.ClientError: An error occurred (RequestTimeTooSkewed) when calling the CreateBucket operation: The difference between the request time and the server's time is too large.

このちょっとしたメモが少しでもお役に立てれば幸いである。

追記

内容の誤りなどについては、Twitter:@hisaotsuまでご連絡いただきたい。


この記事はここまでです。 最後まで読んでいただいてありがとうございます。 気に入っていただいたなら、スキを押していただいたり、 共有していただけるとうれしいです。 コメントや感想大歓迎です!