Dockerコンテナを手軽にデプロイしてくれるサービス「Tutum」を試してみた


先日のDockerConで、「Containers as a Service」というコンセプトについて発表がありました。

[Dockerが「Container as a Service」展開へ。IaaSモデルやPaaSモデルはコンテナの展開にとって適切ではないと。DockerCon Europe 2015](http://www.publickey1.jp/blog/15/docker_container_as_a_service.html)

その中で出てきた[Tutum](https://www.tutum.co/)（読めない）というサービスに興味が沸いてきたので、公式サイトのチュートリアルを試してみました。

特に詰まるところも無かったのですが、記録として残しておきます。 
以下、大見出しはチュートリアルの項目名と合わせています。 


## Link a cloud provider

色々なサービスがtutumと連携できるようになっています。

* Amazon Web Services
* Digital Ocean
* Microsoft Azure
* SoftLAyer
* Packet

今回はAmazon Web Services（以下AWS）と連携させることにします。

### AWSと連携する

[Link your Amazon Web Services account](https://support.tutum.co/support/solutions/articles/5000224910) 
ここに書いてあることをやっておけば大体OKです。

![Kobito.23ArqD.png](https://qiita-image-store.s3.amazonaws.com/0/2492/b9caafcb-ba46-505a-13f0-fec619557596.png "Kobito.23ArqD.png")

Account infoの画面でAWSの「Add credentials」を押すと、「Access Key ID」と「Secret Access Key」を要求されます。 
tutum用に権限を制限したIAMアカウントを作って、そいつを使ってもらうようにしましょう。

### AWSにTutum用アカウントを追加する

安直ですが、「tutum」という名前のユーザーを作ります。

![Kobito.XiPlke.png](https://qiita-image-store.s3.amazonaws.com/0/2492/cd0ec5a2-2057-33bc-8341-34af1a391794.png "Kobito.XiPlke.png")

ユーザー作成後にAWSが教えてくれる「Access Key ID」と「Secret Access Key」をコピペしてtutumに入力します。

![Kobito.pdar1K.png](https://qiita-image-store.s3.amazonaws.com/0/2492/6b8bdc9e-4103-db1a-25e2-6ee0ec0938af.png "Kobito.pdar1K.png")

が、これだけだとエラーで弾かれてしまいます。 
IAMにユーザーを作っただけで権限を何も割り当ててないのが原因。

![Kobito.jWVRn0.png](https://qiita-image-store.s3.amazonaws.com/0/2492/7a5e9da7-2354-3080-5acf-e188401c8cef.png "Kobito.jWVRn0.png")


### IAMポリシーの作成

tutum用にIAMポリシーを新しく作ります。

「独自のポリシーを作成」で「tutum-policy」という名前のポリシーを作って、下のようなポリシー設定を入れます。（tutum公式のサンプルそのままです。）

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:*",
        "iam:ListInstanceProfiles"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

``iam:ListInstanceProfiles``ってのが使えればいいみたい。

![Kobito.sO0iFM.png](https://qiita-image-store.s3.amazonaws.com/0/2492/5e75c74f-d235-8ca0-018f-c9a8a0bc8e43.png "Kobito.sO0iFM.png")

ポリシーができたらIAMのユーザー管理画面からtutumユーザーを選んで、「アクセス許可」→「ポリシーのアタッチ」で、tutum-policyを割り当てます。


### AWSとの連携完了

先ほどはエラーで弾かれてしまいましたが、今度は大丈夫なはずです。

![Kobito.eHmCCU.png](https://qiita-image-store.s3.amazonaws.com/0/2492/756bffbf-1325-2663-f604-078b979e8a34.png "Kobito.eHmCCU.png")

OKですね。


## Deploy a node

Dockerコンテナを実行してくれるノードをAWS上に作成します。

チュートリアルでNextをどんどん押していけば、こんな感じの設定で作られるはずです。一応、インスタンスタイプが大きすぎないかくらいは確認しておきましょう。

![Kobito.DCVbYh.png](https://qiita-image-store.s3.amazonaws.com/0/2492/ebd84dde-aa7d-c8be-4012-fb15c8f47e3f.png "Kobito.DCVbYh.png")

「Launch node cluster」を押せばAWS上にインスタンスが作成されます。 

![Kobito.SWUEXC.png](https://qiita-image-store.s3.amazonaws.com/0/2492/47f1630d-c8c2-2278-2fdf-6e9e6ae71211.png "Kobito.SWUEXC.png")

「Deploying」の状態だとまだインスタンスの準備中です。数分待てば立ち上がってきて、「Deployed」に変わります。

![Kobito.VgsdUD.png](https://qiita-image-store.s3.amazonaws.com/0/2492/e9f491b4-f5e3-1774-fcb3-839b880375b8.png "Kobito.VgsdUD.png")

立ち上がりました。


## Creative a service

Tutumにおけるサービスとは、「同じDockerイメージから生成されたコンテナのグループ（意訳）」だそうです。 
管理画面から簡単にコンテナ数の増減を行えるのが便利。

こんな感じにTutum公式のイメージを使ったり、DockerHub上のイメージを使うこともできます。

![Kobito.iOB1zb.png](https://qiita-image-store.s3.amazonaws.com/0/2492/07eed553-1c44-0aa3-42d5-42bcefc09912.png "Kobito.iOB1zb.png")


### サービスの作成

実行させるサービスを選びます。 
チュートリアルでは「tutum/hello-world」を使います。

続いてサービスの設定を行いますが、これもチュートリアルのNextを押していけばこんな感じで埋めてくれます。

![Kobito.4VwqcZ.png](https://qiita-image-store.s3.amazonaws.com/0/2492/e54b1eb4-645c-d767-6c6c-4e0c628cbbe6.png "Kobito.4VwqcZ.png")


「Create and deploy」でサービスを作成します。

![Kobito.7WKgpd.png](https://qiita-image-store.s3.amazonaws.com/0/2492/c2656710-4efa-809b-4fb2-cf9300a42375.png "Kobito.7WKgpd.png")

Dockerノードがちゃんと立ち上がっていれば、サービスもすぐに立ち上がるはず。

### 動作確認

「Endpoints」からサービス公開URLが確認できます。

![Kobito.T9ejNI.png](https://qiita-image-store.s3.amazonaws.com/0/2492/4fee6b75-7447-1bc3-c22a-50433cd7ba6d.png "Kobito.T9ejNI.png")

hello-worldにアクセスするとこんな感じ。

![Kobito.xhmDYb.png](https://qiita-image-store.s3.amazonaws.com/0/2492/8bca0c21-6cc4-2e3b-7457-3cb9037970eb.png "Kobito.xhmDYb.png")


### コンテナを増やしてみる

「Number of containers」を1から2に増やしてみると、エラーが出ました。

![Kobito.Rilp9z.png](https://qiita-image-store.s3.amazonaws.com/0/2492/7268627f-e3b3-88fa-f03a-2cf9fbed07c3.png "Kobito.Rilp9z.png")

Dockerノード側のポート80番が1個目のコンテナで占有されているので、同じポートを使おうとした2個目が弾かれてしまったようです。

サービスの設定で、ノード側のポートを「dynamic」にすればとりあえず解決します。 
元々80番に設定されていたものを空白にすれば、dynamicとして扱われます。

![Kobito.EQ8Mza.png](https://qiita-image-store.s3.amazonaws.com/0/2492/bdd4c01b-8e38-8c16-8612-54944e301eb6.png "Kobito.EQ8Mza.png")

実行中のコンテナには設定が反映されていないので、1個目のコンテナは再起動が必要です。 
Runningの横に！マークがついてます。

![Kobito.PqLqcI.png](https://qiita-image-store.s3.amazonaws.com/0/2492/722c43aa-f3ea-df7c-5e6b-11d1ab7d2c07.png "Kobito.PqLqcI.png")

1個目のコンテナの再起動後、コンテナ数を1から2に増やしてみると、今度はすんなり増えてくれました。

![Kobito.jSoH1G.png](https://qiita-image-store.s3.amazonaws.com/0/2492/57c85838-a870-d84f-5b67-5efb581a5d38.png "Kobito.jSoH1G.png")

が、今度はEndpointで問題が発生しています。

![Kobito.ZhPh6k.png](https://qiita-image-store.s3.amazonaws.com/0/2492/98806545-01bc-3600-91fc-229223ae8df3.png "Kobito.ZhPh6k.png")

各コンテナ単体としては、動的に割り当てられたノードのポートを使って公開できているみたいですが、サービスとしては「No endpoints for this service. 」と言われています。

ロードバランサー的な動きをするコンテナを立てて振り分けてあげれば実現できそうです。サポートサイトにもそれっぽい内容のページがありました。

[Load balancing a Web Service](https://support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service)

これは今後の宿題にしておきます。


## Create a stack

先ほどのhello-worldは単一のサービスのみで実現できるシステムでした。
複数のサービスが絡むようなシステムの場合は、コンテナ間の関係性を定義したスタックとして扱うようです。

### スタックの作成

これもチュートリアルにお任せしてNextを押していくと、こんな感じでスタックの定義が作成されます。

![Kobito.THu3GY.png](https://qiita-image-store.s3.amazonaws.com/0/2492/24f5fad2-b842-98e7-f08c-b6620d067785.png "Kobito.THu3GY.png")

他の機能はグラフィカルな感じでしたが、スタックはStackfileというDocker composeに近い書き方で設定するようです。

```
web:
  image: tutum/quickstart-python
  links:
    - "redis:redis"
  ports:
    - "5000:80"
redis:
  image: tutum/redis
  environment:
    - REDIS_PASS=password
```

PythonベースのWebアプリとRedisの2コンテナで連携するスタックを作るようですね。 
「Create and deploy」を押すとスタックが作成されます。

### 動作確認

作成されたスタックを見てみると、webとredisの2コンテナが作成されているのが分かります。

![Kobito.FHkYbC.png](https://qiita-image-store.s3.amazonaws.com/0/2492/2ffa9449-ea1b-20d5-90c1-31b624b42e7c.png "Kobito.FHkYbC.png")

hello-worldのときと同じように、「Endpoint」から公開用URLが確認できます。

![Kobito.I63dlp.png](https://qiita-image-store.s3.amazonaws.com/0/2492/ecd4ccad-4d53-4a37-7a86-3c7eb25e0b3f.png "Kobito.I63dlp.png")

フロントのWebサーバーだけが公開されてますね。 
アクセスしてみるとこんな感じ。

![Kobito.nqUT9n.png](https://qiita-image-store.s3.amazonaws.com/0/2492/1326fdaa-2173-936c-96af-d0131b833d75.png "Kobito.nqUT9n.png")




## Repositories

まだ試してません！ 
そのうちやります。


## やってみた感想

* AWSのEC2 Container Serviceと比べるとめちゃくちゃ簡単
* 複数のクラウドサービスと連携できて素敵
* 別々のクラウドサービスに跨がってコンテナを立てたら、それだけでDR構成になってたりするかも
* Tutum公式で用意されているコンテナはまだまだ種類が少ない印象