🤖

Terraformでよく見る拡張子

2023/10/06に公開

はじめに

最近Terraformを学び始めましたが、拡張子「.tf」以外に「.tfstate」とか「.tfvars」だったり
はたまた.tfの面影もない「.terraform.lock.hcl」なるファイルばかりで困惑しているので、今回はTerraformでよく見る拡張子と、そのファイルの内容について整理してみました。

動作環境

使ったもの バージョン
macOS Ventura 13.5.2
Terraform 1.5.7

この記事で書かないこと

・Terraformのコマンド、構成情報やリソース定義、変数定義の具体的なコードの書き方
・AWSリソースの話

Terraformとは?

Terraformとは、インフラ環境をHCLという独自の記述言語でコードで管理し、自動化するためのオープンソースのIaC(Infrastructure as Code)ツールの一つです。HashiCorp社によって、Go言語で開発されたそうな。

HCLという言語を用いてクラウドプロバイダー(AWS、Azure、Google Cloudなど)やオンプレミス環境などのインフラ環境を定義し、プロビジョニング、変更、削除を簡単かつ再現可能な方法で行うことができてしまいます。スゴイ。

https://www.terraform.io/
https://www.lac.co.jp/lacwatch/service/20200903_002270.html

.tf

Terraformでインフラ環境を記述する際、HCLという言語で書くというのは先ほど話しましたが、HCLを記述する際の標準的な拡張子が「.tf」になります。
このtfで定義されたファイルにインフラ環境を定義していく流れになります。

以下のコードは、拡張子.tfファイルの書き方の例になります。

main.tf
provider "aws" {
  profile = "xxxxxxx"
  region  = "ap-northeast-1"
}

resource "aws_vpc" "vpc" {
  cidr_block                       = "192.168.0.0/20"
  instance_tenancy                 = "default"
  enable_dns_support               = true
  enable_dns_hostnames             = true
  assign_generated_ipv6_cidr_block = false
}

このコードでは、利用するプロパイダーをAWSに指定し、TerraformがアクセスするAWSアカウント(profile)と、TerraformがAWSリソースを作成するリージョンを設定しています。また、VPCが指定されたリージョン内で作成されます。

.tfstate

Terraformを使って構築したクラウドの現在の状態を表すファイルが「.tfstate」拡張子になります。

Terraformがリソースの変更等を行うときに、前回更新内容が書かれた「.tfstate」ファイルを参照し、次回更新時に何らかの変更があればクラウド上のリソースを作成・更新・削除を行い、新しい状態を「.tfstate」ファイルに反映します。

複数ユーザーでTerraformのコードを管理する場合、各々がTerraformでリソースの更新を行ってしまうと各ユーザー同士でtfstateの整合性が取れなくなってしまうため、競合祭りが始まります。
最悪の場合インフラに深刻な影響を与える可能性があるので、基本的にはリモートバックエンド(AWSであればS3)などで管理することが一般的です。

.tfvars

「.tfvars」拡張子のファイルは、外部から読み出す変数の値を格納しておくファイルになります。
こちらで定義した値は、Terraformのコード内でvar.{変数名}として呼び出すことができます。
例えば、先ほどのmain.tf内のcidr_blockの値「"192.168.0.0/20"」を変数化したいとします。

variables.tf
variable "cidr_block" {
    type = string
}

まず変数をコード内で宣言します。今回は便宜上variables.tfといファイルを作成していますが、先ほどのmain.tf内でも問題ありません。

terraform.tfvars
cidr_block="192.168.0.0/20"

variables.tfで宣言した変数に値を代入するのが、この「.tfvars」ファイルになります。

main.tf
provider "aws" {
  profile = "xxxxxxx"
  region  = "ap-northeast-1"
}

resource "aws_vpc" "vpc" {
                                    # 変更箇所
  cidr_block                       = var.cidr_block
  instance_tenancy                 = "default"
  enable_dns_support               = true
  enable_dns_hostnames             = true
  assign_generated_ipv6_cidr_block = false
}

こうすることで、変数を宣言・値の代入を行い、.tfファイル内で使うことができます。

.tfvarsファイルを作成するメリットとして、開発・ステージング・本番などの各環境固有の要素(IPアドレスなど)を、各環境用の.tfvarsファイルに定義してあげることで、.tfファイルのコードを変更せずに再利用することができる点が挙げられます。

また、コードに直に書きたくない秘匿情報(APIキーや証明書など)もこの.tfvarsファイル内で管理して、.tfファイル内にベタ書きすることを防ぐってこともできます。安心。

variables.tf
variable "aws_access_key" {
    type = string
}

variable "aws_secret_key" {
    type = string
}
terraform.tfvars
aws_access_key="xxxxxxxxxxxxxxxxxxxxxxxx"
aws_secret_key="yyyyyyyyyyyyyyyyyyyyyyyy"
main.tf
provider "aws" {
  access_key = ${var.aws_access_key}
  secret_key = ${var.secret_key}
  region = "ap-northeast-1"
}

.terraform.lock.hcl

terraform initコマンド実行時に生成される、プロバイダーとモジュール(.tfファイルに記述したコード)の依存関係、互換性が記載されたファイルです。いわゆる依存ロックファイルになります。

下記のコードは先ほどのmain.tfを作成し、terraform initをした際に作成されたものです。一見何が何だかなんかよくわかんないファイルに見えます。

.terraform.lock.hcl
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.

provider "registry.terraform.io/hashicorp/aws" {
  version = "5.19.0"
  hashes = [
    "h1:MJclj56jijp7T4V4g5tzHXS3M8vUdJAcBRjEstBh0Hc=",
    "zh:03aa0f857c6dfce5f46c9bf3aad45534b9421e68983994b6f9dd9812beaece9c",
    "zh:0639818c5bf9f9943667f39ec38bb945c9786983025dff407390133fa1ca5041",
    "zh:0b82ad42ced8fb4a138eaf2fd37cf6059ca0bb482114b35fb84f22fc1500324a",
    "zh:173e8c19a9f1d8f6457c80f4a73a92f420a81d650fc4ad0f97a5dc4b9485bba8",
    "zh:42913a40ddfe9b4f3c78ad2e3cdc1dcfd48151bc132dc6b49fc32cd6da79db21",
    "zh:452db5caca2e53d5f7090979d518e77aa5fd98385514b11ee2ce76a46e89cb53",
    "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425",
    "zh:a12377ade89ee18d9be116436e411e8396898bd70b21ab027c161c785e86238d",
    "zh:aa9e4746ba49044ad5b4dda57fcdba7bc16fe65f696766fb2c55c30a27abf844",
    "zh:adfaee76d283f1c321fad2e4154be88d57da8c2ecfdca9516c8920bd2ece36ed",
    "zh:bf6fbc6d60661c03ed2214173c1deced908dc62480dd41e67ac399fa4abd7467",
    "zh:cb685da03ad00d1a27891f3d366d75e8795ac81f1b427888b434e6832ca40633",
    "zh:e0432c78dfaf2baebe2bf5c0ad8087f547c69c2c5a00e4c1dcd5a6344ce726df",
    "zh:e0ec9ccb8d34d6d0d8bf7f8628c223951832b4d50ea8887fc711fa854b3a28b4",
    "zh:f274397ada4ef3c1dce2f70e719c8ccf19fc4e7a2e3f45d018764c6267fd7157",
  ]
}

コードの意味を簡単に記載すると

  • provider "registry.terraform.io/hashicorp/aws" -> 使用するプロバイダー。今回はAWS。
  • version -> 使用するプロバイダーのバージョン。
  • hashes -> プロバイダーの正当性を確認するためのハッシュ情報を含むリスト。プロバイダーのバイナリファイルの整合性を確認するために使用され、不正な変更や改ざんがないかどうかチェックする。

このような感じです。

おいおい、h1とかzhって何じゃい!と思われるかもしれませんが、そもそも「.terraform.lock.hcl」の内容を詳しく書くだけで記事が書けてしまうので、今回は雑な説明で申し訳ありません。機会があればこの内容に絞って書きます(泣)

↓ 一応わかりやすかった記事や資料をあげておきます。
https://rurukblog.com/post/terraform-lock-hcl/
https://speakerdeck.com/minamijoyo/how-to-update-terraform-dot-lock-dot-hcl-efficiently?slide=18

参考資料まとめ

https://www.terraform.io/
https://www.lac.co.jp/lacwatch/service/20200903_002270.html
https://dev.classmethod.jp/articles/terraform_tfstate_management_tfc/
https://capsulecloud.io/terraform-variable
https://rurukblog.com/post/terraform-lock-hcl/
https://speakerdeck.com/minamijoyo/how-to-update-terraform-dot-lock-dot-hcl-efficiently?slide=18

GitHubで編集を提案

Discussion