nozayasu-memo

プログラムのメモ

TerraformとTerraformingを運用中のAWSリソースで試してみる

すでに運用中のELB/EC2でのAppサーバ構成と、同等の構成な別環境がほしくなった。

地道に作るよりどうせなら、状態管理とdry runできるTerraformを試そうと思ったのでやってみることにした。

TerraformとTerraformingをinstall

brew install terraform
gem install terraforming

Terraform用のAWS設定を作成

aws.tf として接続設定を用意しておく

provider "aws" {
  region     = "ap-northeast-1"
  access_key = "access_key"
  secret_key = "secret_key"
}

既存のリソースの状態をローカルに再現する

Terraformはステートファイル(terraform.tfstate)という仕組みを使用して、リソースの状態管理をしているのでそれをローカルに再現する。

Terraformingを利用してterraform.tfstateの作成、リソースのtfファイルを作成した。

terraform.tfstate作成

terraforming ec2 --tfstate > terraform.tfstate
terraforming eip --tfstate --merge=terraform.tfstate --overwrite
terraforming elb --tfstate --merge=terraform.tfstate --overwrite

--overwrite オプションをなくせば書き込む前にmerge後の内容を確認もできる

既存EC2関連をひとまとめにしたtfファイル作成

terraforming ec2 > ec2.tf
terraforming eip >> ec2.tf
terraforming elb >> ec2.tf

新規追加するリソースのtfファイル作成

new_ec2.tf

resource "aws_instance" "web" {
    ami                         = "ami-xxxxxx" # 任意のAMI ID
    ebs_optimized               = false
    instance_type               = "t2.small"
    monitoring                  = false
    key_name                    = "nozayasu"

    root_block_device {
        volume_type           = "gp2"
        volume_size           = 8
        delete_on_termination = true
    }

    tags {
        "Name" = "web"
    }
}

resource "aws_eip" "web" {
    instance = "${aws_instance.web.id}"
    vpc      = true
}

resource "aws_elb" "web" {
    name                        = "web"
    subnets                     = ["subnet-xxxxxx", "subnet-xxxxxxx"]
    security_groups             = ["sg-xxxxxx"]
    instances                   = ["${aws_instance.web.id}"]
    cross_zone_load_balancing   = true
    idle_timeout                = 60
    connection_draining         = true
    connection_draining_timeout = 300
    internal                    = false

    listener {
        instance_port      = 80
        instance_protocol  = "http"
        lb_port            = 80
        lb_protocol        = "http"
        ssl_certificate_id = ""
    }

    health_check {
        healthy_threshold   = 10
        unhealthy_threshold = 2
        interval            = 30
        target              = "HTTP:80/index.html"
        timeout             = 5
    }
}

${aws_instance.web.id} で最初に定義したaws_instance.webのinstance_idが取得できる、依存関係が必要なEIPやELBにはそれを利用して一括設定。

変更確認

terraform plan

変更箇所として、 - 表示が出ていた場合は削除扱いなので要確認

状態適応

terraform apply

所感

dry runで差分を確認しながら作業できる安心感があり幸せになった。

参考