
【2017年8月3日掲載】Zenko を試してみる
ブロードバンドタワー緒方です。今回は、先日リリースされた Scality 社の Zenko について紹介させていただきます。
Zenko とは?
2017/7/11 に Scality 社が Zenko というマルチクラウドデータコントローラなるものをリリースしました。
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.json と config.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.txt と job_log2.txt が Amazon S3 上に保存されているか確認してみます。
Web ブラウザを利用して、AWS マネジメントコンソールにログインして、Amazon S3 を選択します。

先ほど S3 Server に保存したファイル、job_log.txt と job_log2.txt が保存されていることが確認できました。 S3 Browser 経由で bucket を二つ ( mybucket と mybucket2 ) を作成したのですが、Amazon S3 側ではこのバケットは存在していません。
また、6.3 ファイルの追加で追加したファイル ( job_log.txt, job_log2.txt ) は、zenkotestbbtower.tokyo バケット配下に保存されています。
最後に
Zenko はリリースして間もないこともあり、アップデートが頻繁に行われています。Azure Blob Storage を利用できたりと将来的に楽しみなアップデートが控えています。折を見て検証を行い、本ブログにてさらにご紹介させていただく予定です。
ブロードバンドタワーのエンジニアブログ『 Tower of Engineers 』で公開されていた記事をnoteに再投稿させていただきました。
過去(2017年8月3日掲載)のものではありますが、皆様に再び楽しんでいただけると嬉しいです。これからも、価値ある記事や興味深い内容を、noteでシェアさせていただく予定です。どうぞ楽しみにお待ちください。