Terraformに入門するかー
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
上記の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
まずは,公式がTutorialを出してくれているのでそれに沿ってやっていこう.
Terraformコマンドのタブ補完を有効にする.
terraform -install-autocomplete
TerraformはTerraform Coreと呼ばれるバイナリを中心としており,Terraform CoreはGolangで作られたシングルバイナリである.Terraformの強みはマルチクラウドに対応していることだが,新しいサービスが出るたびにバイナリをアップデートするのは手間すぎるのでプラグイン形式で機能を拡張する.このプラグインをプロバイダー
という(AWS プロバイダーなど).
プロバイダーはTerraform Registryで公開されており,Terraform Coreはコードを解釈して必要なプロバイダーを自動でダウンロードしてくれる.補足としてプロバイダーもGolangで書かれたバイナリである.
TerraformはHCLで記述する.HCLはプログラミング言語でもシリアライズするためのフォーマットでもなく,DSLと呼ばれるカテゴリに属する.DSLは特定の領域を扱いやすくする言語でSQLがその代表例である.HCLはシンプルな記述により,誰が書いても大体同じコードになる(Golangっぽい).
TerraformとAnsibleの棲み分け
- Terraform
- プロビジョニングツール(インフラの自動化に重きを置いている)
- 宣言型
- 冪等性(何度実行しても最終結果が同じになる性質)
- Ansible
- 構成管理ツール(インフラの状態を管理することに重きを置いている)
- 手続き型
とりあえず,下記のコードに対して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
}
}
ディレクトリ配下を見てみると,いくつかのファイルが生成されている.この中でも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を運用する場合はステートファイルをどのように共有するかを考える必要がある.
AWSのアカウントを開設したあとに設定すること.以下の記事を参考に取り組んだ.
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