Terraform プロジェクト初期化から EC2 デプロイまで

Build Infrastructure | Terraform | HashiCorp Developer を参考に、Terraform のプロジェクト初期化から EC2 デプロイまでの手順を記す。

定義ファイルを作る。

touch main.tf

定義する。 version関連は先述のチュートリアルのコピペ。 AMI はCLIで2023.01.21時点での最新のものを取得。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_instance" "app_server" {
  ami           = "ami-0b8b7786ce75a2b4f"
  instance_type = "t2.micro"

  tags = {
    Name = "ApplicationServer"
  }
}

AMI は下記で取得。

よく使うOSの最新AMI IDを一撃で取得する | DevelopersIO を参考にした。

aws ssm get-parameters --names \
  /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query "Parameters[].{Value:Value, LastModifiedDate:LastModifiedDate}"

設定ファイルなどを作る。

terraform init

main.tfを作る前に実行すると下記のエラーとなる。

バージョン管理ファイル生成などが行われるから先に定義ファイルがあることが前提?

バージョン管理対象から除外する時にも同コマンドを実行するらしい。

Terraform initialized in an empty directory!

The directory has no Terraform configuration files. You may begin working
with Terraform immediately by creating Terraform configuration files.

整形して、バリデーションもかける。

terraform fmt
terraform validate

デプロイする!

terraform apply

雑に存在チェック。

aws ec2 describe-instances 
  --query 'Reservations[*].Instances[*].Tags[?Value==`ApplicationServer`]'

確認できたら掃除しましょうね。

terraform destroy

所感としては Yaml よりは読みやすそう。

整形、バリデートが標準であるのは強い。(精度はまだわからん)

状態ファイルの読み方も慣れないと運用は辛そう。

apply より deploy が良い...。

apply 慣れしていないので go-task で実行するための Taskfile 作りました。

version: '3'

tasks:
  latest-ami:
    cmds:
      - aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query "Parameters[].{Value:Value, LastModifiedDate:LastModifiedDate}"

  deploy:
    cmds:
      - terraform apply

  destroy:
    cmds:
      - terraform destroy

  validate:
    cmds:
      - terraform validate

  fmt:
    cmds:
      - terraform fmt