Ubuntu Weekly Recipe

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

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

はじめてのデプロイ

Jujuは「juju」コマンドを使って,各種操作を行います。今回はJujuで最もよく使われるサンプルである「Amazon EC2上にWordPressサービスを公開する」方法を使って,Jujuの基本的な使い方を紹介します。

ここでデプロイ先にAmazon EC2を使うのはそれが一番お手軽だからです。Jujuはサービスをデプロイするとき,まずはじめにUbuntuのインスタンスを作成します。インスタンスの生成には,デプロイ先に合わせてAmazon EC2やOpenStackのAPIを使ったり,LXCで仮想マシンをローカルに作成したりします。

Amazon EC2であればとりあえずアカウント(と支払い能力)さえあれば,他に環境を用意する必要はないので,はじめてのデプロイ先として選びました注4⁠。もしこの手順を試す場合は,あらかじめAmazon Web Serviceのアカウントを作成しておいてください

注4)
LXCを使った方法は,次回以降に紹介する予定です。

デプロイ先の設定を行う

デプロイ先は「~/.juju/environments.yaml」ファイルを編集することで設定します。詳しい設定項目は公式ドキュメントのConfiguring for Amazon AWSを参考にしてもらうとして,今回はaccess-keyとsecret-key,regionの3つだけを変更しましょう。

## https://juju.ubuntu.com/get-started/amazon/
amazon:
  type: ec2
  admin-secret: (ここは変更せず)
  # globally unique S3 bucket name
  control-bucket: (ここは変更せず)
  # override if your workstation is running a different series to which you are deploying
  # default-series: precise
  # region defaults to us-east-1, override if required
  region: ap-northeast-1
  # Usually set via the env variable AWS_ACCESS_KEY_ID, but can be specified here
  access-key: (Access Key IDを入力)
  # Usually set via the env variable AWS_SECRET_ACCESS_KEY, but can be specified here
  secret-key: (Secret Keyを入力)

access-keyとsecret-keyには,AWSのコントロールパネルにある「Access Keys」からAccess Key IDとSecret Keyが記載されたファイルをダウンロードして,そこに書かれたIDをそれぞれ設定します。

regionはインスタンスを生成するリージョンです。東京リージョンだと「ap-northeast-1」になります。

2行目の「amazon」は環境を指定するラベルです。environments.yamlには複数のデプロイ先に合わせて複数の環境を記述できます。jujuコマンド実行時に「-e ラベル」を指定すると,その環境にデプロイできます。

オプションを指定しないときに使われる環境はswitchコマンドで確認・設定できます。

$ juju switch
(標準で使われる環境のラベル名が表示される)
$ juju switch amazon
(標準の環境を“amazon”に変更する)

bootstrapノードをデプロイする

Jujuの管理サービスであるbootstrapノードをデプロイしましょう。Jujuでこれから操作するサービスは,今後すべてこのbootstrapノード経由で設定や情報の取得を行います。このため,Jujuを使う場合は最低でも1つのインスタンスが必要になります。

$ juju bootstrap

ちなみにbootstrapノードさえ立ち上がれば,あとはどのクライアントからでも,Jujuが管理するサービスの設定変更が可能です。

今回の設定ではAmazon EC2を使うことになっているので,このコマンドはAmazon EC2上にUbuntuのクラウドイメージを使ってインスタンスを生成します。つまりここから先は料金が発生することに注意してください。試しにAWSのコンソールを確認すると,m1.smallのインスタンスが1つ立ち上がっていることがわかるはずです。

bootstrapノードが立ち上がるまで,数十秒から数分かかることがあります。立ち上がるとstatusオプションで状態を確認できます。

$ juju status
environment: amazon
machines:
  "0":
    agent-state: started
    agent-version: 1.13.2
    dns-name: ec2-54-248-35-144.ap-northeast-1.compute.amazonaws.com
    instance-id: i-b48a7ab1
    instance-state: running
    series: precise
    hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
services: {}

machinesには各インスタンスが表示されます。今のところbootstrapノードだけなので,インスタンスは1台,サービスは空です。agent-stateが「started」になったらすべての準備が完了した状態です。

WordPressに必要な各種サービスをデプロイし公開する

ここまできて,ようやくWordPressをデプロイできます。WordPressにはデータベースが必要です。今回はMySQLを使いますので,次のような作業を行います。

  • WordPressをデプロイする
  • MySQLをデプロイする
  • WordPressとMySQLを紐付ける
  • WordPressサービスを公開する

ここは単純に4つのコマンドを実行するだけです。

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

deployコマンドは新規にインスタンスを生成し,そこに指定したサービスをデプロイします。add-relationは2つのサービスを紐付けるためのコマンドです。これにより,WordPressはMySQL(がインストールされたインスタンス)をデータベースとして認識し,MySQL上にWordPressを動かすために必要な設定が行われます。exposeでサービスを公開します。Amazon EC2の場合なら,80番ポートの開放などもこのタイミングで行います。

これだけで,WordPressのサービス構築は完了です。実際にどのような設定が行われているかはstatusコマンドで確認しましょう。

$ watch juju status

bootstrapと同様に各インスタンスのデプロイ完了までは少し時間がかかります。deployコマンド直後にstatusを実行してもまだ準備はできていないかもしれません(たとえばagent-stateは「pending」の状態⁠⁠。watchコマンドで継続的にstatusを実行させることで,各インスタンスが徐々に設定されていくことがわかります。

最終的に「wordpress/0」のagent-stateが「started」になったらデプロイ完了です。少し長いですが,statusの結果を見てみましょう。

environment: amazon
machines:
  "0":
    agent-state: started
    agent-version: 1.13.2
    dns-name: ec2-54-248-35-144.ap-northeast-1.compute.amazonaws.com
    instance-id: i-b48a7ab1
    instance-state: running
    series: precise
    hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
  "1":
    agent-state: started
    agent-version: 1.13.2
    dns-name: ec2-54-238-44-109.ap-northeast-1.compute.amazonaws.com
    instance-id: i-fa8a7aff
    instance-state: running
    series: precise
    hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
  "2":
    agent-state: started
    agent-version: 1.13.2
    dns-name: ec2-54-248-147-25.ap-northeast-1.compute.amazonaws.com
    instance-id: i-f88a7afd
    instance-state: running
    series: precise
    hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M
services:
  mysql:
    charm: cs:precise/mysql-27
    exposed: false
    relations:
      cluster:
      - mysql
      db:
      - wordpress
    units:
      mysql/0:
        agent-state: started
        agent-version: 1.13.2
        machine: "2"
        public-address: ec2-54-248-147-25.ap-northeast-1.compute.amazonaws.com
  wordpress:
    charm: cs:precise/wordpress-16
    exposed: true
    relations:
      db:
      - mysql
      loadbalancer:
      - wordpress
    units:
      wordpress/0:
        agent-state: started
        agent-version: 1.13.2
        machine: "1"
        open-ports:
        - 80/tcp
        public-address: ec2-54-238-44-109.ap-northeast-1.compute.amazonaws.com

まずはmachinesのところから。今回はbootstrapに加えて,wordpressとmysqlの3台をデプロイしたので,インスタンスの数も3つになっています。後述するように,この台数はdeployコマンド時のオプションでコントロール可能です。

さらに今回はservicesの項目が増えています。こちらはサービス名ごとに関係や使われたCharmなどがリストアップされています。⁠units」にはそのサービスで使われている個々のインスタンスが表示されます。今回はmysqlもwordpressも1つずつしかデプロイしていないので,それぞれunitは1つです。machineのところには使われているインスタンスの番号が表示されていることがわかるでしょう。

さらにwordpressについてはopen-portsに開放したポート番号として80/tcpが表示されています。Amazon EC2の場合,ここに表示されているポートが,exposeコマンドによってセキュリティグループのInboundルールに追加されます。

wordpressサービスにはpublic-addressとしてインスタンスのアドレスが表示されています。そこへWebブラウザでアクセスすれば,WordPressの初期画面が表示されるはずです。

著者プロフィール

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

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