ConoHaでのサーバ作成あれこれ

Posted by 技術ブログ by Strawhat.net on Saturday, December 9, 2017

TOC

これは、ConoHaアドベントカレンダー2017の9日目です。 明日は@clarinet758さんが担当されます。

ConoHaとは

ConoHaとは、皆さんご存知、GMOインターネットさんが提供するオールSSDなVPSです。 サーバの起動時間に対する時間単位での課金なので、気軽にサーバを構築・廃棄できるだけでなく、一か月間フルに起動したときは定額になるので毎月の利用料金が予測しやすいです。サーバのプランも、1台あたり月額630円~月額900円のものから提供されていて、個人的に利用する場合にもお財布にやさしいかなと思います。

そして、ConoHaといえば、ConoHa応援団長の美雲このはちゃんを語らないわけにはいきません。清楚で可憐なこのはちゃんのTwitterでのやり取りを眺めつつ、このはモードの管理画面でこのはちゃんと一緒にサーバ構築作業をすれば、つらさもなくなるかと思います。 寝ているときにこのはちゃんが画面から出てきて代わりに作業しておいてくれるともっといいですが…それはないでしょうね。

2017-12-09_11-19-32.png

さて、現在、ConoHaにDocker Swarm環境を稼働させていて、近日中にKubernetesの環境を構築して移行しようかと計画しています。 マスターとノードのVMを複数作成して、それらをローカルネットワークで接続して、必要なソフトウェアを導入・設定する作業を、いつでも再現できて、かつ変更点をバージョン管理ツールで管理できる形で行いたいと思います。

そこで、この記事では、ConoHaでサーバを作成する方法をまとめてみたいと思います。

GUIでの作成

Web管理画面

まず最初は、Webの管理画面を使ったサーバ作成でしょう。

サーバの追加画面で、サーバの場所・スペックの選択、OSもしくはアプリケーション配備済みのイメージの選択、そしてオプション(自動バックアップ、追加ディスク、セキュリティ設定、ログインに使用するSSHキー、起動時処理のスクリプトなど)の選択を、マウスでポチポチと操作する方法です。それぞれの項目の説明はヘルプを参照していただくとして、マウスで選ぶだけなので、特に説明は不要かと思います。

2017-12-09_12-06-46.png 2017-12-09_12-07-03.png

この方法は、マウスを操作するだけでサーバを作成できる手軽さがありますが、複数のサーバを作成するときや決まった仕様のサーバを繰り返し作成するときに手間がかかったり、手動での操作なのでミスが発生する可能性があるデメリットがあります。また、サーバを作成するパラメータを変えたときの履歴を追うことができません。

スクリプトでの作成

複数のサーバ作成や、繰り返しのサーバ作成が容易で、変更管理ができる方法として、スクリプトの利用が考えられます。

ConoHa API

ConoHaが提供する各サービスは、スクリプトなどから操作できるAPIが公開されています。 APIで指定されたURIに、HTTP GET/POSTリクエストを送信して利用します。

APIの利用では、まず初めに、アクセストークンをIdentity APIのトークン発行で取得します。

$ cat gettoken.json
{
  "auth": {
    "tenantName": "gnctxxxxxxxx",
    "passwordCredentials": {
      "username": "gncuxxxxxxxx",
      "password": "foobarbaz"
    }
  }
}
$ cat gettoken.sh
curl -i -X POST -H "Accept: application/json" -d @gettoken.json https://identity.tyo1.conoha.io/v2.0/tokens
$ sh gettoken.sh
HTTP/1.1 200 OK
Server: openresty/1.7.10.1
date: Sat, 09 Dec 2017 06:02:20 GMT
Content-Type: application/json
Content-Length: 2541
Connection: keep-alive

{"access":{"token":{"issued_at":"2017-12-09T06:02:20.812050","expires":"2017-12-10T06:02:20Z","id":"79ca4***************************",(以下省略)

レスポンス本文にあるaccess.token.idがアクセストークンです。

サーバを作成するAPIはCompute APのVM追加です。本文に指定するJSONのimageRef(インストールするイメージ)やflavorRef(VMのプラン)は別のAPIで調べる必要がありますが、ここでは省略します。例として、1GBメモリのVMを、ubuntu-16.04-amd64のイメージで作成する場合、以下のようになります。

$ cat createvm.json
{
    "server": {
        "imageRef": "b9e54c41-cda9-4d84-8248-808bfaf6c793",
        "flavorRef": "7eea7469-0d85-4f82-8050-6ae742394681",
        "adminPass": "AdminPass123*",
        "key_name": "conoha"
    }
}
$ cat createvm.sh
curl -i -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: 79ca4***************************" \
-d @createvm.json \
https://compute.tyo1.conoha.io/v2/82dbfb682c3*************/servers
$ sh createvm.sh
HTTP/1.1 202 Accepted
Server: openresty/1.7.10.1
date: Sat, 09 Dec 2017 06:31:57 GMT
Content-Type: application/json
Content-Length: 433
Connection: keep-alive

{"server":{"security_groups":[{"name":"default"}],"OS-DCF:diskConfig":"MANUAL","id":"6125c3f4-25d5-4629-aa60-***************","links":[{"href":"https://compute.tyo1.conoha.io/v2/82dbfb682c3*************/servers/6125c3f4-25d5-4629-aa60-***************","rel":"self"},{"href":"https://compute.tyo1.conoha.io/82dbfb682c3*************/servers/6125c3f4-25d5-4629-aa60-***************","rel":"bookmark"}],"adminPass":"AdminPass123*"}}
$

サーバの作成が成功したかどうかは、Web管理画面で確認できます。

2017-12-09_15-33-08.png

Web APIの呼び出しは、curlなどのCLIツールや、POSTMANなどのGUIツール、またPythonなどのスクリプト言語でも行えます。これらを使って、APIを呼び出すスクリプトを作成、実行することで、複数のサーバを一度に作成することも、決まった仕様のサーバを繰り返し作成することも楽に実行できます。その一方、作成するサーバの仕様が、それぞれのHTTPリクエストの本文にJSONとして記述されるため、構成情報としては見づらいかなと思います。

Openstackのコマンドラインツール

ConoHaはOpenStackで構築されていて、OpenStackのコマンドラインツールでConoHaのサーバを操作することもできます。

コマンドラインツールのインストールは、Pythonのpipで行います。

$ python3 -m venv conoha-openstack
$ cd conoha-openstack/
$ . bin/activate
(conoha-openstack) ~/conoha-openstack$ pip install python-openstackclient
Collecting python-openstackclient
(以下省略)

APIを利用する情報は環境変数として定義します。

(conoha-openstack) ~/conoha-openstack$ cat env.sh
#!/bin/sh
export OS_USERNAME=gncu********
export OS_PASSWORD=foobarbaz
export OS_TENANT_NAME=gnct********
export OS_AUTH_URL=https://identity.tyo1.conoha.io/v2.0
(conoha-openstack) ~/conoha-openstack$ source env.sh

例として、1GBメモリのVMを、ubuntu-16.04-amd64のイメージで作成する場合、以下のようになります。

(conoha-openstack) ~/conoha-openstack$ cat createvm.sh
#!/bin/sh
openstack server create --image vmi-ubuntu-16.04-amd64-unified --flavor g-1gb --key-name conoha --property "instance_name_tag=sample_server" new-server
(conoha-openstack) ~/conoha-openstack$ sh createvm.sh
+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field                                | Value                                                                                                                                                                                                           |
+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                                                                                                                                                                          |
| OS-EXT-AZ:availability_zone          | nova                                                                                                                                                                                                            |
(以下省略)
(conoha-openstack) ~/conoha-openstack$ 

こちらもサーバの作成が成功したかどうかは、Web管理画面で確認できます。

2017-12-09_16-08-07.png

openstackコマンドを使うと、他にもConoHaの操作ができるのですが、私自身がOpenStackに詳しくないのと、 ConoHaで利用できる操作とそのパラメータがわからないため、openstackコマンドの利用はまだ手探り状態です。

詳しくは以下を参照してください。

個人利用から大規模開発までConoHaで始めるクラウド開発入門 第5回 OpenStack APIを使ったCLI操作をConoHaでやってみる

openstackコマンドを使ったスクリプトも、たくさんのサーバを一度に作成することや、決まった仕様のサーバを繰り返し作成することも楽に実行できます。 ただし、作成するサーバの仕様がコマンドの引数として記述されるため、作成したスクリプトは構成情報としては見づらいかなと思います。

# ツールでの作成

そろそろ本題に辿り着きそうなのですが、だいぶ記事が長くなってきて既に息があがってるので、ここから先は後日、改めて記事にしたいと思います。すみません…。

これまでの方法ではサーバの構成情報が見づらいこともあって、私がAzure・AWSで使っているVagrant、AnsibleなどのツールをOpenStackベースのConoHaでも利用したいと思い、調べてみました。

Vagrant ConoHa

サーバの構築は、ブートストラッピング(VM作成)→プロビジョニング(設定・ミドルウェア導入)→オーケストレーション(アプリケーション配備)の三段階に分かれます。 Vagrantはブートストラッピングを担当するツールです。その後のプロビジョニングはAnsibleとかChefが有名ですが、それらのツールと連携することもできます。

このVagrantでConoHaのサーバを作成できるVagrant ConoHaプラグインが公開されています。

まず、vagrant-conohaプラグインをインストールします。

$ vagrant plugin install vagrant-conoha
Installing the 'vagrant-conoha' plugin. This can take a few minutes...
Installed the plugin 'vagrant-conoha (0.1.9)'!
$

そして、Vagrantfileを作成します。

$ cat Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
#  config.vm.box       = 'conoha'
  config.ssh.username = 'root'

  config.vm.provider :conoha do |conoha|
    conoha.openstack_auth_url = 'https://identity.tyo1.conoha.io/v2.0'

    conoha.username           = 'gncu**********'
    conoha.password           = 'foobarbaz'
    conoha.tenant_name        = 'gnct**********'

    conoha.flavor             = 'g-1gb'
    conoha.image              = 'vmi-ubuntu-16.04-amd64-unified'
    conoha.region             = "tyo1"
    conoha.admin_pass         = "AdminPass123*"
    conoha.metadata           = {
      instance_name_tag: "vagrant_conoha"
    }
    conoha.security_groups    = [
      "default",
      "gncs-ipv4-all",
      "gncs-ipv6-all"
    ]
    conoha.keypair_name       = "conoha"

  end
  config.ssh.private_key_path = "~/.ssh/conoha/id_rsa"
end

しかし、このVagrant ConoHaですが、私の環境(Windows Subsystem for LinuxのUbuntu 16.04、Vagrant 1.9.8)では、正常に動作できていません。

$ vagrant up --provider conoha
An unknown error happened in Vagrant ConoHa plugin

To easily debug what happened, we recommend to set the environment
variable VAGRANT_OPENSTACK_LOG to debug

    $ export VAGRANT_OPENSTACK_LOG=debug

If doing this does not help fixing your issue, there may be a bug
in the provider. Please submit an issue on Github at
https://github.com/hironobu-s/vagrant-conoha
with the stracktrace and the logs.

We are looking for feedback, so feel free to ask questions or
describe features you would like to see in this provider.
/home/nobu/.vagrant.d/gems/2.3.4/gems/vagrant-conoha-0.1.9/lib/vagrant-conoha/catalog/openstack_catalog.rb:46:in `block in get_endpoints_2': Catched Error: undefined method `strip' for nil:NilClass (NoMethodError)
        from /home/nobu/.vagrant.d/gems/2.3.4/gems/vagrant-conoha-0.1.9/lib/vagrant-conoha/catalog/openstack_catalog.rb:45:in `each'
        from /home/nobu/.vagrant.d/gems/2.3.4/gems/vagrant-conoha-0.1.9/lib/vagrant-conoha/catalog/openstack_catalog.rb:45:in `get_endpoints_2'
        from /home/nobu/.vagrant.d/gems/2.3.4/gems/vagrant-conoha-0.1.9/lib/vagrant-conoha/catalog/openstack_catalog.rb:19:in `block in read'
        from /home/nobu/.vagrant.d/gems/2.3.4/gems/vagrant-conoha-0.1.9/lib/vagrant-conoha/catalog/openstack_catalog.rb:16:in `each'
(以下省略)

WSLではない純粋なUbuntu環境なら動作するかもしれないので、近いうちに環境を変えて検証したいと思いますが、 にっちもさっちもいかなくなったらIssueで報告しようかと思います。

なお、Vagrant ConoHaの利用方法は、以下に解説がありますので、参考にしてください。

個人利用から大規模開発までConoHaで始めるクラウド開発入門 最終回 ConoHa API(OpenStack API)を使ってみよう>ConoHaをvagrant upしてみよう

Ansible ConoHaモジュール

VagrantでのVMのブートストラッピングに失敗していて、他のツールで実現できないか考えていたのですが、 Kubernetesを導入するAnsible Playbookが 公開されていることもあって、AnsibleでのVM作成を調べてみました。

Ansibleは、作成されたサーバのOS設定を変更したり、ミドルウェアを導入したり、アプリケーションを配置する機能を 提供するプロビジョニングツールです。 ConoHaでもAnsibleを紹介していて、nginxとmysqlを導入してiptablesを操作するサンプルが載っています。

構成管理ツールAnsibleを使ってみよう

Ansibleでは、Yamlと呼ばれる形式のテキストファイルを作成して、そこに設定内容を記述します。 Yamlファイルを管理しておけば、後で同じ構成のサーバを構築することができ、テキストファイルであることからバージョン管理もしやすいです。

AnsibleによるConoHaでのVM作成については、現時点では、AnsibleにはOpenStackを扱えるモジュールにVM作成の機能があること、 またVM同士をローカルネットワークで接続する設定もできることはわかったのですが、 OpenStackに詳しくないこともあってまだ調べ切れていません。

そこで、ConoHaのWeb APIを呼び出すAnsibleのモジュールを作成していますが、こちらも開発が進んでいません。 現時点では、VMの作成はできますが、ローカルネットワークへの接続はまだこれからです。 ある程度の機能を実装したら、モジュールを公開できればと思います。

まとめ

長くなりましたが、ConoHaではWeb管理画面でお手軽にサーバを作成できるだけでなく、 ConoHa APIを呼び出すスクリプトやVagrantやAnsibleなどのツールを利用したサーバ作成もできます。 サーバを作成する目的に合わせて、その手段を使い分けることで、より便利になるのではないかと思います。

それでは、よいConoHaライフを。