conoha用にterraformファイル作成 

## はじめに
[terraformを使ってconohaでinstance生成](https://qiita.com/maki_azuki/items/cf98335a8edaddd0a801)でinstance生成が出来た。
これらの情報を元に勉強用instance生成のためのterraform資材を作成する

##### - machine specs
- OS : MacBook
- terraform: v0.11.13
- cloud : conoha VPS

## Menu
本ページでは以下の内容をやっていきます。

- terraform変数管理
  - access_key等の情報は別ファイルで持たせる
  - image_id/auth_url等はtfファイルで管理
- 足りてない機能の拡充
  - セキュリティグループ&ルール(port22のみ解放)を追加（tfファイル更新）
- 動作確認
  - applyによるリソース作成
  - ssh接続確認
  - destoryによる削除

## 結論
最低限の変数化とtfファイルの作成は行えた。
セキュリティグループはドキュメントが充実してたので１００割パクリでいけたのが嬉しい。:laughing:

##### - 今後の課題
- ぅーん。これじゃGUI行かないとIPわからんちん
  - 一応、stateファイル見ればconohaからの情報（instanceのID, IPaddress等）が判る
- image/flavorは切り替えやすい様に別ファイルで定義してスイッチ出来る様にしたい。(centOSもつかいたいねん）
- SecurityGroupとかは毎回作らずに使いまわしたい。
  - 「有れば作らない」、「Destroy時には削除しない。」
- id_rsaファイルとかはinstance生成時に配置とかしておきたい
  - 多分user_dataとかいうので頑張るんだと思う。
    - ただ、ird_rsa.pubの情報もあんまgithubとかで管理したくないんよな。さてどうするか。 
- moduleって何？レベルなので他の何かをもう少し覚える。
- ベストプラクティクスなのがあるはずなので探してみる。

## terraformの変数管理
前述の方針に則り、以下の様にファイルを用意した。

##### - variable.tf作成
要点はmapを使用して分類ごとに定義する。

```text:variable.tf
variable "general_setting" {
  type = "map"

  default = {
    path_pub_key = "~/.ssh/id_rsa.pub"
    auth_url = "https://identity.tyo2.conoha.io/v2.0"
  }
}

variable "conoha_config" {
  type = "map"

  default = {
    image_id  = "de03b36d-21d8-4e58-9b8e-24581dda86fa"
    flavor_id = "d92b02ce-9a4f-4544-8d7f-ae8380bc08e7"
  }
}
```

##### - .conoha.rc作成
current dirにrc fileを作成。
APIキー等を定義してそれらをsourceコマンドで読み込んで使用する。

```bash:~/.terraform/.conoha.rc
azuki@maki-mac:~/Deployments/terraform$ cat ~/.terraform/.conoha.rc
export TF_VAR_C_TENANT_ID=XXXXXXXXXXXXX
export TF_VAR_C_USER_NAME=YYYYYYYYYY
export TF_VAR_C_PASSWORD=DDDDDDDDDDDDDDDD
azuki@maki-mac:~/Deployments/terraform$
```

## セキュリティ設定
[openstack_networking_secgroup_rule_v2](https://www.terraform.io/docs/providers/openstack/r/networking_secgroup_rule_v2.html)を元に作成。

##### - グループ追加
デフォルトで勝手に付いてくるruleは削除する様に設定

```text:add_security_group_resource
resource "openstack_networking_secgroup_v2" "azuki_sec_group" {
  name        = "azuki_sec_group"
  delete_default_rules = true
  description = "My neutron security group"
}
```

##### - ルール追加
ポート番号２２のみ許可。つまりping(icmp)は受け付けないはず

```text:add_security_roles
resource "openstack_networking_secgroup_rule_v2" "azuki_secgroup_rule01" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 22
  port_range_max    = 22
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = "${openstack_networking_secgroup_v2.azuki_sec_group.id}"
}
```

##### - ルール適用
security_groupsに前述で定義しているgroup名を定義する

```text:resource_deploy_instance
resource "openstack_compute_instance_v2" "deploy_basic_instance" {
  name        = "azuki-vps"
  image_id    = "${lookup(var.conoha_config, "image_id")}"
  flavor_id = "${lookup(var.conoha_config, "flavor_id")}"
  key_pair    = "terraform-keypair"

  security_groups = [
    "azuki_sec_group",
  ]

  metadata {
    instance_name_tag = "azuki-vps"
  }
}
```

## 動作確認

##### - applyによるリソース作成
sec_group&ruleの作成及びkeypairとinstance作成の計４Resource無事成功。

```text:finish_terraform_apply
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
azuki@maki-mac:~/Deployments/terraform$
```

##### - ssh接続確認
ssh接続OK。pingは想定通り失敗してくれた。:relaxed:

```text:ssh_connect
azuki@maki-mac:~/Deployments/terraform$ ssh root@118.27.8.155
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-141-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


root@118-27-8-155:~# exit
logout
Connection to 118.27.8.155 closed.
azuki@maki-mac:~/Deployments/terraform$
```

```text:check_ping_NG
azuki@maki-mac:~/Deployments/terraform$ ping -c 5 -W 5 118.27.8.155
PING 118.27.8.155 (118.27.8.155): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3

--- 118.27.8.155 ping statistics ---
5 packets transmitted, 0 packets received, 100.0% packet loss
azuki@maki-mac:~/Deployments/terraform$
```
##### - destroyによるリソース削除
sec_group&ruleの作成及びkeypairとinstance削除の計４Resource無事成功。

```text:finish_terraform_destroy

Destroy complete! Resources: 4 destroyed.
azuki@maki-mac:~/Deployments/terraform$
azuki@maki-mac:~/Deployments/terraform$
```

## 参考ページ
- 全般
  - [terraformを使ってconohaでinstance生成](https://qiita.com/maki_azuki/items/cf98335a8edaddd0a801)
  - [Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる](https://qiita.com/minamijoyo/items/1f57c62bed781ab8f4d7):sunny:
- [Terraform で変数を使う]
(https://qiita.com/ringo/items/3af1735cd833fb80da75)
- 変数系操作
  - [Terrafromで環境変数の値を利用する](https://pages.momiage.tokyo/posts/terrafrom_env/)
  - [mapを使った読みやすいterraform variablesの書き方](https://qiita.com/VTRyo/items/a633eaa3d9049cad0ed5)
- terraform resource
  - [openstack_networking_secgroup_rule_v2](https://www.terraform.io/docs/providers/openstack/r/networking_secgroup_rule_v2.html)(グループの追加もここに書いてある)