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"
    },
  )
}
投稿日 2020年12月06日