お首が長いのよお首が長いのよ

チラシの裏よりお届けするソフトウェアエンジニアとして成長したい人のためのブログ

2022-11-12

Terraform の Quick start tutorial をじっくりやってみた

Terraform とは

Hashicorp 社がオープンソースで提供する IaC サービス。 プラグイン型で、自身が構築したいインフラサービス(AWS, Azure, GCP など)をこのサービスを通じてデプロイ・構成管理できる。

構成管理は .tf ファイルという独自形式のテキストファイルでおこなう。これを使って Terraform を通じてデプロイする。

用語

provider

Terraform の連携先となるサービスプロパイダのこと。AWS, Azure, GCP など。 プロパイダーの一覧は下記に記載がある。 Browse Providers | Terraform Registry

resource

実際に構築するインフラリソースのこと。データベースやサーバーなど。 resource "resource_name" "variable_name" という書き出し。

リソース名には AWS EC2、S3などのインフラを指定する。 具体的な設定内容は resource ブロックの中に記述する。

インストール

プログラミング言語と同じように Terraform にも tfenv というバージョン管理可能なコマンドツールが用意されているが、今回は Homebrew でドキュメントに従ってインストールした。

bash
1% brew tap hashcorp/tap
2
3% brew install hashicorp/tap/terraform
4

バージョンの確認

bash
1% terraform -v
2Terraform v1.3.4
3on darwin_arm64
4

Terraform で ローカルの Docker に nginx コンテナを立ち上げる

Terraform は Docker にも対応している。手元で気軽に .tf ファイルの書き方や挙動を試すだけなら AWS や Azure のようなパブリッククラウドを用意せずとも、その使い勝手の良さを試すことができる。

Qucik start tutorial を参考にコンテナを起動してみる。

tf ファイルの作成

まず、作業用ディレクトリを作成する

bash
1% mkdir learn-terraform-docker-container
2% cd learn-terraform-docker-container
3

main.tf というファイルを作成し、ここにTerraform の設定を記述する

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

provider "docker" {}

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

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

terraform ブロック

required_providers では、どのプロパイダーを扱うか定義する。今回は Docker を扱う。 source の記述形式としては namespace/provider といった形で記述する。 namespace には大体、提供元の企業、団体の名前がくる。 provider は AWS や Azure などのサービス名がくるようだ。

resource ブロック

この .tf ファイルには 2 つのリソースが存在する。Docker のイメージとコンテナに関するものだ。

1 つ目の resource では イメージに対する記述で、nginx イメージ、バージョンを指定する。

2 つ目の resource にはコンテナとしての設定を記述している。利用するイメージ、名前、ポートフォワーディングの設定だ。 イメージ名は 上述の resource と関連があり、 "docker_image" "nginx"というリソース名であれば、 docker_image.nginx.latest

ユニークな ID

resource ブロックの先頭は、 resource type と resource name を記述する。 resource type のプレフィックスは、プロバイダー名に合致する。たとえば今回の場合、 docker_image というリソースタイプが存在しているが、この場合 docker はプロパイダー名にあたる。Terraform は あるリソースを この resource type と resource name を組み合わせて 1つのユニークな ID で管理する。

今回の場合、この Docker イメージ リソースは, type と name を組み合わせて docker_image.nginx になる。

プロジェクトを initialize する

プロジェクトを initialize することで、自動的に Docker プラグインをダウンロードして Terraform と Docker がやりとりできるようになる。

bash
1% terraform init
2

プロビジョニングする

apply コマンドで、nginx コンテナをプロビジョニングする。実行時に作業内容を確認されるので、 yes を入力して実行開始する。

bash
1% terraform apply
2

正常に完了すると、 ブラウザから localhost:8000 にアクセスできるようになる。 nginx の初期画面が確認できるはずだ。

リソースを削除する

destroy コマンドで、作成したリソースを削除できる。大規模になってくるとリソースの削除漏れが思わぬ費用請求に繋がってしまうため、基本的には destroy による削除がよさそう。

bash
1% terraform destroy
2

ためしてみて

Terraform を全く触ったことがなくても、簡単なチュートリアルであれば 30 分とかからずにその挙動を試すことができた。特に Docker を用いたプロビジョニングは費用もかからず、.tf ファイルの書き方を確認するにはとても良いステップになるといえる。

/以上

よかったらシェアしてください!