Ubuntu Weekly Recipe

第288回 デプロイツール「Juju」を使って大魔導師を目指そう

この記事を読むのに必要な時間:およそ 7.5 分

サービスの設定変更

ここまでの作業で無事,Amazon EC2上にWordPressサービスを公開できました。説明自体は長かったのですが,実際に行った作業はほとんどないはずです。ここからはさらに,クラウドの本領発揮であるスケールする方法について紹介しましょう。

スケールアウトする

まかり間違って(?)公開しているWordPressサービスへのアクセス数が増大してしまいました。そこでWordPressのインスタンスを2つ増やすことにして,サービスをスケールアウトしましょう。

$ juju add-unit -n2 wordpress

add-unitは指定したサービスを提供するインスタンスを増やすコマンドです。-nオプションに増やしたいインスタンスの数を指定します。少し待ってからstatusコマンドでmachinesのインスタンスの数とwordpressサービスのunitsの数を確認してみましょう。どちらも2つずつ増えているはずです。

さらに追加したインスタンスのpublic-addressにアクセスしてみてください。どちらのインスタンスもデータベースは同じmysqlサービスにつながっているので,元のインスタンスと同じコンテンツが表示されるでしょう。

リバースプロキシを追加する

これだけだとWordPressサーバが3つになっただけなので,これらをリバースプロキシでつないでみましょう。HAProxyを導入するCharmがあるのでそれを使います。

$ juju deploy haproxy
$ juju add-relation haproxy wordpress
$ juju expose haproxy

HAProxyは外部に公開するサービスなので,最後にexposeしています。

インスタンスタイプを指定する

単純にdeployコマンドを実行した場合,インスタンスタイプはm1.smallが選択されます。CPUやメモリを増強したい場合,deploy時にconstraintsを使用することでインスタンスタイプを変更できます。

現在のインスタンスの設定値はstatusコマンドで確認できます。たとえばmysqlサービスで使われているインスタンスの設定値を見てみましょう。

$ juju status mysql
environment: amazon
machines:
  "2":
    (中略)
    hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M

このようにm1.smallインスタンスが使われていることがわかります。

deploy時にCPUコアの数を4に,メモリのサイズを8Gバイトに設定するには,次のオプションを指定します。

$ juju deploy --constraints "cpu-cores=8 mem=8G" mysql

スケールダウンする

比較的アクセスが落ち着いてきて,インスタンスを3つから1つに減らしても大丈夫な状態になりました。そんなときは,destroyコマンドでインスタンスを削除できます。

手順としてはまずdestroy-unitでunitを削除してから,destroy-machineでインスタンスの本体を削除します。今回はwordpress/1のマシン番号が3,wordpress/2のマシン番号が4なので,それぞれ次のように実行します。

$ juju destroy-unit wordpress/1
$ juju destroy-unit wordpress/2
$ juju destroy-machine 3
$ juju destroy-machine 4

これでインスタンスの数はスケールアウトする前の状態に戻っているはずです。最初のうちはAmazon EC2のコンソールから実際にインスタンスがterminatedになっているかどうかも確認しておくと良いでしょう。

デプロイするインスタンスを指定する

これまでdeployコマンドを実行する度にEC2のインスタンスが生成されてきました。しかしサービスの種類によってはわざわざインスタンスを分ける必要がないものも存在します。もし既に起動済みのインスタンスに別のサービスをデプロイしたいなら,--toオプションを使います。

たとえばwordpressをマシン番号1にデプロイしたあと,mysqlも同じマシンにデプロイするには,次のコマンドを実行します。

$ juju deploy --to 1 mysql

これにより,すべてのサービスを1つの仮想マシン上で動作させることも可能です。

サービスを削除する

個々のインスタンスではなくサービスそのものが不要になった場合は,destroy-serviceで一括して削除できます。

$ juju destroy-service wordpress
$ juju destroy-service mysql
$ juju destroy-service haproxy

インスタンス自体は削除されないので,個別にdestroy-machineを実行してください。bootstrapも含めてすべて削除する場合は,destroy-environmentを実行します。

$ juju destroy-environment

これによりすべてのインスタンスが削除され,最初にbootstrapコマンドを実行する前の状態に戻ります。

うまく動かないときは

最後に,期待どおりに動作しないときに調べるべきポイントを説明します。

verboseオプションを使用する

そもそもインスタンスが生成されない場合は,jujuコマンドにverboseオプション(-v)を付けて再度実行してみましょう。大抵の場合は,~/.juju/environments.yamlの設定ミスですので,何らかの構文エラーが表示されるはずです。

debug-logコマンドを使用する

debug-logコマンドには,jujuの各インスタンスの処理メッセージが表示されます。ここに何らかのエラーが表示されている可能性があります。

juju statusを確認する

サービス構築中にエラーが発生した場合は,agent-statusが「error」になり,エラーの理由が表示されることがあります。

$ juju status
    (中略)
        agent-state: error
        agent-state-info: 'hook failed: "config-changed"'

これを足がかりにJujuコマンドのオプションが間違っていないか,Charmに何かの問題がないかを調べると良いでしょう。

ちなみにCharmの本体は~/.juju/charmcache/にZIP形式のアーカイブとしてキャッシュされます。これを適当な場所に展開して,実際に何をやっているか確認することができます。

sshでインスタンスに接続する

Jujuで作ったインスタンスはあらかじめsshログインできるようになっています。インスタンスのホスト名に対して,ユーザ名「ubuntu」でアクセスすれば,インスタンスを直接調べることができます。

ちなみに,jujuコマンドを使えばマシン番号やサービス名でもログインできます。ユーザ名も指定する必要がないので,こちらのほうが便利でしょう。

マシン番号0にログインする場合:
$ juju ssh 0
wordpress/1インスタンスにログインする場合:
$ juju ssh wordpress/1

インスタンスの中身は普通のUbuntuなので,apt-getコマンドでパッケージを追加インストールするなどの作業も行えます。

問題が解決したら

何らかの方法で無事に問題が解決した場合,Jujuが処理中の作業を再開させる必要があります。たとえばwordpress/1の問題が解決したのなら,次のコマンドを実行してください。

$ juju resolved wordpress/1

これにより,statusコマンドの状態が変化するはずです。

まとめ

Jujuを使えばクラウド時代のUbuntu Serverの構築を,非常にシンプルな操作で行えるようになります。とくにマシンの台数が増えれば増えるほど,この操作の違いが大きく効いてくるはずです。

もちろん,自分でCharmを書くことができればその利便性はさらに増大します。折しも現在,Charm Championshipというコンテストが開催されていますので,大会への参加を動機付けに,普段よく使うサービスのCharmを書いてみてはいかがでしょうか。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。