後ろを向いて後退します

これって前に進んでいることになりませんか?

Terraform事始め

一人Terraform Advent Calendar

この記事は一人Terraform Advent Calendarの2日目の記事です。

adventar.org

Terraform事始め

Terraformはリソースの作成、変更、削除を、IAMのクレデンシャル情報を使いAPIを経由してそれらの操作をユーザーの代わりに行います。

使い始めるにあたっては、クレデンシャル情報を記述したファイルをコマンドを実行するディレクトリの直下に配置してください。

www.terraform.io

# Configure the AWS Provider
provider "aws" {
  access_key = "AWS_ACCESS_KEY"
  secret_key = "AWS_SECRET_KEY"
  region     = "YOUR_REGION"
}

TerraformのソースコードVCSで管理するときには アクセスキー、シークレットキーはコミットに含めないように気をつけてください。環境変数やファイル分割などを使ってキーの管理を外部化するとリポジトリの管理も楽になるでしょう。

先述の通り、Terraformは与えられたクレデンシャル情報を使用してAWSAPI経由でリソースに対する操作を行います。Terraformのレシピを記述するために使われるHashiCorp Configuration Language(HCL)は、Terraform、PackerやVagrantなどで有名なHashiCorp社によって開発されました。HCLは多数の組み込み関数と演算子を持っていて、インフラ構成を宣言的かつ複雑なロジックを内包しながら記述することができます。JSONとの互換性によりTerraformはHCLで記述されたレシピをJSONとしてパースし、そのJSONオブジェクトをリクエストボディとして対象となるAPIに対して送信してリソースの操作を行います。

f:id:mic_psm:20181224032115p:plain
Terraformの動作プロセス

Terraformが扱うデータ、ファイル

Terrafomは、リソースを作成するための設定ファイルやクレデンシャル情報以外にもいくつかのメタデータを管理しています。

デフォルトの設定でローカルに吐き出される.terraform/terraform.tfstateというファイルは、Terraformで管理されているクラウド上のリソースの情報(AWSではARNやID、リソースごとの設定情報やメタデータなど)がJSONの形で保存されています。Terraformがインフラの実体に対して変更を加えるときには、実体そのものをAPIなどを使って参照しているのではなく、このterraform.tftateを見てその差分から適切な処理を決めているわけです。その他には、モジュールへのシンボリックリンクプラグインの本体も保存されています。

これらのデータは基本的にユーザーが意識して管理をする必要はありませんが、唯一terraform.tfstateのみTerraformのBackends機能を使用して管理方法を変えることができます。

www.terraform.io

Terraformはterraform.tfstateとレシピの差分を見てリソースの操作を決めるため、stateの管理下に対象のリソースが無ければ当然AWSAPIに対してリソースの作成をするためのHTTPリクエストを送信することになります。もしこれが、レシピを共有している別のユーザーによって既に行われた操作だった場合、つまり、terraform.tfstateを共有していないユーザーがそれぞれ同じレシピを適用しようとした場合に、二回目以降のリソース作成でエラーが起きてしまいます。メタデータを含むディレクトリの.terraformにはOS毎のプラグインのバイナリも含まれているため、このディレクトリをVCSで管理することは得策とは言えません。そこで、上記のBackendsを利用すればAmazon S3Google Gloud Storageのようなパブリッククラウドのオブジェクトストレージを利用してterraform.tfstateをオンラインで管理し全ユーザーでそれを共有することができます。個人の場合もチーム開発の場合も、基本的にBackends機能を利用したほうが開発はスムーズに進むでしょう。

まとめ

  • レシピはすべてHCLを使って記述
  • 動作プロセスの話
  • メタデータの話
  • terraform.tfstateのリモート管理