5次元のカオス

南の島の学生がつらつらと日々を書き連ねます

Terraform 実行時の注意

Terraform とは?

Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions.

Introduction - Terraform by HashiCorp

ということで、AWS や Heroku などの状態をコード (JSON 互換の HCL という言語) で記述することができます。

簡単に実行することができる反面、注意しなければいけないことも多い気がするので使う上での注意点を自分用にメモする。

事前準備

Terraform が AWS にアクセスするためのユーザーが必要なので、AWS マネジメントコンソールの Identity and Access Management (IAM) でアカウントとアクセスキーの作成を行う。

その後、アクセス許可の項目から以下の2つのポリシーをアタッチする。

  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess

Terraform 実行時の注意

Terraform は実行後に terraform.tfstate というファイルを作成・更新するが、このファイルには Terraform が管理するインフラの状態が JSON 形式で記述されている。

このファイルは git のブランチモデルなどと非常に相性が悪いし、チーム開発などで各個人のローカルマシンから Terraform を好き勝手に実行すると簡単に不整合が生じてしまう。

そのため、terraform.tfstate ファイルは必ず共有できるようにしなければならない。

S3などに置くのが主流っぽい。

Amazon S3 で Terraform の状態管理ファイル terraform.tfstate を管理 / 共有する - Qiita

terraform コマンドの実行

IAM で作成したアクセスキーを環境変数として登録するかコマンド実行時の引数として指定する必要がある。

環境変数として指定する場合
  • AWS_ACCESS_KEY='xxxxxx' or AWS_ACCESS_KEY_ID='xxxxx'
  • AWS_SECRET_KEY='xxxxx' or AWS_SECRET_ACCESS_KEY='xxxxx'
コマンド実行時の引数に指定する場合
  • -var 'access_key=XXX'
  • -var 'secret_key=XXX'

module の内容をすべて出力する

-module-depth=-1 で module の中身の情報を出力することができる。

-module-depth=n     Specifies the depth of modules to show in the output.
                    This does not affect the plan itself, only the output
                    shown. By default, this is zero. -1 will expand all.

EC2 インスタンスの作成

plan コマンドを使用して作成される項目を表示し、その内容を apply-planfile ファイルとして書き出す。

項目を確認後、問題がなければ apply コマンドを使用して EC2 のインスタンスを作成する。

$ terraform plan -module-depth=-1 -input=false -out=apply-planfile
$ terraform apply apply-planfile

EC2 インスタンスの削除

plan コマンド使用して削除される項目を表示し、その内容を destroy-planfile ファイルとして書き出す。

項目を確認後、問題なければ EC2 の apply コマンドを使用してインスタンスを削除する。

destroy コマンドは plan コマンドで出力したファイルを引数に取ることができないため

$ terraform plan -destroy -input=false -out=destroy-planfile
$ terraform apply destroy-planfile

参考