ConohaでAPIを使ってみる

## Overview

##### - 目的
terraform使ってみたい。(in conoha)
しかし、その前にconohaのAPIを使ってみた方が良いと思った（直感
なので、先人に倣いconohaのAPIを使ってみる。

##### - このページでなんとなく判ること
- conohaVPSでAPIを実行出来る
- conohaVPSで必要最低限のinstance生成が行える

##### - Reference
- [トークン取得](https://support.conoha.jp/v/apitokens/)
- [ConoHa API Documantation](https://www.conoha.jp/docs/)

##### - 結論
API実行はやはり面倒だなぁ。という感じだった。
CLIは個人の方が作ってるけれども、自動系ならterraformを使えば良さそうなので意欲湧いた。

## API実行の準備

##### - API使うために情報を集める
手順は[Conohaのページ](https://support.conoha.jp/v/apitokens/)に書かれてます。
APIを実行するにあたり、トークンを取得する必要がある。
このため、トークンを取得するためにはConohaのIdentifyのエンドポイントにRESTを飛ばす必要がある。
その際、色々情報(user/password/endpoint/tenantid)を載せて飛ばす必要がある。
この情報の準備、収集をする

###### <font color="red">★注意</font>
user/passwordはAPI用に新たに準備するもの。ログインID/Passwordではない。

##### - トークン取得
今後色々使う情報なので変数に入れておくと無難。こんな感じで変数に確保しました。

```bash:sample_get_token
TOKEN=`curl -s -X POST -H "Accept: application/json" \
-d '{ "auth": { "passwordCredentials": { "username": "'"$C_USER_NAME"'", "password": "'"$C_PASSWORD"'" }, "tenantId": "'"$C_TENANT_ID"'" } }' \
https://identity.tyo2.conoha.io/v2.0/tokens \
| jq ".access.token.id"| sed -e s/\"//g`;echo $TOKEN
```

## 試しにAPIをいくつか実行してみよう
conohaに既に[ConoHa API Documantation](https://www.conoha.jp/docs/)があるのでこれを見ながらいくつか打ってみる。

##### - Compute API v2 (nova list相当)
自分のinstanceの一覧を表示。（今は１台のみ有る）

```
curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://compute.tyo2.conoha.io/v2/$C_TENANT_ID/servers | jq
```

```json:API_result
azuki@maki-mac:~/Deployments/terraform$ curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://compute.tyo2.conoha.io/v2/$C_TENANT_ID/servers | jq
{
  "servers": [
    {
      "id": "9f5a09a3-ae33-410a-bf7a-f22810747aXX",
      "links": [
        {
          "href": "https://compute.tyo2.conoha.io/v2/5a04833c9fbe42709cc3fcbdcaa4XXXX/servers/9f5a09a3-ae33-410a-bf7a-f22810747aXX",
          "rel": "self"
        },
        {
          "href": "https://compute.tyo2.conoha.io/5a04833c9fbe42709cc3fcbdcaa4XXXX/servers/9f5a09a3-ae33-410a-bf7a-f22810747aXX",
          "rel": "bookmark"
        }
      ],
      "name": "118-27-28-241"
    }
  ]
}
```

#####  - Compute API v2 (nova show相当）
```
curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://compute.tyo2.conoha.io/v2/$C_TENANT_ID/servers/<INSTANCE_ID> | jq
```

```json:result
azuki@maki-mac:~/Deployments/terraform$ curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://compute.tyo2.conoha.io/v2/$C_TENANT_ID/servers/9f5a09a3-ae33-410a-bf7a-f22810747aXX | jq
{
  "server": {
    "status": "ACTIVE",
    "updated": "2019-05-03T05:46:13Z",
    "hostId": "7ee0386cf0299e07acbff410bd6792542e30aaaccf9ee66cdbdXXXXX",
    "OS-EXT-SRV-ATTR:host": "cn-d12141.g1.tyo2.v4",
~snip~
    "image": {
      "id": "de03b36d-21d8-4e58-9b8e-24581dda86fa",
      "links": [
        {
~snip~
    "flavor": {
      "id": "d92b02ce-9a4f-4544-8d7f-ae8380bc08e7",
      "links": [
        {
          "href": "https://compute.tyo2.conoha.io/5a04833c9fbe42709cc3fcbdcaa4XXXX/flavors/d92b02ce-9a4f-4544-8d7f-ae8380bc08XX",
          "rel": "bookmark"
        }
~snip~
      "backup_set": "0"
    }
  }
}
```

## instance作成する前に
APIを実行してinstanceを作成する上で、最低限以下の情報が必要になる。
- image_id（使用するImage情報, ubuntu,centOS等)
- flavor_id(使用するプラン情報, 1CPU-512mb等）

##### - 結果として
以下のAPIを実行して2つのIDを決めました

- image_id : de03b36d-21d8-4e58-9b8e-24581dda86fa(ubuntu16.04)
- flavor_id : d92b02ce-9a4f-4544-8d7f-ae8380bc08e7(512mb)

##### - ImageListを取得してみる
どこかにイメージのリストが転がってないか見てみたけど見つからなかったのでAPIを打った。
この結果からさらにgrepすると良いと思う。（本当は公式でCLIが提供されてたら嬉しい。）

```bash:command
curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://$C_EP_IMAGE/v2/images | jq . | egrep "\"id\"|\"name\""
```

##### - flavorlistを取得してみる
```bash:command
curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" https://$C_EP_COMPUTE/flavors | jq
```
## insntaceを作成
```bash:command
url -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" -d '{ "server": { "imageRef": "de03b36d-21d8-4e58-9b8e-24581dda86fa", "flavorRef": "d92b02ce-9a4f-4544-8d7f-ae8380bc08e7", "adminPass": "XXXXX"} }' https://${C_EP_COMPUTE}/servers | jq
```
```bash:result
azuki@maki-mac:~/Deployments/terraform$ curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $TOKEN" -d '{ "server": { "imageRef": "de03b36d-21d8-4e58-9b8e-24581dda86fa", "flavorRef": "d92b02ce-9a4f-4544-8d7f-ae8380bc08e7", "adminPass": "XXXXXX"} }' https://${C_EP_COMPUTE}/servers | jq
{
  "server": {
    "security_groups": [
      {
        "name": "default"
      }
    ],
    "OS-DCF:diskConfig": "MANUAL",
    "id": "c4419fd2-e36a-4074-ab9a-89a46612XXXX",
    "links": [
      {
        "href": "https://compute.tyo2.conoha.io/v2/5a04833c9fbe42709cc3fcbdcaa41XXXXX/servers/c4419fd2-e36a-4074-ab9a-89a46612XXXXX",
        "rel": "self"
      },
      {
        "href": "https://compute.tyo2.conoha.io/5a04833c9fbe42709cc3fcbdcaa4XXXX/servers/c4419fd2-e36a-4074-ab9a-89a46612XXXXX",
        "rel": "bookmark"
      }
    ],
    "adminPass": "XXXXX"
  }
}
azuki@maki-mac:~/Deployments/terraform$
```

## おまけ
##### rcファイル作成した方が良さそう
途中から面倒なのでrcファイル作って実施してました。

```bash:rc_file
C_TENANT_ID=<TENANT_NAME>
C_USER_NAME=<API USER>
C_PASSWORD=<API PASSWORD>
C_EP_COMPUTE=compute.tyo2.conoha.io/v2/${C_TENANT_ID}
C_EP_IMAGE=image-service.tyo2.conoha.io
C_EP_VOLUME=block-storage.tyo2.conoha.io/v2/${C_TENANT_ID}
```