Open10

Terraformに入門するかー

komugi8komugi8

Terraformを学習する様子を記録として残すことが目的です.ドキュメントとか読みつつ手探りでやっていきます.効率よくTerraformを学習するスクラップではありません.

複数プロジェクトで異なるTerraformのバージョンを使用することが考えられるので,Terraformのバージョン管理ツールであるtfenvをインストールする.

brew install tfenv

確認

tfenv
tfenv 3.0.0
Usage: tfenv <command> [<options>]

Commands:
   install       Install a specific version of Terraform
   use           Switch a version to use
   uninstall     Uninstall a specific version of Terraform
   list          List all installed versions
   list-remote   List all installable versions
   version-name  Print current version
   init          Update environment to use tfenv correctly.
   pin           Write the current active version to ./.terraform-version

https://github.com/tfutils/tfenv

komugi8komugi8

上記のCommandsを見てみると,tfenv list-remoteでインストールできるバージョンのリストが見れそうなので見てみる.

tfenv list-remote
1.12.0-rc1
1.12.0-beta3
1.12.0-beta2
1.12.0-beta1
1.12.0-alpha20250319
1.12.0-alpha20250312
1.12.0-alpha20250213
1.11.4
1.11.3
1.11.2
1.11.1

1.11.4が最新の安定版っぽいので指定してインストールする.

tfenv install 1.11.4
Installing Terraform v1.11.4
Downloading release tarball from https://releases.hashicorp.com/terraform/1.11.4/terraform_1.11.4_darwin_arm64.zip
###################################################################################################################################################################################################### 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.11.4/terraform_1.11.4_SHA256SUMS
Not instructed to use Local PGP (/opt/homebrew/Cellar/tfenv/3.0.0/use-{gpgv,gnupg}) & No keybase install found, skipping OpenPGP signature verification
Archive:  /var/folders/fg/cv46x_952y57jw0vqxnhgdpc0000gn/T/tfenv_download.XXXXXX.AeiAz3aczi/terraform_1.11.4_darwin_arm64.zip
  inflating: /opt/homebrew/Cellar/tfenv/3.0.0/versions/1.11.4/LICENSE.txt  
  inflating: /opt/homebrew/Cellar/tfenv/3.0.0/versions/1.11.4/terraform  
Installation of terraform v1.11.4 successful. To make this your default version, run 'tfenv use 1.11.4'

v1.11.4をデフォルトバージョンとして使用する.

tfenv use 1.11.4
Switching default version to v1.11.4
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.11.4

できてそう

terraform --version
Terraform v1.11.4
on darwin_arm64
komugi8komugi8

まずは,公式がTutorialを出してくれているのでそれに沿ってやっていこう.
Terraformコマンドのタブ補完を有効にする.

terraform -install-autocomplete
komugi8komugi8

TerraformはTerraform Coreと呼ばれるバイナリを中心としており,Terraform CoreはGolangで作られたシングルバイナリである.Terraformの強みはマルチクラウドに対応していることだが,新しいサービスが出るたびにバイナリをアップデートするのは手間すぎるのでプラグイン形式で機能を拡張する.このプラグインをプロバイダーという(AWS プロバイダーなど).
プロバイダーはTerraform Registryで公開されており,Terraform Coreはコードを解釈して必要なプロバイダーを自動でダウンロードしてくれる.補足としてプロバイダーもGolangで書かれたバイナリである.

komugi8komugi8

TerraformはHCLで記述する.HCLはプログラミング言語でもシリアライズするためのフォーマットでもなく,DSLと呼ばれるカテゴリに属する.DSLは特定の領域を扱いやすくする言語でSQLがその代表例である.HCLはシンプルな記述により,誰が書いても大体同じコードになる(Golangっぽい).

komugi8komugi8

TerraformとAnsibleの棲み分け

  • Terraform
    • プロビジョニングツール(インフラの自動化に重きを置いている)
    • 宣言型
    • 冪等性(何度実行しても最終結果が同じになる性質)
  • Ansible
    • 構成管理ツール(インフラの状態を管理することに重きを置いている)
    • 手続き型
komugi8komugi8

とりあえず,下記のコードに対してterraform initしてterraform applyをしてみる.
localhost:8000でnginxが立ち上がっているのを確認.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  ports {
    internal = 80
    external = 8000
  }
}
komugi8komugi8

ディレクトリ配下を見てみると,いくつかのファイルが生成されている.この中でもTerraformの命とも言えるステートファイルについて見てみる.
terraform.tfstateはJSON形式のファイルで構築・管理しているインフラの状態を記述している.このファイルはステートファイルと言い,大きく以下の三つの役割を果たしている.

  • 実際の環境とTerraformとの紐付け
  • 依存関係などのメタデータの格納
  • 変更部分のみリクエストを送ることによるパフォーマンスの向上
ls -al
total 40
drwxr-xr-x@ 7 komugi8  staff   224 May  5 00:36 ./
drwxr-xr-x@ 3 komugi8  staff    96 May  5 00:26 ../
drwxr-xr-x@ 3 komugi8  staff    96 May  5 00:30 .terraform/
-rw-r--r--@ 1 komugi8  staff  1337 May  5 00:30 .terraform.lock.hcl
-rw-r--r--@ 1 komugi8  staff   386 May  5 00:29 main.tf
-rw-r--r--@ 1 komugi8  staff   181 May  5 00:36 terraform.tfstate
-rw-r--r--@ 1 komugi8  staff  4412 May  5 00:36 terraform.tfstate.backup

先ほども言ったようにすごく大事なファイルなので,チームでTerraformを運用する場合はステートファイルをどのように共有するかを考える必要がある.

komugi8komugi8

AWS CLIのインストール

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

確認

aws --version

マネジメントコンソール上でアクセスキーを追加して,取得したアクセスキーを以下のように設定する(aws configureで対話的に設定することもできる).

export AWS_ACCESS_KEY_ID=<アクセスキー>
export AWS_SECRET_ACCESS_KEY=<シークレットキー>

確認

aws configure list