kadowaki のプロフィール画像@kadowaki

投稿日
2023/03/30

Terraform 超入門

概要

S3 Bucket を作成するだけの簡単な例を通じて terraform に触れる。

Terraform インストール

macOS 以外の人は自分で調べてください。

brew install tfenv

tfenv install 1.3.7
tfenv use 1.3.7

実行

適当なディレクトリを作成しそこに移動したのち、 main.tf (後述) を内容も含めて作成してください。
この段階で main.tf の中身を読んで内容を把握してください。実のところ main.tf がこのブログのメインコンテンツです。
ドキュメント1も同時に参照するとよいでしょう。

(実のところファイル名の縛りはないので名前は何でもいいです。ファイル分割も自由に行なえます。今回は全部一つのファイルに纏めていますが。)

ディレクトリを初期化します。 これによってプロバイダーの実体がダウンロードされたり、ロックファイルが作成されるなどします。

terraform init

terraform plan で State ファイルとの差分を確認します。

terraform plan -var="yourname=onamae"

コマンドが終了するまで待ちましょう。Ctrl-C などでコマンドを中断してはいけません (他のコマンドも同様)。

terraform apply で State ファイルを変更すると同時に、State ファイルの内容に合わせて実際のリソースが変更されます。

terraform apply -var="yourname=onamae"

最後に作ったリソースを破棄します

terraform destroy -var="yourname=onamae"

参考

main.tf

# 基本設定
terraform {
  # terraform のバージョン
  required_version = ">= 1.3.7"

  # バックエンドの指定 (State ファイルの置き場の指定)
  #   State は REAL resources の状態をファイルとして管理するレイヤー
  #   HCL (.tf file) <-> State (.tfstate file) <-> REAL resources のような関係
  #   ここでは local にしているが、他に remote や s3 などを指定できる
  #   詳しくは「terraform state」などで調べてください
  backend "local" {
    path = "terraform.tfstate"
  }

  # プロバイダーの指定
  #   プロバイダーというのはプログラミングにおけるライブラリに相当するもの
  #   aws プロバイダーを使うことで terrafrom で AWS リソースを扱えるようになる
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.50.0"
    }
  }
}

# プロバイダーごとの設定
#   aws プロバイダーにおいて、profile や secret_key の設定を省略すると、
#   `~/.aws/` の default プロファイルが読まれます (ここでは省略しています)
#   プロファイルを切り替えたい場合は `AWS_PROFILE=xxxxx terraform cmd` のように環境変数で指定できます
provider "aws" {
  region = "ap-northeast-1"

  default_tags {
    tags = {
      createdby = var.yourname
    }
  }
}

# リソース定義
#   今回は S3 Bucket を作成します
#   resource <リソースタイプ> <ローカルネーム>
#     ローカルネームはワークスペース内で同一のリソースタイプのリソース同士で衝突しなければ何でもいいです
#     リソースを他から参照するための識別子としての役割しか多分持ちません
resource "aws_s3_bucket" "test" {
  bucket_prefix = "test-s3bucket-${var.yourname}"
}

# 作成されたリソースの情報を出力するための設定
#   今回 S3 Bucket はバケット名のプレフィックスのみ指定してその後にランダム文字列が続くのでリソースが作成されるまで値が確定しない
#   この値をリソース作成時に出力して確認することができる
#   (output はその他にも異なるワークスペースからリソースを参照できるようモジュールの export のような役割として使ったりもします)
output "bucket_name" {
  value = aws_s3_bucket.test.bucket
}

# 変数の設定
#   variable 変数は実行時に外から与えます
#   変数を与える一つの方法として `-var` オプションが使えます
#     `terraform paln -var="yourname=anatano.namae"` というように
variable "yourname" { type = string }
0