2017年8月3日

 

ブロードバンドタワー緒方です。今回は、先日リリースされた Scality 社の Zenko について紹介させていただきます。

Zenko とは?

2017/7/11 に Scality 社が Zenko というマルチクラウドデータコントローラなるものをリリースしました。

http://www.zenko.io/

Zenko は、S3 ベースのアプリケーション開発をより簡単に進めるためのソリューションです。と、以前同じような記事を書いたことがあると思ったら、こちらでした。

以前紹介させていただいた S3 Server が Zenko のコアコンポーネント的扱いになっているようです。 リリースされて間もないこともあり、Zenko 関連のドキュメントを読んでいると用語の統一途上にあるようです。この記事では S3 Server として紹介させていただきます。

以前の S3 Server からいろいろと機能追加されたのですが、個人的にグッと来たのがデータの保存先をローカルストレージ以外に AWS S3 や Azure Blob Storage などを利用することができるようになった点にあります。

ちなみに、Azure Blob Storage は本記事を執筆中には未実装になっていまして、下記のロードマップには late July 2017 と記載がありました。

Azure Blob Storage が利用できるようになった際には再度ご紹介させていただきます。

今回の記事では、AWS S3 を利用する構成を検証してみました。

検証環境について

いつものように、手元の Mac mini で動作検証をしようと思っていたのですが、経年劣化が原因か壊れてしまって修理のめども立たず……。今回は社内の OpenStack の インスタンス ( CentOS7 ) を利用して検証環境を構築してみました。

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

また、今回はこの検証環境に Docker 環境を構築するところから話を進めていきます。

1 Docker 環境構築

1.1 Docker インストール

まず、用意した CentOS7 の環境に Docker をインストールしていきます。公式ドキュメントをもとに作業を進めます。

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce
sudo usermod -aG docker $USER

最後のコマンドで、自身を docker グループに追加しました。 ここで新規で追加したグループを反映させるため、一度ログアウトして、再度ログインを実施します。

1.2 docker0 のIPアドレスを変更

必要に応じて、docker0 の IP アドレスを変更します。

実は、docker0 の default の IP アドレスブロック ( 172.17.0.0/24 ) と、Floating IP ( AWS でいうところの Elastic IP Address ) のアドレスブロックがかぶっていました。そのため、docker を起動した瞬間にインスタンスとの通信ができなくなってしまいました……。OpenStack では、インスタンスにコンソール経由でログインできるのですが、ログインユーザ ( centos ) のパスワードの設定を事前にしていなかったため、にっちもさっちもいかなくなりました。おかけで、障害解析用に育てていたインスタンスを失う羽目になってしまいました……。

docker0 の IP アドレスを変更するために、まずは docker の設定ファイルを設置する Directory を作成します。

sudo mkdir /etc/docker

その後、作成した /etc/docker 以下に daemon.json のファイルを設置します。今回は、172.30.0.1/24 で設定してみました。

  • /etc/docker/daemon.json
{
   "bip": "172.30.0.1/24"
}

1.3 docker の起動

docker を起動できる準備ができたので、下記のコマンドを実行して docker を起動させます。

sudo systemctl enable docker
sudo systemctl start docker

systemctl status docker コマンドで、起動確認を行います。

$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-07-24 14:13:12 JST; 44min ago
     Docs: https://docs.docker.com
 Main PID: 15716 (dockerd)
   Memory: 21.9M
   CGroup: /system.slice/docker.service
           ├─15716 /usr/bin/dockerd
           └─15728 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --stat...
           :

ちゃんと起動しているようです。

試しに、hello-world を実行してみます。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b04784fba78d: Pull complete
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74fp
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

hello-world がちゃんと動きました。

2 S3 Server docker イメージの準備

docker 環境の準備も完了しましたので、S3 Server の docker イメージを準備します。 docker pull scality/s3server といきたいところですが、データの保存先を AWS S3 に向けるためには、すこしだけ docker イメージの手直しが必要になります。そのため、GitHub 上の S3 Server のレポジトリから git clone を利用して source code を Download します.

2.1 git clone の実行

それでは、git clone を実行します。S3 Server は絶賛開発中なため、git clone 後、commit id を指定して git checkout を実行します。 本記事では、下記にあります commit id を基に検証を進めていきます。

$ pwd
/home/centos

$ git clone https://github.com/scality/S3
Cloning into 'S3'...
remote: Counting objects: 18729, done.
remote: Compressing objects: 100% (75/75), done.
remote: Total 18729 (delta 62), reused 66 (delta 40), pack-reused 18613
Receiving objects: 100% (18729/18729), 31.55 MiB | 2.81 MiB/s, done.
Resolving deltas: 100% (12626/12626), done.

$ cd S3

$ git checkout 31a14d97d9212273e2afb8ef7aec24edc0794e3a
Note: checking out '31a14d97d9212273e2afb8ef7aec24edc0794e3a'.
  :
< 途中省略 >
  :
HEAD is now at 31a14d9... Merge pull request #823 from scality/ft/S3C-658-supportMultipleRoles

2.2 docker-entrypoint.sh ファイルの編集

git clone した S3 Directory 以下にある docker-entrypoint.sh を編集します。

編集内容ですが、94 行目の mv config.json.tmp config.json と、106 行目の mv locationConfig.json.tmp locationConfig.json をコメントアウトするだけです。

以下に、diff -up コマンドの出力結果を記載します。

$ diff -up docker-entrypoint.sh.orig docker-entrypoint.sh
--- docker-entrypoint.sh.orig   2017-07-24 15:52:53.630403850 +0900
+++ docker-entrypoint.sh        2017-07-24 15:53:06.684403853 +0900
@@ -91,7 +91,7 @@ if [[ "$REDIS_PORT" ]]; then
 fi

 jq "$JQ_FILTERS_CONFIG" config.json > config.json.tmp
-mv config.json.tmp config.json
+# mv config.json.tmp config.json

 # modifying locationConfig.js

@@ -103,7 +103,7 @@ if [[ "$S3DATA" == "multiple" ]]; then
 fi

 jq "$JQ_FILTERS_LOCATION" locationConfig.json > locationConfig.json.tmp
-mv locationConfig.json.tmp locationConfig.json
+# mv locationConfig.json.tmp locationConfig.json

 # s3 secret credentials for Zenko
 if [ -r /run/secrets/s3-credentials ] ; then

編集が必要なファイルはこれだけです。

2.3 docker イメージの作成

それでは、カスタムした docker イメージを作成してみましょう。git clone した S3 Directory に移動してコマンドを実行します。 今回、Docker Hub は利用していないため、イメージの名称はレポジトリ名を含まない形にしてみました。

※ イメージができあがるまで、少し時間がかかります。

$ pwd
/home/centos/S3

$ docker build -t s3server.custom:1.0 .
  :
< 途中省略 >
  :
Successfully built 830532ee9fc0
Successfully tagged s3server.custom:1.0

docker images コマンドで作成した docker イメージが存在していることを確認してます。

$ docker images s3server.custom
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
s3server.custom     1.0                 830532ee9fc0        5 minutes ago       300MB

ちゃんとできてます。

3 AWS 環境準備

S3 Server のデータの保存先を AWS S3 で利用するために、必要な準備を行います。

3.1 S3 バケットの作成

まず、S3 Server のデータの保存先であるバケットを作成します。

今回の例では、東京リージョンに zenkotestbbtower.tokyo という名前で作成しました。 作成したバケットですが、バージョニングを有効化してください。

S3 Server がデータの保存先としてS3 バケットを利用するためには、バージョニングが有効化されている必要があります。

3.2 アクセスキーの準備

  • アクセスキー ID
  • シークレットアクセスキー

これは、S3 の読み書きできる権限があれば、既存のキーでも問題ありません。

3.3 AWS CLI のインストールと設定

S3 Server を動かすために必須ではないのですが、あると便利なので、AWS CLI をインストールします。

sudo yum install epel-release -y
sudo yum install python-pip -y
sudo pip install pip --upgrade
sudo pip install awscli

次に、AWS CLI の初期設定を実行します。

$ aws configure
AWS Access Key ID [None]: <ACCESS_KEY> <- アクセスキー ID を入力
AWS Secret Access Key [None]: <SECRET_ACCESS_KEY> <- シークレットアクセスキーを入力
Default region name [None]: ap-northeast-1 <- 今回は、東京リージョンを指定
Default output format [None]: json

設定ファイルが作成されていることを確認してみます。

$ ls .aws/
config  credentials

S3 Server 起動時に必要になってくるのが、credentials ファイルになります。 このファイルにアクセスキー ID/シークレットアクセスキーの記載があります。

  • credentials
[default]
aws_access_key_id = <ACCESS_KEY>
aws_secret_access_key = <SECRET_ACCESS_KEY>

4 S3 Server 設定ファイルの編集

ここまでくればあと一歩です。最後に S3 Server の設定ファイルを編集します。 設定が必要なファイルは、下記の 2 ファイルになります。

  • locationConfig.json
  • config.json

4.1 設定ファイルのコピーと編集

まず、必要な設定ファイルをユーザの Home Directory にコピーします。 今回の例では centos というユーザを利用しています。

git clone した S3 Directory から locationConfig.jsonconfig.json をコピーします。

$ pwd
/home/centos

$ cp S3/config.json S3/locationConfig.json .

4.2 locationConfig.json の編集

locationConfig.json には AWS の S3 に関する情報を記載します。

設定ファイル内に、AWS S3 のエンドポイントを指定する箇所があります。今回の例では東京リージョンのエンドポイント ( s3-ap-northeast-1.amazonaws.com ) を指定しています。東京リージョン以外のリージョンを利用したい場合は、各リージョンのエンドポイントを指定する必要があります。AWS のリージョンとエンドポイントの情報は下記のページを参考にしてください。

"aws-test": { <- この設定を識別するための任意の文字列
  "type": "aws_s3",
  "legacyAwsBehavior": true,
  "details": {
    "awsEndpoint": "s3-ap-northeast-1.amazonaws.com", <- AWS S3 のエンドポイントを指定 ( 今回は東京リージョンのエンドポイントを指定 )
    "bucketName": "zenkotestbbtower.tokyo", <- バケット名称
    "bucketMatch": true,
    "credentialsProfile": "default"
  }
}

以下に、diff -up コマンドの出力結果を記載します。

$ diff -up S3/locationConfig.json locationConfig.json
--- S3/locationConfig.json      2017-07-25 10:46:31.732076787 +0900
+++ locationConfig.json 2017-07-24 18:44:43.084807758 +0900
@@ -28,8 +28,8 @@
         "type": "aws_s3",
         "legacyAwsBehavior": true,
         "details": {
-            "awsEndpoint": "s3.amazonaws.com",
-            "bucketName": "multitester555",
+            "awsEndpoint": "s3-ap-northeast-1.amazonaws.com",
+            "bucketName": "zenkotestbbtower.tokyo",
             "bucketMatch": true,
             "credentialsProfile": "default"
         }

4.3 config.json の編集

config.json には S3 Server のエンドポイントの設定を行います。S3 クライアントがアクセス先として指定するものになります。 今回の例では、S3 Server を動作させるインスタンスの Floating IP を指定された場合に、データの保存先としてS3 バケットを利用するように設定します。

"restEndpoints": {
    "localhost": "file",
    "127.0.0.1": "file",
    "s3.docker.test": "us-east-1",
    "127.0.0.2": "us-east-1",
    "172.17.195.25": "aws-test", <- 172.17.195.25 にアクセスがあった場合には、`aws-test` に向くように設定
    "s3.amazonaws.com": "us-east-1"
},

以下に、diff -up コマンドの出力結果を記載します。

$ diff -up S3/config.json config.json
--- S3/config.json      2017-07-25 10:44:41.124053469 +0900
+++ config.json 2017-07-24 18:36:28.425791686 +0900
@@ -7,6 +7,7 @@
         "127.0.0.1": "file",
         "s3.docker.test": "us-east-1",
         "127.0.0.2": "us-east-1",
+        "172.17.195.25": "aws-test",
         "s3.amazonaws.com": "us-east-1"
     },
     "websiteEndpoints": ["s3-website-us-east-1.amazonaws.com",

5 S3 Server の起動

ついに S3 Server の起動になります。少しコマンドが長いですが、下記のコマンドを実行します。 -v オプションで、ホストに設置している設定ファイル群をコンテナ内で参照できるようにしてあげます。

$ docker run -d --rm --name s3server -p 8000:8000 \
  -v /home/centos/.aws/credentials:/root/.aws/credentials \
  -v /home/centos/locationConfig.json:/usr/src/app/locationConfig.json \
  -v /home/centos/config.json:/usr/src/app/config.json \
  -e S3DATA=multiple \
  s3server.custom:1.0

docker ps コマンドで、コンテナの起動確認を行います。

$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
eede25cef989        s3server.custom:1.0   "/usr/src/app/dock..."   3 seconds ago       Up 2 seconds        0.0.0.0:8000->8000/tcp   s3server

ちゃんと起動していますね。

6 S3 クライアントを利用して S3 Server にアクセスしてみる

S3 Server の準備は完了したので、S3 クライアントを利用してアクセスしてみましょう。 今回は Windows マシンに S3 Browser をインストールしてみて検証してみました。

6.1 セットアップ

S3 Browser を起動したら、左上の Accounts から、Add new account.. をクリックします。

Edit Account の新しい Window が開きますので、キャプチャー画面にあるように入力していきます。

  • Account Name
    • 任意の文字列を入力。今回は、Zenko と入力
  • Account Type
    • S3 Compatible Storage を選択します
  • REST Endpoint
    • S3 Server の IP/Port を指定します。この例では、S3 Server が動いている検証環境の 172.17.195.25:8000 を指定しています。
  • Access Key ID
    • S3 Server の default の Access Key ID である、accessKey1 を入力します。
  • Secret Access Key
    • S3 Server の default の Secret Access Key である、verySecretKey1 を入力します。

注意していただきたい点として、Access Key ID/Secret Access Key は AWS から払い出された Key ではなく、S3 Server の Key ( 今回は default 値 ) を利用する点です。

必要な情報を入力したら、Save changes をクリックします。

6.2 バケット の作成

S3 Browser のメイン Window の左上にある、+New bucket をクリックして、新しい バケット を追加します。

Bucket names に新規で作成したい bucket 名を入力します。Bucket region は Default Region のままで OK です。

検証用として、下記の二つの バケット を作成してみました。

  • mybucket
  • mybucket2

6.3 ファイルの追加

先ほど作成したバケットにファイルを追加してみます。S3 Browser のメイン Window の左側にある bucket 名を指定して、ファイルをドラッグして追加します。

mybucket に、job_log.txt というファイルを追加してみました。

mybucket2 には、job_log2.txt といファイルを追加してみました。

6.4 Amazon S3 側での確認

先ほど S3 Server に保存したファイル、job_log.txtjob_log2.txt が Amazon S3 上に保存されているか確認してみます。

Web ブラウザを利用して、AWS マネジメントコンソールにログインして、Amazon S3 を選択します。

先ほど S3 Server に保存したファイル、job_log.txtjob_log2.txt が保存されていることが確認できました。 S3 Browser 経由で bucket を二つ ( mybucket と mybucket2 ) を作成したのですが、Amazon S3 側ではこのバケットは存在していません。

また、6.3 ファイルの追加で追加したファイル ( job_log.txt, job_log2.txt ) は、zenkotestbbtower.tokyo バケット配下に保存されています。

最後に

Zenko はリリースして間もないこともあり、アップデートが頻繁に行われています。Azure Blob Storage を利用できたりと将来的に楽しみなアップデートが控えています。折を見て検証を行い、本ブログにてさらにご紹介させていただく予定です。

 

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: 緒方 亮

主に Azure や AWS などの Public Cloud を担当しています。機械学習/深層学習で R を利用しているため、投稿する記事に R がよく登場します。