スクリプト
バージョンを固定する
- 環境差異によるトラブルを防ぐために必ず記載する
terraform {
required_version = "= 0.12.12"
}
プロバイダバージョンを固定する
- AWSを使う場合は下記の通り
- プロバイダバイナリは進化が早く環境差異が生じやすい
provider "aws" {
version = "= 2.35.0"
}
コマンドライン
コードフォーマット
-
-recursive
オプションで再帰的にフォーマットしてくれる
$ terraform fmt -recursive
バリデーション
- 構文エラーをチェックしてくれる
- これは再帰的には実行されない
-
$ terraform init
を実行した後にやる
$ terraform validate
オートコンプリート
- terraformコマンドを補完してくれるようになる
$ terraform -install-autocomplete
プラグインキャッシュ
-
$ terraform init
時のプロバイダバイナリファイルをキャッシュできる- 設定しないと毎回ダウンロードされる
ホームディレクトリに
.terraformrc
ファイルを作成し、以下を記載する
.terraformrc
plugin_cache_dir = "$HOME"/.terraform.d/置きたいディレクトリ
- 対象のディレクトリを作成すればよい
TFLint
-
$ terraform plan
時に発生するエラーを検出できる - brewでインストール
$ brew install tflint
- tfファイルがあるディレクトリで
$tfint
を実行すればよい - 不正なインスタンスタイプなど、リソースに関する整合性を確認してくれる
- オプションをつけると詳細情報が表示される
$ tflint --deep --aws-region=ap-northeast-1
tfenv
- ディレクトリ毎に使用するTerraformのバージョンを変更できる
- Pythonのpyenvに相当
- プロジェクト毎に異なるバージョンを使用していることもあるので、ローカルの環境とバージョンを合わせましょう
- バージョンの相違でtfstateが参照できなくなることがある
- 詳細はこちら
tfstateファイル管理
- tfstateファイルには、対象のリソースの状態が記載されている
- デフォルトではローカルに保存されるが、チーム開発時に複数の環境から実行される場合は整合性が保てなくなる
- また、ファイルが復元できなくなった場合にTerraformでの管理ができなくなってしまう
S3で管理
- スクリプトに以下のようような記載をすることでtfstateファイルがS3で管理される
- バケットとキーは自由に設定
terraform {
backend "s3"{
bucket = "store-waf-tfstate"
key = "production/terraform.tfstate"
region = "ap-northeast-1"
}
}
- これにより、実行のたびにS3上のtfstateファイルを確認→更新をしてくれる
- バケットにバージョニング、暗号化、パブリックアクセス禁止の設定をしておく
Gitを使わない理由
- Pullを忘れると整合性が合わなくなる
- tfstateは平文で保存されるため、機密情報が入っている場合は危険
- DBを作成するときは、ユーザー名やパスワードが記載される
- S3にはバージョニング、暗号化、パブリックアクセス禁止の設定があり、安く可用性も高いためAWSではS3の使用が推奨されている