TerraformでConoHaのインスタンスを立ててみる

自分用のメモに

# ゴール
- ConoHaのインスタンスが作れる
- ConoHaのインスタンスを消せる
- 作ったインスタンスに公開鍵認証のsshで接続できる

# 試した環境
Ubuntu16.04 Desktop

# 構築手順
## terraformコマンドを使えるようにする
ワンライナー

```sh
sudo echo ; zcat <( CURRR_VER=$(curl -s https://checkpoint-api.hashicorp.com/v1/check/terraform | jq -r -M '.current_version') ; curl -q "https://releases.hashicorp.com/terraform/$CURRR_VER/terraform_${CURRR_VER}_linux_amd64.zip" ) | sudo tee /usr/local/bin/terraform > /dev/null ; sudo chmod +x /usr/local/bin/terraform
```

## api情報を調べる
ConoHaにログインして、"API"の画面から以下を調べておく

- ユーザー名
- パスワード
- テナントID
- エンドポイント

※ユーザー名とパスワードは"APIユーザー"のところで作れる

## apiトークンを手に入れる
```sh
curl -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"<ユーザー名>","password":"<パスワード>"},"tenantId":"<テナントID>"}}' \
https://identity.tyo2.conoha.io/v2.0/tokens \
| jq ".access.token.id"
```

## 使えるimage(OSのディストリビューション)の一覧を確認する
```sh
curl -X GET \
-H 'Content-Type: application/json' \
-H "Accept: application/json" \
-H "X-Auth-Token: <apiトークン>" \
https://compute.tyo2.conoha.io/v2/<テナントID>/images \
| jq ".images | sort_by(.name) | map(.name)"
```
今回は`vmi-ubuntu-18.04-amd64-amd64-20gb`を使いました

## 使えるflavor(VPSのプラン)の一覧を確認する
```sh
curl -X GET \
-H 'Content-Type: application/json' \
-H "Accept: application/json" \
-H "X-Auth-Token: <apiトークン>" \
https://compute.tyo2.conoha.io/v2/<テナントID>/flavors \
| jq ".flavors | sort_by(.name) | map(.name)"
```
今回は`g-512mb`を使いました

## main.tfファイルを作る(例)
```tf
provider "openstack" {
  user_name   = "<ユーザー名>"
  password    = "<パスワード>"
  tenant_name = "<自分のテナントID>"
  auth_url    = "https://identity.tyo2.conoha.io/v2.0" # ConoHaのエンドポイント(Identity Service)
}

resource "openstack_compute_keypair_v2" "keypair" {
  name       = "terraform-keypair"    # 好きな名前
  public_key = "<自分の共有鍵>"
}

resource "openstack_compute_instance_v2" "basic" {
  name        = "basic"                             # 好きな名前
  image_name  = "vmi-ubuntu-18.04-amd64-amd64-20gb"
  flavor_name = "g-512mb"
  key_pair    = "terraform-keypair"                 # "openstack_compute_keypair_v2"のnameと合わせる

  security_groups = [
    "gncs-ipv4-ssh",
  ] # 22番ポートを許可する

  metadata {
    instance_name_tag = "test" # ダッシュボードではこの名前が表示される
  }
}
```

## terraformの実行

まずは初期化

```sh
terraform init
```

構築

```sh
terraform apply
```
※これを実行した時に表示される`Creation complete after 33s (ID: *****************)`のIDをメモしておくこと

削除

```sh
terraform destory
```


## ssh接続の確認
ipアドレスを確認

```sh
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: <apiトークン>" \
https://compute.tyo2.conoha.io/v2/<テナントID>/servers/<terraform apply実行時のID> \
| jq ".server.addresses"
```
出てきたipv4アドレスで接続してみる

```sh
ssh root@<IPアドレス>
```
パスワードなし(公開鍵認証)でログインできるはず


## ハマりどころ
### ダッシュボードに表示されるサーバ名が指定できない
`openstack_compute_instance_v2`の`name`の指定はダッシュボードに表示される名前ではなく、`instance_name_tag`で指定しないといけませんでした。

### flavorでg-512mbを使うときはimageに注意！
flavorで`g-512mb`を使うとき、diskのサイズが足りないらしくエラーが出てしまうので、imageの末尾が`-20gb`となっているやつを使う必要がありました。

### キーペアはapiで作らないと取得できない！？
最初、`*.tf`で`openstack_compute_keypair_v2`を記述せずにそのまま既存のkey_pairを使おうとしましたが、既存のkey_pairはwebからポチポチして作ったやつだったからか、うまく読み込んでくれませんでした。
なので、apiからkey_pairの作成をしたところ読みこむようになりました。
結局、key_pairもterraformで作れることがわかったので、あんまり問題にならないと思います。

### ConoHaに書いてあるエンドポイントが違う
security_groupsで指定するやつは、`Network Service`のエンドポイントで確認できるのですが、コンソールで記載してあるエンドポイントが違っていて、取得できず困りました。

- 記載されているエンドポイント→`https://networking.tyo2.conoha.io`
- うまくいったエンドポイント→`https://networking.tyo2.conoha.io/v2.0`


# 参考
[ConoHa API Documantation](https://www.conoha.jp/docs/)  
[OpenStack Provider](https://www.terraform.io/docs/providers/openstack/)  
[How to install Terraform in Ubuntu](https://askubuntu.com/questions/983351/how-to-install-terraform-in-ubuntu)  
[TerraformでConoHaを操作する](https://akichan.lolipop.io/2018/03/18/terrafromconoha/)