ConoHa CLI でVPSインスタンスをドカドカ建てる

[ConoHa Advent Calender](https://qiita.com/advent-calendar/2017/conoha) 17日目担当のmiyabiです。
今回は自作のツールを使ってVPSインスタンスを休日中に立ち上げて、
このはちゃんを休日出勤させて、こき使おうと企んでいます。

16日担当: reasonsetさん [ビジネス的にConoHaを使用すると幸せになる理由](http://chienomi.reasonset.net/archives/cat-work/1151)

---

## ConoHa CLIつくりました

[ConoHa CLI](https://github.com/miyabisun/conoha-cli)という直球なツール作りました！

- 簡単なコマンドライン操作でVPSのインスタンスを作成
- 同じくインスタンスの削除や状態の確認も出来る
- インスタンスの情報はspec.tomlというファイルに書き出してGitHubで管理する

## 実際に使ってみる

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ううっこのはのお休みが･･･！</p>&mdash; 美雲このは🎄12/12 CD発売！ (@MikumoConoHa) <a href="https://twitter.com/MikumoConoHa/status/928538487434784768?ref_src=twsrc%5Etfw">2017年11月9日</a></blockquote>

マジ泣きされてしまい、最近このはちゃんの月曜日のTweet数がめっきり減ってしまっているのは私のせいです。
<del>私も先日の20連勤で身をもって休日出勤の辛さを体験しました</del>
13歳の少女に同じ想いはさせたくないので、私のマシン内だけ時刻を弄って出勤させたことにしました。

```Bash
$ date -s "12/17 13:00 2017"

$ date
2017年 12月17日 日曜日 13時00分07秒 JST
```

### 使い方の説明も兼ねて使用してみます

[GitHubのREADME.md](https://github.com/miyabisun/conoha-cli)の使い方の項目でしっかり書いたので重複してしまいますが、画像を含めてこっちでも通してみます。

サーバーはまだ一個も作られていません。

<img width="793" alt="スクリーンショット 2017-12-18 1.34.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/56308/84ff31c1-1f75-e3de-f5c7-266be5d6324b.png">

#### ログイン情報の登録

まずはログイン情報の登録を行います。
これを行うことで、`~/.config/conoha.toml`ファイルが生成され、トークンIDを自動的に更新出来るようになります。
本当は`.conoha`にしたかったのですがtomlファイルにする都合上こうなってしまいました。
<del>トム・美雲おじさんみたいになってしまった（/ω＼）</del>

```Bash
$ conoha login -h
login to ConoHa API.

Usage:
  conoha login [flags]

Flags:
  -h, --help              help for login
  -p, --password string   パスワード (9文字以上)
  -t, --tenantid string   テナントID (半角英数32文字)
  -u, --username string   ユーザー名 (gncu00000000)

# 足りない情報は対話シェルで聞かれます
$ conoha login
username: gncu00000000
password: Hogehoge-0
tenant_id: 1234567890abcdef1234567890abcdef

login successful.
```

#### インスタンスの情報の作成

ConoHa CLIのインスタンスの操作を行うコマンドは、
全てカレントディレクトリに設定した`spec.toml`を基準に取り扱います。
[サンプル](https://github.com/miyabisun/conoha-cli/blob/master/examples/vps-instance/spec.toml)をGitHubのexampleディレクトリ配下に用意してありますが、画像を踏まえて説明します。

<img width="708" alt="スクリーンショット 2017-12-18 1.50.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/56308/50b2a49b-bb78-21a7-10a3-f6b65caa323b.png">

このネームタグ「test_machine」が`spec.toml`の`name`に該当します。
Vagrantは.vagrantフォルダを作成して、その中で各インスタンスが何ものかという情報を格納していました。
ConoHa CLIではこのネームタグが一意であるという前提で各種操作を行います。

```
name = "test_machine"
image = "vmi-docker-17.06-ubuntu-16.04-unified"
flavor = "g-1gb"
sshkey = "conoha-ssh-key-name"
```

#### image, flavorの設定内容

imageとflavorは名称を入力します。
その名称の候補一覧はそれぞれ`conoha info images`と`conoha info flavors`で取得できます。

```Bash
$ conoha info images
vmi-drupal-8.4.2-centos-7.4-amd64-20gb
vmi-drupal-8.4.2-centos-7.4-amd64
vmi-minecraft-1.12.2-centos-7.4
vmi-centos-7.4-amd64-20gb
vmi-centos-7.4-amd64
...(他にも大量に表示される)

$ conoha info flavors
g-2gb
g-16gb
g-4gb
g-1gb
g-8gb
g-32gb
g-64gb
g-512mb
```

#### sshkey の入力値

<img width="986" alt="スクリーンショット 2017-12-18 2.09.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/56308/907cb8e2-c368-c554-73cc-bdff34f44569.png">

SSH Kyeは、上記画面で作った名前を設定します。
私のアカウントでは`miyabi-ooh`という鍵を登録しているので、
`sshkey = "miyabi-ooh"`と設定します。

### インスタンスを操作する

#### インスタンスの状態を確認する

インスタンスの状態を確認するには、下記のコマンドを利用します。

```Bash
$ conoha status
NONE
```

インスタンスは何もないので`NONE`が表示されました。
インスタンスが作られると`ACTIVE`に変化します。

#### インスタンスを生成する

<img width="708" alt="スクリーンショット 2017-12-18 1.50.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/56308/50b2a49b-bb78-21a7-10a3-f6b65caa323b.png">

```Bash
$ conoha up
$ conoha status
ACTIVE
```

インスタンスを生成するにはupを利用します。
この辺のコマンドの使用感はVagrantに寄せています。

#### インスタンスを削除する

<img width="793" alt="スクリーンショット 2017-12-18 1.34.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/56308/84ff31c1-1f75-e3de-f5c7-266be5d6324b.png">

```Bash
$ conoha destroy
$ conoha status
NONE
```

こちらもサブコマンド名はVagrantに習ってdestroyを採用しました。
割りとインスタンスが死ぬのは早いです。

## 今後やりたいこと

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">マスコットアプリ文化祭、このはを使った作品がまだなーいっ！やばーい！1/7まで応募できるから、誰か作ってくれてもいいんだからねっ！<a href="https://t.co/2yt159qi9c">https://t.co/2yt159qi9c</a></p>&mdash; 美雲このは🎄12/12 CD発売！ (@MikumoConoHa) <a href="https://twitter.com/MikumoConoHa/status/941126773261004801?ref_src=twsrc%5Etfw">2017年12月14日</a></blockquote>

一通り完成させてマスコットアプリ文化祭への出典したい！

- `conoha ssh`でログイン
- `conoha ssh-config`でSSHで接続情報を表示
- `conoha init`でspec.tomlを吐き出す　（対話シェル、pecoで絞り込みとかしたい）
- `conoha init --name xxxx`で既存のインスタンス情報からspec.tomlを作成する
- `conoha set`でspec.tomlのデフォルト値を定義
- `conoha status-all`でConoHa上の全インスタンスを確認できる
- リファクタリング
- テストコード

うう、初めてのGo言語に苦戦してやりたいこと山積みだ……頑張る！

## 作った動機

### ConoHa との出会い

私は電車通勤時に座れた時は、Macbookを膝に乗せてコードを書いています。
開発にはVimを利用しており、そんなに優れた性能は必要ありません。
しかし、スマホのテザリングではダウンロード速度が遅く、依存ライブラリやCLIツールを落とすのに苦労していました。

そして出会ったのがConoHaです。

実際に使って驚きましたが、想像以上に軽快な動作をしてくれます。
通信速度は見込み通り、OSの動作にあまりCPUやメモリを割かなくて済むので、
たった1GBしかない一見しょぼいインスタンスでも見た目以上にキビキビと動いてくれます。
そして日本にリージョンがあるのでVPSのサービスの中でもトップクラスの低レイテンシを誇ります。

そこで、私は本格的な勉強用にConoHaを利用したいと考えるようになりました。

### vagrant-conoha との出会い

[vagrant-conoha](https://github.com/hironobu-s/vagrant-conoha)と出会って、この利用が加速しました。
1インスタンス1Vagrantfileでインスタンスをドカドカ建てて<del>(おっさんギャグ)</del>このプロジェクトはこのインスタンスで開発するという風に利用しはじめました。

実は仕事でも利用しており、
週の初めには勉強用のインスタンスを殺して、仕事用のインスタンスを立ち上げ、
週末になると仕事用のインスタンスを殺して、勉強用のインスタンスを立ち上げていました。

これを活かす為にAnsibleのプロビジョンを作りはじめました。
`vagrant up`コマンドから一撃でConoHaのインスタンスが立ち上がり、Vimの初期設定からNode.jsのインストール、Gitで作業するプロジェクトをDL…という事を行ってくれる環境を作り上げました。

新世代のDebianやUbuntuがあり、インスタンスを簡単に作ったり壊したり出来るのも良かったです。
1時間単位なので一瞬だけ作ったインスタンスでも1時間分の料金を取られますが、
たったの1円で済むので、勉強用として安いと気にせずガンガン立ち上げて殺してを繰り返しながらAnsibleのPlaybookを作り込んでいました。

これにより、環境構築回りの自身はかなり付き、このはちゃんには感謝感謝です。
vagrant-conohaの作者であるひろのぶさんにも凄く感謝しています。

### vagrant-conoha からの卒業

2017/9頃、私の就職活動も落ち着いて、勉強用のインスタンスを作成しようと思って操作したところ、エラーが出て使用出来なくなってしまいました。
[9日の記事](http://blog.strawhat.net/posts/2017/12/09/how-to-create-servers-at-conoha/)と同じ現象かはわかりませんが、Rubyのエラーなので追うことが出来ず、
結局MacbookProに直接環境を入れて使うという生活をしていました。
※既に使える状態らしいです

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr">(´･_･`) <a href="https://t.co/KR8nLurPaF">pic.twitter.com/KR8nLurPaF</a></p>&mdash; Hironobu Saito (@hironobu_s) <a href="https://twitter.com/hironobu_s/status/941213992252465152?ref_src=twsrc%5Etfw">2017年12月14日</a></blockquote>

ConoHaにはAPIがあるので、自作のCLIを作って簡単に操作出来るのでは？
…と考えていたのですが、イマイチ構成が思い浮かばず悶々と過ごしていました。

- 元々ConoHa CLIツールは作りたかった
- Node.jsでも良かったがCLIとしてのNode.jsの限界を感じていた（配布しづらい
- Go言語に可能性を見出し、何かGo言語でマルチプラットフォームで動くCLIツールを作りたかった
- [ConoHaアドベントカレンダー](http://conoha.mikumo.com/blog/11998/)が丁度紹介されていた

この辺の事情が噛み合い、これを良い機会に作ろうか！と決心しました。

結果はなんとかインスタンスの作成・削除が出来るだけの超発展途上です。
居るかどうかわかりませんが結構良さそう…って思った人は、
メンテして使いやすくしますので生暖かく見守って下さい。(´・ω・`)

## まとめ

私の技術力の半分はConoHaで出来ています。
これからもお世話になりつつ、引き続きこんな風に還元していきたいと思います。

綺麗にまとめたフリしてないでさっさとCLI完成させろって話ですね(´・ω・`)ごめんなさい頑張ります

さて、明日の18日目はProg24さんの「ConoHaとGoogle Homeで何かしたいな。。(変更の可能性あり)」です。
お楽しみに！