技術ブログ

Terraform を使って DigitalOcean にサーバをたてる

author: yterajimadate: 2016-06-02tags: digitalocean, terraform, packer, ansible

これまで DigitalOcean を使う場合, 管理画面で手動でサーバを立ち上げプロビジョニング, または vagrant-digitalocean を使ってサーバを立ち上げつつプロビジョニングといった方法で対応してきました。

複数サーバを組み合わせて使う場合にこれらの方法だとイマイチだなぁと感じていた矢先, 先日購入した DevOps を支える HashiCorp ツール大全Terraform が紹介されていたので試しに使ってみました。

使うもの

  • Terraform
    • オーケストレーションツール。サーバの立ち上げから DNS の設定までいろいろ一発で処理できる。
  • Packer
    • DigitalOcean 上にマシンイメージを作成。
  • Ansible
    • Packer で作成するマシンイメージをプロビジョニング(構成管理)する。
  • doctl
    • DigitalOcean の CLI ツール。マシンイメージの ID 等々の取得に利用。

手順

  1. Packer + Ansible で DigitalOcean 上にマシンイメージ (snapshot) を作成
  2. doctl コマンドでマシンイメージの ID を確認
  3. Terraform でサーバを立てる

Packer + Ansible でマシンイメージを作成

リポジトリ: yterajima/packer-digitalocean

今回は複数サーバを Terraform で一度に立ち上げるのが目的なのでマシンイメージは先日書いた Ansible を使った構成管理 とほぼ同じものです。

Packer を使って DigitalOcean にマシンイメージを登録するには, 管理画面から取得できる Token が必要になります。今回は環境変数に DIGITALOCEAN_API_TOKEN を指定することで packer 使用時に読み込まれるようにしています。。設定ファイルに直接 Token を書くこともできます。

$ packer build 15.10.json を実行し DigitalOcean 上にマシンイメージを作成します。このイメージを使ってサーバを立ち上げていきます。

doctl コマンドでマシンイメージの ID を確認

Terraform でサーバを立ち上げるにはマシンイメージの ID が必要になります。この ID は doctl を使って検索することができます。doctl の Token の設定についてはリポジトリの README で確認してください。

$ doctl compute image list | grep e2esound-ubuntu-15.10
17xxxxx        e2esound-ubuntu-15.10-201606011929                      snapshot        Ubuntu                                  false   20

行頭に表示される数字がマシンイメージの ID になります。今回は DigitalOcean に登録されている SSH Key を指定して後でパスワード無し SSH 接続できるようにするため, 登録されている鍵の ID も必要になります。鍵の ID は次のコマンドで確認することができます。

$ doctl compute ssh-key list

Terraform でサーバを立てる

リポジトリ: yterajima/terraform-digitalocean

仮に app サーバと db サーバを用意することにします。Terraform の実行時にも DigitalOcean の Token が必要です。また設定ファイルで使用するマシンイメージの ID と SSH Key の ID も必要になります。これらの値を環境変数で管理します。(実際には direnv)

export DIGITALOCEAN_TOKEN=xxxxxxxxxxxxxxxxxxx
export TF_VAR_image_id=(doctl で表示したマシンイメージのID)
export TF_VAR_key_id=(doctl で表示した SSH Key の ID)

$ terraform plan で設定ファイルに問題がないか確認し $ terraform apply を実行します。60 秒程度でサーバが立ち上げられます。

digitalocean-terraform

立ち上げたサーバの詳細は show コマンドで確認できます。

$ terraform show
digitalocean_droplet.mitsume-app:
  id = 16xxxxxx
  image = xxxxxxxx 
  ipv4_address = 188.166.185.225
  locked = false
    name = mitsume-app
  region = sgp1
  size = 512mb
  ssh_keys.# = 1
  ssh_keys.0 = xxxxxx
  status = active
digitalocean_droplet.mitsume-db:
  id = 16xxxxxx
  image = xxxxxxxx 
  ipv4_address = 188.166.185.195
  locked = false
    name = mitsume-db
  region = sgp1
  size = 512mb
  ssh_keys.# = 1
  ssh_keys.0 = xxxxxx
  status = active

SSH Key を設定したので app サーバの場合であれば $ ssh root@188.166.185.225 で SSH 接続することが可能です。サーバ削除は $ terraform plan -destroy で確認後 $ terraform destroy で実行できます。

Terraform を使ってみて

最初サーバを立ち上げるまでは DigitalOcean からどうやって必要な情報を修得してくるのか分からなかったので大変でしたが, doctl コマンドの使い方が分かれば特に詰まることなく使うことができました。Terraform に加え, Packer + Ansible を組み合わせた複数サーバ環境の作り方が理解できたので今後の仕事でも使っていきたいと思います。

今回は面倒なので書いていませんが, DigitalOcean で Web サーバを立ち上げつつ AWS Route53 で管理しているドメインを Web サーバの IP アドレスに設定することもできました。もう少し試す必要がありますが臨時でサーバを立てる必要があるような場合に一式の設定ファイルを用意しておくとコマンド 1 つで検証環境を立てる, ようなことができます。便利。