AWS
Terraform
10分で理解するシリーズ

Terraform とは

"インフラストラクチャ定義ツール" に分類されるツールです
クラウド上のリソースを定義ファイルの状態になるように生成・操作してくれるツールです

Vagrant を開発している HashiCorp社 が開発しているツールなので使用感は Vagrant と同じような感じです

インフラの構成を宣言的に定義できるところが特徴で、構築手順を書くのと違って構成定義のみに集中することができます
※"t2.micro インスタンスを1つ" と書けば、作成手順を意識しなくてもその通りに出来上がるということです
単純にスクリプト化するだけだと、手続き的に構築手順を書く必要があります

TL;DR

.tf ファイルに定義内容を記述し、$ terraform apply を実行するだけで定義内容の通りに自動でインフラを構築してくれます

インストール

以下に従って OS 毎のビルド済みバイナリをダウンロードしてきてパスを通すだけ
https://www.terraform.io/intro/getting-started/install.html

Mac の場合

Homebrew でインストールできます

Homebrewでインストール
$ brew update
$ brew install terraform

AWS での使い方

事前準備

IAM ユーザーを作る

aws cli を利用するための アクセスキーを取得します
管理者に依頼して IAM ユーザーを作成してもらってください
https://console.aws.amazon.com/iam/home?#/home

利用したい AWS サービス(EC2、S3とか)に対しての操作権限をつけてもらう必要があります

AWS CLI をセットアップする

以下を参考に aws コマンドを使えるように設定する
http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

$ aws configure で認証情報をセットした後であれば、Pakcer からはこのAWS認証情報を参照してくれます
~/.aws/credentials にAWSの認証情報が保存されます

EC2インスタンスを作成する

1. .tf ファイルを作成する

AWS の認証情報をセットする

variables.tf ファイルを作成し、操作したいリージョン を以下のように記述します

variables.tf
provider "aws" {
  region     = "ap-northeast-1" # Tokyo
}

EC2 のスペックを定義する

ec2.tf
resource "aws_instance" "sandbox" {
  count         = 2
  ami           = "ami-785c491f" # Ubuntu 16.04 LTS official ami
  instance_type = "t2.micro"

  tags {
    Name = "${format("sandbox-%02d", count.index + 1)}"
  }
}

上記は以下を表してます

  • 2つインスタンスを生成
  • AMI: ami-785c491f (Ubuntu 16.04 LST)
  • t2.micro
  • Name に "sandbox-xx"

2. 定義内容をチェックする

1 . variable.tfec2.tf が置かれているディレクトリ内で以下を実行

plan
$ terraform plan

2 . 実行されるプランの内容が出力される
定義内容が意図した通りに反映されるかを確認します

出力結果
〜
+ aws_instance.sandbox.0
    ami:                          "ami-785c491f"
〜
    tags.Name:                    "sandbox-01"
〜
+ aws_instance.sandbox.1
    ami:                          "ami-785c491f"
〜
    tags.Name:                    "sandbox-02"
〜
Plan: 2 to add, 0 to change, 0 to destroy.

3. 定義を適用してインスタンスを作成する

1 . 同ディレクトリ内で以下を実行

apply
$ terraform apply

2 . 出力を確認
ずらーーーーーっと出るので、2オブジェクトが add されたことを確認

出力結果
〜
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
〜

3 . terraform show を見てみる
terraform が作成したオブジェクトの内容が出力されます

出力結果
$ terraform show
aws_instance.sandbox.0:
  id = i-02bbfece7cbf56027
〜
aws_instance.sandbox.1:
  id = i-0aad82a9b81951965
〜

4 . EC2 コンソールを確認
sandbox-01 sandbox-02 の 2つのインスタンスが作成されていることが確認できます

aws_console.png

4. 定義内容を変更する

今あるインスタンスの設定値を変更する

1 . インスタンスの名称を modified sandbox-xx に変更する

ec2.tf
〜
     Name = "${format("modified sandbox-%02d", count.index + 1)}"
〜

2 . 変更内容をチェック

plan
$ terraform plan
〜
~ aws_instance.sandbox.0
    tags.Name: "sandbox-01" => "modified sandbox-01"
〜

tag の差分が表示されていることがわかります

3 . 変更を適用

apply
$ terraform apply
〜
Apply complete! Resources: 0 added, 2 changed, 0 destroyed.
〜

4 . terraform show で確認

show
$ terraform show
aws_instance.sandbox.0:
〜
  tags.Name = modified sandbox-01
〜
aws_instance.sandbox.1:
〜
  tags.Name = modified sandbox-02
〜

tag の変更が反映されてます

5 . ec2 コンソールを確認
コンソールからも変更が確認できます
aws_console_2.png

インスタンスの数を変更する

1 . count を 1 に変更する

ec2.tf
〜
  count         = 1
〜

2 . 変更内容をチェック

plan
$ terraform plan
〜
- aws_instance.sandbox.1

Plan: 0 to add, 0 to change, 1 to destroy.

sandbox.1 が削除されるということがわかります

3 . 変更を適用

apply
$ terraform apply
〜
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.

sandbox.1 が削除されたログが出力されています

4 . ec2 コンソールを確認
modified sandbox-02 が削除されたことがわかります
aws_console_3.png

5. terraform で定義したリソースを全て削除する

1 . terraform destroy
確認を促すプロンプトが出るので "yes" を入力すると削除が開始されます

destroy
$ terraform destroy
Do you really want to destroy?
  Terraform will delete all your managed infrastructure.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_instance.sandbox: Refreshing state... (ID: i-02bbfece7cbf56027)
aws_instance.sandbox: Destroying... (ID: i-02bbfece7cbf56027)
aws_instance.sandbox: Still destroying... (ID: i-02bbfece7cbf56027, 10s elapsed)
aws_instance.sandbox: Still destroying... (ID: i-02bbfece7cbf56027, 20s elapsed)
aws_instance.sandbox: Still destroying... (ID: i-02bbfece7cbf56027, 30s elapsed)
aws_instance.sandbox: Still destroying... (ID: i-02bbfece7cbf56027, 40s elapsed)
aws_instance.sandbox: Still destroying... (ID: i-02bbfece7cbf56027, 50s elapsed)
aws_instance.sandbox: Destruction complete

Destroy complete! Resources: 1 destroyed.

2 . terraform show で確認

show
$ terraform show

管理下のオブジェクトが何もないことが確認できます

3 . ec2 コンソールで確認
ec2.png

全て削除されていることがわかります