はじめに
手処理は基本的にヒューマンエラーが起きると思っているので、できる限りのものを自動化したい。
そんな考えを持っているので、手順書を作成しながら、どうしてもEC2インスタンスを手動で設定するのに気が引けてしまうなぁと思っていた。
社内の人たちは「手順書で十分だ」と思っている(指示も手順書までだった)し、社内の人たちを信じていないわけではないが、どんなに気を付けていてもヒューマンエラーは起きる。いずれぜっっったいに起きる。
加えて、手作業で行うより自動化してしまったほうがセットアップは楽だと思う。
いちいち「ここの設定なんだったっけ?」と思いながら手順書を見返す必要もなくなるからだ。
そんなわけで、既存のEC2インスタンスの設定をTerraformへインポートしてコードとして管理することにした。
前提
TerraformとAWS CLIがインストールされているとして話を進める。
もし、インストールしていない人は、
を参考にしてインストールしてください。
プロバイダの定義
main.tf
を作成してプロバイダを定義する。
provider "aws" { region = "ap-northeast-1" // 東京 }
プレースホルダリソースの追記
定義したプロバイダの下にプレースホルダリソースを追記する。
ここにEC2の設定を記述していく。
provider "aws" { region = "ap-northeast-1" // 東京 } resource "aws_instance" "hoge_instance" { // 後ほど記述する }
Terraformの初期化
下記コマンドを叩いて初期化する。
$ terraform init
EC2インスタンスのIDを確認する
下記のコマンドを叩いてインポートしたいEC2インスタンスのIDを確認する。
$ aws ec2 describe-instances --query "Reservations[*].insatnces[*].InstanceId" i-hogehoge
TerraformにEC2インスタンスの定義をインポートする
下記のコマンドを叩いてインポートする。
$ terraform import aws_instance i-hogehoge
Terraformにインポートされたインスタンスの定義を表示させる
下記のコマンドを叩いて定義を表示させる。
$ terraform show # aws_instance.hoge_instance: resource "aws_instance" "hoge_instance" { ami = "ami-00000000000" // ... ] // ... その他の定義 } }
出力された定義をプレースホルダリソースへ追記する
デフォルトから変更した箇所など、必要な部分のみを記述して冗長にならないようにする。
provider "aws" { region = "ap-northeast-1" } resource "aws_instance" "hoge_instance" { ami = "ami-00000000000" instance_type = "t2.micro" key_name = "hoge_key_name" root_block_device { volume_type = "gp1" volume_size = 100 } ebs_block_device { device_name = "hogedb" volume_type = "st1" volume_size = 500 } tags = { Name = "hoge-ec2" } // 他に必要なものがあれば記述する }
設定を保存する
下記コマンドを叩いて保存。
$ terraform plan
設定を反映させる
下記コマンドを叩いて定義を反映させる。
apply
コマンドを叩かないと定義が反映されないので注意。
$ terraform apply
おわりに
はじめてTerraformを使ってIaCにチャレンジしてみましたが、できるところはコード化したほうが良さそう。
簡単なところから徐々にコード化していきながら、Terraformに触れる機会をながら理解できるようになっていければと思う。
リソースの定義が全部出てきたときは感動した……。
参考サイト・資料
- 既存のAWS環境を後からTerraformでコード化する
- Terraformで既存リソースを簡単コード化