🀄

Terraformに入門する

2023/09/06に公開

Terraformとは

TL;DR

  • AWS|Azure|GCPとマルチクラウド対応
  • オープンソースでコミュニティが熱い
  • 抽象化されたレイヤーが少なく、コードが冗長になりがち

Terraformのインストール

公式ドキュメントを参考にインストールする

当方はMacでHomebrewを利用するため、以下のコマンドを実行した。

terminal
brew tap hashicorp/tap
brew install hashicorp/tap/terraform

エディタVSCodeを利用している場合、以下の拡張機能も入れておく。

https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

Terraformのチュートリアルを試す準備

公式チュートリアルを参考に進める。
まずはGitHubリポジトリを用意しておく。
当方は、GitHub CLIを利用してリポジトリを作成する。

terminal
gh repo create terraform-sandbox --public
gh repo clone terraform-sandbox

Dockerを起動しておく

terminal
open -a Docker

次に main.tf というファイルを作成する。

terminal
touch main.tf

main.tf にコードを記述する

main.tf
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
  }
}

基本コマンドをチュートリアルを通して理解する

公式ドキュメントを参考に手を動かします。

https://developer.hashicorp.com/terraform/tutorials/docker-get-started/install-cli

terraform init

作業ディレクトリにてTerraformを使えるように準備するコマンド。

terminal
terraform init

なんやらディレクトリやファイルが作られることを確認できます。

terraform plan

リソースを作成する前にどんなリソースが作られるか確認するコマンド

terminal
terraform plan

なんかエラーが・・・

terminal
Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on main.tf line 10, in provider "docker":10: provider "docker" {}

こちらの記事を参考にmain.tfを修正

main.tf(修正後)
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {
  host = "unix:///Users/<ユーザ名>/.docker/run/docker.sock"
}

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 plan を実行するとTerraformによって生成されるリソースの一覧が出てきます。

terraform apply

Terraformによるリソース作成を実行するコマンド

terminal
terraform apply

実行してよいか聞かれるので、yesと入力する

1分ほどかかって無事に完了。

Dockerコンテナが立ち上がっています。

一応ブラウザで確認するとNginxの初期ページが表示されている。

terraform destroy

リソースを削除するコマンド

terminal
terraform destory

実行してよいか聞かれるので、yesと入力する

先程つくったリソース(Dockerコンテナ)が一瞬で消えた。

おわりに

確かにAWS CDKでリソースを作成するよりもコード冗長にはなります。
が、将来マルチクラウドを視野にいれるならTerraformいいですね。
Terafformは難しそうで食わず嫌いしていましたが、なんだかできそうな気がする〜〜(?)

以上です。

Discussion