既存のAWSリソースをterraformで管理する

はじめに

今開発中のプロダクトは基本全てAWS上で開発している。

1つ問題があって、IAM Roleの管理だったりインスタンスの追加だったりポチポチ手でやっているので、チェックが煩雑だったり都度お願いしてやってもらったりと効率が良くなかった。

そこでterraformで管理することにした

問題点

terraformに設定を書いて実行すればリソースが反映されるが、設定が漏れていると既に動いているリソースが消えてしまう可能性がある。

そうならいように既存を設定をきちんと設定ファイルに落とし込む必要がある

既にあるリソースを.tfファイルに反映する

  1. 順序としては現在のリソースを.tfstateに反映する
  2. .tfsateの設定内容を.tfファイルに反映する
  3. 漏れが無いことを確認して反映する

上記流れに関して少し詳しく説明していく

1. 順序としては現在のリソースを.tfstateに反映する

terraform import <aws resource name>.<resource name> <resource id>

こんな感じで既存の設定をimportする

ex) security group

terraform import aws_security_group.example sg-123abc

ex) ec2インスタンス

terraform import aws_instance.example-server i-12356asdfg

これを実行すると現在の設定を.tfsateファイルにexportしてくれる

ちなみに、tfsateはローカルあったりs3だったりと様々なところで管理できるが、複数人が実行することもありs3で管理することにした

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

terraform {
  backend "s3" {
    bucket = "terraform.some.bucket"
    key    = "terraform.tfstate"
    region = "ap-northeast-1"
  }
}

2. .tfsateの設定内容を.tfファイルに反映する

(今回はbackendをs3に設定したので)、importが無事実行されるとs3のbucket上に.tfsateファイルが生成される

.tfsateファイルを元に.tfファイル形式に落とし込んでいく

結構面倒な作業だった…

(dtan4/terraformingを使うと.tfファイルもexportしてくれるらしいが、勉強の意味も込めて今回は使用しなかった。)

3. 漏れが無いことを確認して反映する

.tfファイルに落としこんだら

 terraform plan

を実行して既存のリソースとズレが無いかチェックする

.tfファイルの内容と.tfstateとの間にずれがあるとターミナルに表示される。

terraform apply

を実行する

もし差分がある場合は、それが実際に反映されてしまうので実行時は少し緊張した(笑)

全てのリソースが反映できるまで 1 ~ 3 を繰り返す。

以上

さいごに

  • 今回.tfファイルは各リソース毎に分けて作ったインスタンスならec2.tf、s3ならs3.tfな感じ。
  • リソースによってはterraform側でのdefault valueが入るので意図しない差分がでてしまうが、そこは問題ない。
  • PolicyのJSONが改行とかの関係でDiffがでるのがドキッとする
Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス
Kief Morris
オライリージャパン
売り上げランキング: 9,906