コンテナサービスにHabitatを数分で設置する方法

この記事では、コンテナサービス上に**Habitat**を設定し、ロードバランサーを含む基本的なWebアプリケーションをデプロイして管理します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/try-habitat-with-container-service_594945)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

 [Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.53e816f600nDMZ)執筆者、イルハン・アディヤマン。[Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.53e816f600nDMZ)は、クラウドコミュニティ内での技術的な知識やベストプラクティスの共有を促進するためのAlibaba Cloudのインセンティブプログラムです。

#Habitatについて
Habitat は Chef によるオープンソースプロジェクトで、プラットフォームに依存しないビルドアーティファクトを作成することで、アプリケーションの設定、管理、動作をアプリケーション自体に移すことができます。これにより、アプリケーションをパッケージ化することができ、デプロイの準備が整うまでデプロイ先を気にする必要がありません。仮想マシン上にデプロイした後、ランタイム環境をDockerコンテナに切り替えることにした場合、アプリケーションを再パッケージ化したり書き換えたりする必要はありません。同じHabitatパッケージをリファクタリングすることなく、両方の環境で動作させることができます。Habitatは新しいアプリケーションと既存のアプリケーションの両方で動作します。次のようなことができます。

- アプリケーションの実行に必要なすべてのものを含むパッケージを構築します。
- ベアメタル、VM、クラウド、Docker、Mesos、Kubernetesなど、あらゆるプラットフォームにアプリケーションをデプロイできます。
- 実行中のアプリケーションを管理し、同じネットワーク内の他のサービスによる設定変更に対応します。

つまり、簡単に言えば、Habitatを使えばアプリケーションをパッケージ化することができ、デプロイの準備が整うまでデプロイ先を気にする必要がないということです。例えば、VMからDockerコンテナにランタイム環境を切り替える場合でも、アプリのリパッケージや書き換えは必要ありません。

あなたのチームがマイクロサービスの開発を模索している、または積極的に開発を行っている場合、この記事では、Alibaba Cloud [Container Service](https://www.alibabacloud.com/product/container-service?spm=a2c65.11461447.0.0.53e816f600nDMZ)と[Container Registry](https://www.alibabacloud.com/product/container-registry?spm=a2c65.11461447.0.0.53e816f600nDMZ)を使用してクラウドネイティブアプリケーションをデプロイして管理するためのシンプルで一貫性のある方法をHabitatがどのように提供しているかを理解していただけると思います。

#前提条件
Alibaba Cloudのアカウントを持つ必要があります。まだ持っていない場合は、[無料トライアルのページ](https://www.alibabacloud.com/campaign/free-trial?spm=a2c65.11461447.0.0.53e816f600nDMZ)にアクセスして無料アカウントを取得してください。

ワークステーションでは、Dockerもインストールする必要があります。Dockerに慣れていない場合は、[Getting Startedガイド](https://docs.docker.com/get-started/?spm=a2c65.11461447.0.0.53e816f600nDMZ)を読むと、Dockerの仕組みをよりよく理解することができます。また、HabitatのBuilderサービスで認証できるように、GitHubのアカウントも必要になります。Habitat Builderは、自分のパッケージを保存したり、他の人が作ったパッケージを入手したりするための場所です。

#Habitatの設置
###ステップ1：Habitat Builderでアカウントを作成する
Habitat Builderは、Habitatのメインハブであり、Habitatのパッケージを保存したり、自動的にビルドしたり、デプロイしたりすることができます。ワークステーションの設定を始める前に、[Habitat Builder](https://bldr.habitat.sh/?spm=a2c65.11461447.0.0.53e816f600nDMZ#/pkgs/core)のアカウントを設定しておきましょう。このチュートリアルでは、ワークステーションがHabitat Builderアカウントと通信するように設定するために、Habitat Builderアカウントのパーソナルアクセストークンが必要になります。

Habitat Builderでアカウントを作成するには、[Habitatのドキュメント](https://www.habitat.sh/docs/using-builder/?spm=a2c65.11461447.0.0.53e816f600nDMZ)を開き、アカウントの作成方法を説明しています。このチュートリアルでは、最初の3つのステップを完了させてください。

- [ビルダーアカウントの作成](https://www.habitat.sh/docs/using-builder/?spm=a2c65.11461447.0.0.53e816f600nDMZ#builder-account)
- [ビルダーにオリジンを作成](https://www.habitat.sh/docs/using-builder/?spm=a2c65.11461447.0.0.53e816f600nDMZ#builder-origin)
- [アクセス・トークンの生成](https://www.habitat.sh/docs/using-builder/?spm=a2c65.11461447.0.0.53e816f600nDMZ#builder-token)
上記の手順が完了したら、`HAB_ORIGIN`と`HAB_AUTH_TOKEN`の環境変数を設定します。これらの環境変数を追加しておくことで、パッケージ名やbuilderでの認証などの作業がしやすくなります。

`try-habitat`を以下のようにオリジン名に置き換えてください。

```
$ export HAB_ORIGIN=try-habitat
```

トークンを実際の`auth_token`の値に置き換えます。

```
$ export HAB_AUTH_TOKEN=<replace-this-with-your-auth-token>
```

###ステップ2：ワークステーションにHabitatをインストール
`hab`と呼ばれるHabitatのコマンドラインインターフェイス(CLI)は、Habitatで必要なことはすべて説明されています。繰り返しになりますが、[ドキュメント](https://www.habitat.sh/docs/install-habitat/?spm=a2c65.11461447.0.0.53e816f600nDMZ)にはワークステーションのセットアップと設定に必要なことがすべて説明されています。

とりあえず、最初の2つのステップを完了させてください。

- [Habitat CLIツールをダウンロードしてインストール](https://www.habitat.sh/docs/install-habitat/?spm=a2c65.11461447.0.0.53e816f600nDMZ#install-habitat)
- [ワークステーションの設定](https://www.habitat.sh/docs/install-habitat/?spm=a2c65.11461447.0.0.53e816f600nDMZ#configure-workstation)

ワークステーションの設定では、__personal access token__の入力を求められます。この部分に上記のステップで設定したトークンを貼り付けてください。

インストールされていることを確認するために、hab --versionコマンドを実行します。

```
$ hab --version
hab 0.57.0/20180530114142
```

#アプリケーション例
このチュートリアルでは、[HabitatのサンプルNode.jsアプリケーション](https://github.com/habitat-sh/sample-node-app?spm=a2c65.11461447.0.0.53e816f600nDMZ)を使用します。

このリポジトリを作業ディレクトリにクローンします。

```
$ git clone https://github.com/habitat-sh/sample-node-app.git
```

プロジェクトには、サンプルアプリケーションのソースコードとパッケージのビルド方法を説明する Habitat [プラン](https://www.habitat.sh/docs/developing-packages/?spm=a2c65.11461447.0.0.53e816f600nDMZ#write-plans)が含まれています。

デモのために、`/habitat` ディレクトリの下に Habitat Plan ファイルが生成されています。お好みのエディタで `plan.sh` ファイルを開き、`pkg_origin` の値を先ほど作成したオリジン名に変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2ed8b6f5-5e96-cf43-168c-81f958181279.png)

#Habitatパッケージの構築
このステップでは、Webアプリケーション用のHabitatパッケージの構築を開始します。Habitatは、`Habitat artifact(.hart)`と呼ばれる独自のフォーマットでアプリケーションをビルドします。`.hart`パッケージとしてアプリケーションをビルドすることで、以下のようなことが可能になります。

- アプリケーションを様々なクラウドネイティブフォーマットにエクスポート
- 依存関係が更新されたときの自動リビルドの取得
- ハビタット・スーパーバイザーによる本番サービスの管理


まず、アプリケーションレポのルートから `hab studio enter` を実行して、Habitat Studio に入りましょう。

```
$ hab studio enter
```

[Habitat Studio](https://www.habitat.sh/docs/glossary/?spm=a2c65.11461447.0.0.53e816f600nDMZ#glossary-studio)は、Habitatパッケージを作成するための「クリーンルーム」として機能する対話型のLinux環境です。スタジオ内には、あなたが定義したもの以外のソフトウェアはありません。スタジオ内では、`ls`や`pwd`などの簡単なLinuxコマンドを実行することができます。

```
[1][default:/src:0]# pwd
/src
```

ここで、`pwd`を実行すると、`sample-node-app`ディレクトリとその親ディレクトリが表示されると思うかもしれませんが、`/src`が表示されます。これは、スタジオが[chroot](https://en.wikipedia.org/wiki/Chroot?spm=a2c65.11461447.0.0.53e816f600nDMZ)環境で動作するためです。この環境はしばしば「Unix jail」や「chroot jail」と呼ばれ、指定されたディレクトリツリーの外のファイルにアクセスできません。コンテナなどの仮想化環境では`chroot`の使用が一般的です。実際、Studioは他のソフトウェアを含まないDockerコンテナ内で動作します。これにより、作成するパッケージに必要なものだけが含まれていることを確認することができます。

次に、ビルドコマンドを実行して、アプリケーション用のHabitat artifact(.hart)を生成します。Habitatはパッケージ(.hartファイル)を生成し、結果ディレクトリに配置します。

```
[2][default:/src:0]# build
```

`ビルド`が終了すると、出力の終わり近くに以下のようなメッセージが表示されます（下のスクリーンショット参照）。"I love it when a plan.sh comes together." これでパッケージがビルドされました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f20136a0-f5c7-4fdb-c89c-2268ee68eeab.png)

また、以下のようにスタジオ上のLinuxコマンド`ls`を使用してディレクトリをリストアップすることで、成果物が生成されているかどうかを確認することができます。

```
[3][default:/src:0]# ls ./results
last_build.env  try-habitat-sample-node-app-1.0.1-2017121904721-x86_64-linux.hart
```

これでパッケージがビルドされました。スタジオは次のパートのために開いたままにしておきます。

#アプリケーションの実行
ビルドが完了したので、パッケージを実行してテストしてみましょう。Habitatのパッケージを実行するには、一般的に2つの方法があります。

.hartをDockerイメージにエクスポートして`docker run`を使用する方法と、Habitatスーパーバイザを使用してHabitatスタジオから直接サービスを起動する方法があります。[Habitatスーパーバイザ](https://www.habitat.sh/docs/glossary/?spm=a2c65.11461447.0.0.53e816f600nDMZ#glossary-supervisor)を使ってアプリケーションを実行する方法についてもっと知りたい場合は、[Habitatのドキュメント](https://www.habitat.sh/docs/using-habitat/?spm=a2c65.11461447.0.0.53e816f600nDMZ)でスーパーバイザの詳細についても説明されています。

ここでは、後でAlibaba Cloud Docker Registryをアップロードして、クラウド上でコンテナを起動するためにこのイメージを使用するために、dockerイメージのエクスポートを使用します。

Habitat Studioのコマンド1つで、以下のように.hartファイルをDockerイメージとしてエクスポートしたことになります。

```
[4][default:/src:0]# hab pkg export docker ./results/<path to .hart>
```

エクスポートが終了したら、`exit`を実行してスタジオを離れることができます。

```
[5][default:/src:0]# exit
logout
```

さて、Dockerコンテナを実行して結果を見てみましょう。

```
$ docker run -it -p 8000:8000 try-habitat/sample-node-app
```

最後に、ブラウザで [http://localhost:8000](http://localhost:8000/?spm=a2c65.11461447.0.0.53e816f600nDMZ) にアクセスして、下のスクリーンショットにあるようなサンプルアプリケーションの UI を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7ea49776-b8b9-a637-63f5-ace383e90823.png)


#コンテナレジストリへの画像の公開
HabitatはDockerとの相性は抜群ですが、ベアメタル、VM、クラウド、Mesos、Kubernetesなど、ほぼすべての環境にHabitatのパッケージをデプロイすることができます。ここでは、Alibaba Cloudが提供するフルマネージドDockerレジストリである[Alibaba Container Registry](https://www.alibabacloud.com/product/container-registry?spm=a2c65.11461447.0.0.53e816f600nDMZ)にイメージを公開します。サンプルアプリケーションのコンテナをAlibaba Cloud上で実行するために、イメージをContainer Registryに公開し、コンテナインスタンスを作成します。

イメージを公開するには、いくつかの簡単な手順があります。

- Alibaba CloudコンソールからAlibaba Container Registryに入ります。
- オリジンの名前空間を作成します。(例: try-habitat)
- アプリケーションのリポジトリを作成します。このステップでは、dockerイメージを公開するだけなので、コードソースセクションで`ローカルリポジトリ`を選択します。
- リポジトリを作成したら、`管理`をクリックして、ドッカーイメージをレジストリに公開する方法を説明したガイドを見てください。

これで、コンテナレジストリに画像を公開する準備が整いました。アリババが提供しているガイドに従うか、以下の手順に従うだけです。

まず、Alibaba Cloud Docker Registryにログインします。

```
$ sudo docker login --username=<your-email-address-here> registry-intl.us-west-1.aliyuncs.com
```

次に、エクスポートしたDockerイメージをAlibaba Cloud Docker Registryにプッシュします。ここでは、アカウントの詳細に基づいてパラメータを置き換えることを忘れないでください。

```
$ sudo docker login --username=<your-email-address-here> registry-intl.us-west-1.aliyuncs.com
$ sudo docker tag try-habitat/sample-node-app registry-intl.us-west-1.aliyuncs.com/try-habitat/sample-node-app:latest
$ sudo docker push registry-intl.us-west-1.aliyuncs.com/try-habitat/sample-node-app:latest
```

これで、このイメージでコンテナを作成し、Kubernetes上でアプリケーションを実行することができます。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*