Terraform事始め
一人Terraform Advent Calendar
この記事は一人Terraform Advent Calendarの2日目の記事です。
Terraform事始め
Terraformはリソースの作成、変更、削除を、IAMのクレデンシャル情報を使いAPIを経由してそれらの操作をユーザーの代わりに行います。
使い始めるにあたっては、クレデンシャル情報を記述したファイルをコマンドを実行するディレクトリの直下に配置してください。
# Configure the AWS Provider provider "aws" { access_key = "AWS_ACCESS_KEY" secret_key = "AWS_SECRET_KEY" region = "YOUR_REGION" }
TerraformのソースコードをVCSで管理するときには アクセスキー、シークレットキーはコミットに含めないように気をつけてください。環境変数やファイル分割などを使ってキーの管理を外部化するとリポジトリの管理も楽になるでしょう。
先述の通り、Terraformは与えられたクレデンシャル情報を使用してAWSのAPI経由でリソースに対する操作を行います。Terraformのレシピを記述するために使われるHashiCorp Configuration Language(HCL)は、Terraform、PackerやVagrantなどで有名なHashiCorp社によって開発されました。HCLは多数の組み込み関数と演算子を持っていて、インフラ構成を宣言的かつ複雑なロジックを内包しながら記述することができます。JSONとの互換性によりTerraformはHCLで記述されたレシピをJSONとしてパースし、そのJSONオブジェクトをリクエストボディとして対象となるAPIに対して送信してリソースの操作を行います。
Terraformが扱うデータ、ファイル
Terrafomは、リソースを作成するための設定ファイルやクレデンシャル情報以外にもいくつかのメタデータを管理しています。
デフォルトの設定でローカルに吐き出される.terraform/terraform.tfstate
というファイルは、Terraformで管理されているクラウド上のリソースの情報(AWSではARNやID、リソースごとの設定情報やメタデータなど)がJSONの形で保存されています。Terraformがインフラの実体に対して変更を加えるときには、実体そのものをAPIなどを使って参照しているのではなく、このterraform.tftate
を見てその差分から適切な処理を決めているわけです。その他には、モジュールへのシンボリックリンクやプラグインの本体も保存されています。
これらのデータは基本的にユーザーが意識して管理をする必要はありませんが、唯一terraform.tfstate
のみTerraformのBackends機能を使用して管理方法を変えることができます。
Terraformはterraform.tfstate
とレシピの差分を見てリソースの操作を決めるため、stateの管理下に対象のリソースが無ければ当然AWSのAPIに対してリソースの作成をするためのHTTPリクエストを送信することになります。もしこれが、レシピを共有している別のユーザーによって既に行われた操作だった場合、つまり、terraform.tfstate
を共有していないユーザーがそれぞれ同じレシピを適用しようとした場合に、二回目以降のリソース作成でエラーが起きてしまいます。メタデータを含むディレクトリの.terraform
にはOS毎のプラグインのバイナリも含まれているため、このディレクトリをVCSで管理することは得策とは言えません。そこで、上記のBackendsを利用すればAmazon S3やGoogle Gloud Storageのようなパブリッククラウドのオブジェクトストレージを利用してterraform.tfstate
をオンラインで管理し全ユーザーでそれを共有することができます。個人の場合もチーム開発の場合も、基本的にBackends機能を利用したほうが開発はスムーズに進むでしょう。
まとめ
- レシピはすべてHCLを使って記述
- 動作プロセスの話
- メタデータの話
terraform.tfstate
のリモート管理