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

10分で理解するTerraform

More than 1 year has passed since last update.

Terraform とは

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

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

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

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 で認証情報をセットした後であれば自動でこのAWS認証情報を参照してくれます
~/.aws/credentials にAWSの認証情報が保存されます

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

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

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

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

variables.tf
provider "aws" {
  version = "~> 2.0"
  region  = "ap-northeast-1"
}

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)}"
  }
}

※ terraform v0.11 までは tags= は不要でしたが、v0.12 より一部の構文が変更となり tags = と書くようになりました
(参考) https://www.terraform.io/upgrade-guides/0-12.html#attributes-vs-blocks

上記は以下を表してます

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

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

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

初めて実行する場合のみ初期化のために init を実行します

init
$ terraform init

定義内容のチェックは plan を実行します

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

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

scouty
「あらゆる事象を必然化し、 世の中のミスマッチをなくす」ことをミッションとし、AIヘッドハンティングサービスを開発・運営するスタートアップ
https://lapras.com
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした