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で差分を確認しながら作業できる安心感があり幸せになった。