Terrafom入門(terraformのバージョン固定、tfstateをS3で管理、tag名を効率的に指定)
少し前から使い始めたTerrafrom。ちょっとしたTipsで使い勝手が向上したのでメモしておく。
Terraformのバージョンを固定
Terraformはバージョンが0.xxということもあって、前のバージョンとの互換性がなくなることもあるようだ。tfstateファイルを別バージョンのTerraformで書き換えられても困る。ということで、バージョンを固定する必要性は高い。
tfファイルの書き方。これで0.13以上が必要であることを明記できる。
terraform {
required_version = ">= 0.13"
}
tfenvを利用してterrafromコマンドの複数バージョンを管理・利用する。
# brewでインストールしたterraformを削除して、tfenvをインストール
brew uninstall terraform
brew install tfenv
# インストール可能なバージョンを表示
tfenv list-remote
tfenv install [任意のバージョン]
tfenv use [任意のバージョン]
tfenv list
tfenv uninstall [任意のバージョン]
# プロジェクトごとにterraformのバージョンを指定する
echo 0.14.0 > .terraform-version
tfstateをS3で管理
tfstateファイルはチームで共有するファイルであり、ローカルPC上に置いておくのは良くない。ローカルPC上に置いていて、間違えて消えてしまうのも怖い。なのでS3で保管するのが良い。lockするならば、Dynamo DBを使うらしい。
主にTerraformをしばらく書いて覚えた個人的なTipsについて | Developers.IOを参考にさせてもらった。
S3バケットの作成
$ BUCKET_NAME=<BACKEND S3 BUCKET>
$ REGION=<S3 BUCKET REGION>
$ aws --region $REGION s3api create-bucket \
--create-bucket-configuration LocationConstraint=$REGION \
--bucket $BUCKET_NAME
$ aws s3api put-bucket-versioning \
--bucket $BUCKET_NAME \
--versioning-configuration Status=Enabled
backend.tfを以下のように記載する。
terraform {
backend "s3" {
bucket = "BUCKET_NAME"
key = "path/to/key"
region = "REGION"
}
}
s3に保存する上で注意したいのは、terraform initをする前にawsコマンドでS3に接続できる必要があるということ。これができていないと、以下のようなエラーとなる。
$ terraform init
Initializing the backend...
Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.
Please see https://www.terraform.io/docs/backends/types/s3.html
for more information about providing credentials.
Error: NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
Terraform Cloud and Terraform Enterprise - Terraform by HashiCorpでも、tfstateを管理することができるようだ。時間があれば試してみたい。
tag名を効率的に指定する
今までリソースごとにタグ名を書いていただけど、無駄だなと思っていた。システムごとの名前をつけるのだから、一括で指定できればいいのにと思っていた。Terraformをしばらく書いて覚えた個人的なTipsについて | Developers.IOにやり方が書いてあったので参考にさせていただいた。
variables.tf
variable "tags" {
default = {
Environment = "test"
System = "example-vartags"
}
description = "Additional resource tags"
type = map(string)
}
main.tfには以下のように書く。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = merge(
var.tags,
{
Name = "${var.tags.System}-${var.tags.Environment}-VPC"
},
)
}