Terraform超入門

Terraform超入門

最近、Terraformという技術が気になって触ってみたので、超ざっくりまとめます。

Terraformとは

Terraformは、HashiCorp社によってつくられたインフラをコードで管理するツール(IaC)です。

特にAWSやGCPなどのクラウド環境でよく使われていて、
サーバーやネットワークなどの設定を、画面操作ではなくコードで管理できます。


何ができるのか

Terraformを使うと、主に次のことができます。

  • サーバー(EC2など)を作る
  • ネットワーク(VPCやサブネット)を構築する
  • セキュリティ設定を行う
  • 設定の変更を反映する
  • 不要になったリソースを削除する

つまり、インフラの作成・変更・削除をコードでまとめて管理できるのが特徴です。


なぜ使うのか

手作業でクラウドの設定を行うと、以下のような問題が起こりがちです。

  • 設定がバラバラになりやすい
  • 何を作ったか分かりにくい
  • 同じ環境を再現しづらい

Terraformを使うと、次のようなメリットがあります。

  • 設定をファイルとして残せる
  • 同じ構成を何度でも作れる
  • 変更前に差分を確認できる
  • チームでインフラの状態の把握が容易になる

AWSなどの環境でも、管理画面でポチポチ操作するのではなく、
コードだけでインフラをまとめて構築できるようになります。


実際に最小構成でやってみた

Terraformを使ってAWSにEC2を1台立ててみました。(超最小構成)

準備

1. Terraform CLIの準備

まずはTerraformを使うためにCLIをインストールします。
macOSはHomebrew、WindowsはChocolateyでインストールできます。

公式のインストール手順はこちら

macOS

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

Windows(Chocolatey)

choco install terraform

インストール確認

terraform -v

バージョンが出力されればOKです。

2. AWSへの認証情報の設定

TerraformからAWSを使うため、認証情報を設定します。
(TerraformはAWS CLIと同じ認証方法を使います)

export AWS_ACCESS_KEY_ID="あなたのアクセスキー"
export AWS_SECRET_ACCESS_KEY="あなたのシークレットキー"

これでTerraformからAWSにアクセスできるようになります。準備は以上です。


HCLの説明

Terraformの設定ファイルは、HashiCorp独自の設定言語である HCL(HashiCorp Configuration Language) というJSONに似ている言語で記述します。

ファイルの拡張子は .tf で、これらのファイルにインフラの構成を定義していきます。

Terraformは、現在の作業ディレクトリにある .tf ファイルをすべて読み込み、それらを1つの設定としてまとめて扱います。また、リソース同士の依存関係(どれを先に作るべきかなど)も自動的に解決してくれる為ファイルは自由に分けて管理できます。

Terraformの設定は、「ブロック」と呼ばれる単位で記述します(詳しくは後述のコードにて)。


設定ファイルの作成

ディレクトリ構造は以下の通りです。

terraform_demo/
├── terraform.tf
└── main.tf

terraform.tf

Terraform本体とプロバイダーのバージョン指定を行います。

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

  required_version = ">= 1.2"
}

main.tf

具体的なインフラの構成要素を設定します。

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

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
  }

  owners = ["099720109477"]
}

resource "aws_instance" "app_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

  tags = {
    Name = "learn-terraform"
  }
}

簡単に各ブロックの説明

  • terraform: テラフォームとプロバイダーのバージョン指定
  • provider: プロバイダーを操作するための共通の設定(リージョンなど)
  • data: プロバイダーからすでにあるデータを取得するための設定(AMIなど)
  • resource: インフラの構成要素を設定(ここではEC2インスタンスを作成)

TerraformがAWSなどのクラウドを操作するには、どのサービスを使うかを指定する必要があります。
そのために使う仕組みが「provider(プロバイダー)」です。

たとえばAWSを操作したい場合は、aws provider を指定します。
Terraformはこのproviderを通して各クラウドのAPIを呼び出し、
実際にインフラの作成・変更・削除を行います。

使用できるproviderの種類や設定方法、記述方法などは、
Terraform Registry(公式サイト) で確認できます。

「EC2を作りたい」「ネットワークを構築したい」といった場合に、
ここで必要な設定や resource を調べて使っていくイメージです。


コードを反映

作業ディレクトリに移動します。

cd terraform_demo

初期化 (init)

terraform init

コマンドを実行すると、以下の処理が行われます。

  • AWSなどのProviderが .terraform ディレクトリにダウンロードされる。
  • .terraform.lock.hcl が生成され、使用するProviderのバージョンが固定される。

これにより、同じ環境で同じ構成を再現できるようになります。

適用 (apply)

コードを元に変更や新たにインフラを作成します。

terraform apply

コマンドを実行すると、どのようなものが作られるかGitのdiffのように出力されます。

Terraform will perform the following actions:

  # aws_instance.app_server will be created
  + resource "aws_instance" "app_server" {
      + ami           = "ami-09d192ce734c5864c"
      + instance_type = "t2.micro"
      ... (省略) ...
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

    Enter a value: yes

aws_instance.app_server: Creating...
aws_instance.app_server: Still creating... [00m10s elapsed]
aws_instance.app_server: Still creating... [00m20s elapsed]
aws_instance.app_server: Still creating... [00m30s elapsed]
aws_instance.app_server: Creation complete after 33s [id=i-00862e35322b12b33]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

実際に作成していい場合は yes と打ち込みます。
そうすると実際に記述した内容のものが作成されます。AWSコンソールでも無事に作成されていることが確認できました。

【重要】tfstateファイルについて

apply コマンドを実行すると、Terraformは terraform.tfstate というファイルを作成し、現在のインフラの状態をこのファイルで管理するようになります。

次回以降にコードを書き換えて再度 apply をした場合などは、このファイルの状態を見てどのようにインフラを作り直すのか、または削除するのかといった実行計画をTerraformが作成します。

この tfstate ファイルはクラウドの機密情報などが含まれる場合もあるので、Gitなどのバージョン管理ツールにpushしないで安全に保管する必要があります。
(※HCP Terraform(HashiCorp公式のクラウドサービス)などを利用して状態をリモートに保存することで、チームとの連携が容易になり、状態ファイルのセキュリティも維持できます)


これで、コードだけで簡単にインフラを作成できました。
Terraformを使えば一度作った構成はそのまま再利用できるため、別のプロジェクトでも同じ環境をすぐに用意できて便利だなと感じました。

コンソールでの操作手順を覚える必要がなくなり、
インフラ構築をシンプルかつ安全に管理できるようになります。


削除 (destroy)

最後に、作成したインフラを削除します。

terraform destroy

これで作成したリソースを一括でクリーンアップできます。


まとめ

Terraformは、クラウドなどのインフラ環境をコードで管理するためのツールです。

手作業で行っていたインフラ構築をコード化することで、

  • 再現性が上がる
  • 管理しやすくなる
  • ミスを減らせる

といったメリットがあり便利だと思いました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール