Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

自分用のメモに

ゴール

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

試した環境

Ubuntu16.04 Desktop

構築手順

terraformコマンドを使えるようにする

ワンライナー

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トークンを手に入れる

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のディストリビューション)の一覧を確認する

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のプラン)の一覧を確認する

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ファイルを作る(例)

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の実行

まずは初期化

terraform init

構築

terraform apply

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

削除

terraform destory

ssh接続の確認

ipアドレスを確認

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アドレスで接続してみる

ssh root@<IPアドレス>

パスワードなし(公開鍵認証)でログインできるはず

ハマりどころ

ダッシュボードに表示されるサーバ名が指定できない

openstack_compute_instance_v2nameの指定はダッシュボードに表示される名前ではなく、instance_name_tagで指定しないといけませんでした。

flavorでg-512mbを使うときはimageに注意!

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

キーペアはapiで作らないと取得できない!?

最初、*.tfopenstack_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

OpenStack Provider

How to install Terraform in Ubuntu

TerraformでConoHaを操作する

kaminchu
water-cell
地球人口100億の時代への農業革命をWebテクノロジで支える
https://water-cell.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away