【第1回】Terraform × AWS インフラ自動化入門 — Terraformとは何か?インストールからHello AWS(EC2起動)まで

テックツール

「インフラをコードで管理する」って言葉、最近よく聞くけど実際どうやるんだろう——そう思って調べたら、Terraformにたどり着きました。今回からシリーズで、TerraformとAWSを組み合わせたインフラ自動化を順番に追っていきます。

シリーズ全体の構成はこんな感じで考えています。

  • 第1回(本記事):Terraformとは? インストールからEC2起動まで
  • 第2回:変数・outputs・tfstateの管理
  • 第3回:モジュール化とファイル分割
  • 第4回:GitHub Actions × Terraformで自動デプロイ

自分自身、これまでAWSはマネコンやBoto3(Python SDK)でなんとかしてきたんですが、構成が複雑になってくると「どこに何を作ったかわからなくなる問題」が慢性化してきたんですよね。Terraformはその辺を解決してくれそう、という期待込みで入門してみます。

この記事でわかること

  • Infrastructure as Code(IaC)とTerraformの基本概念
  • Terraformのインストール方法(tfenvを使った管理)
  • AWS CLIの設定とIAM権限の設定
  • HCLでEC2インスタンスを定義するコード例
  • terraform init / plan / apply / destroy の実行フロー

Terraformとは何か

TerraformはHashiCorpが開発したInfrastructure as Code(IaC)ツールです。要は「インフラの構成をコードで書いて、コマンド一発で作ったり壊したりできるもの」です。

設定ファイルはHCL(HashiCorp Configuration Language)という独自言語で書きます。JSONに近い感じで、慣れると読み書きしやすいです。

似たポジションのツールとしてAWS CloudFormationがありますが、TerraformはAWSだけでなくAzureやGCP、GitHub、Datadogなど、複数のクラウドプロバイダーに対応しているため、マルチクラウド環境においても構築手段を統一できます。個人的にはAWSオンリーで当面は困らないんですが、「将来的にマルチクラウドになっても書き方を変えなくていい」というのは確かに魅力です。

大まかなワークフローはこの3ステップです。

  • terraform plan:「これから何を作る/変える/消す」を確認する
  • terraform apply:実際に適用する
  • terraform destroy:作ったリソースをまとめて削除する

この「applyする前にplanで確認できる」のが地味に安心感あります。マネコンでうっかりクリック連打して意図しないリソースを作るミスが自分は多いので……。

インストール(Mac / tfenv使用)

Terraformはバージョン管理が重要です。チームやプロジェクトごとにバージョンが違うことがよくあるので、最初からバージョン管理ツールのtfenvを使う習慣をつけておくのがおすすめです。

余談ですが、Pythonでいうpyenvみたいなものだと思えばイメージしやすいです。

# tfenvをインストール
brew install tfenv

# 利用可能なバージョン一覧を確認
tfenv list-remote

# 最新版をインストール(「最新」は変わるので、まずは list-remote で確認するのが安全です)
tfenv install latest

# 使用するバージョンを指定
tfenv use latest

# 確認
terraform version

Terraformを使う際、バージョンを固定管理することは重要です。チームで使う場合はプロジェクトルートに.terraform-versionというファイルを置いておくと、tfenvがそのバージョンを使う運用ができます。

macOSならbrew install terraformで直接インストールもできますが、後々バージョンを切り替えたくなるのでtfenv経由の方が無難だと思います。

AWS側の準備(IAMとCLI設定)

TerraformからAWSを操作するには、認証情報が必要です。AWS CLIがインストール済みであれば、以下で設定できます。

aws configure

アクセスキーIDとシークレットアクセスキー、デフォルトリージョン(今回はap-northeast-1)を入力すればOKです。

IAMユーザーに付与する権限については、本番環境では最小権限の原則に従い、必要最低限の権限のみを付与します。今回のハンズオンではEC2を触るのでAmazonEC2FullAccessがあれば動きます。本番では絶対にやらないですが、個人の練習用なら一旦これで。

アクセスキーの扱いには本当に気をつけてください。流出すると不正利用による高額請求のリスクがあります。絶対にGitHubに上げないように。.gitignore*.tfvars.terraform/を入れておくのは最低限やっておきましょう。

# .gitignore
.terraform/
*.tfstate
*.tfstate.*
*.tfvars

初めてのtfファイルを書く

Terraformの設定ファイルは拡張子.tfで作ります。今回は練習用のディレクトリを作って、シンプルにEC2を1台立ち上げるだけのコードを書いてみます。

mkdir hello-terraform && cd hello-terraform

ファイル構成はこんな感じです。

hello-terraform/
├── main.tf        # リソース定義
├── variables.tf   # 変数定義
└── outputs.tf     # 出力値

まずmain.tfから。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"  # 6系の最新マイナーバージョンを自動で使用
    }
  }
  required_version = ">= 1.14.0"
}

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

# Amazon Linux 2023のAMI(ap-northeast-1)
data "aws_ami" "amazon_linux_2023" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

resource "aws_instance" "hello" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = var.instance_type

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

terraformブロックは、Terraformと使用するプロバイダー(AWS)のバージョンを指定しています。~> 6.0と書いておくと、AWS Providerの6系の中で自動的に新しいマイナーバージョンを利用します。

data "aws_ami"はデータソースで、既存のAWSリソース情報を参照するためのものです。ここではAmazon Linuxの最新AMIを自動検索しています。AMI IDをハードコーディングするのではなく、この方法で動的に取得する習慣をつけておくと、後々の保守が楽になります。

次にvariables.tf

variable "instance_type" {
  description = "EC2インスタンスタイプ"
  type        = string
  default     = "t3.micro"
}

変数を定義しておくことで、同じコードを異なる値で何度も使える再利用性が生まれます。本記事ではt3.microをデフォルトにしていますが、これはAWS無料枠の対象インスタンスタイプです。

最後にoutputs.tf

output "instance_id" {
  description = "作成されたEC2のインスタンスID"
  value       = aws_instance.hello.id
}

output "public_ip" {
  description = "パブリックIPアドレス"
  value       = aws_instance.hello.public_ip
}

outputsブロックはapply後に表示される値を定義します。インスタンスIDやパブリックIPなど、後で手動でコンソールに確認しなくても済むよう出力します。

terraform init → plan → apply を実行する

コードが書けたら、いよいよ実行です。

terraform init

terraform init

initを実行するとTerraformの初期化が行われ、必要なプロバイダー情報やプラグインをインストールします。.terraformディレクトリと.terraform.lock.hcl(lockファイル)が自動作成されます。初回は少し時間がかかります。

terraform plan

terraform plan

実際にリソースを作る前に、「何が作られるか」を確認できます。+マークがついているのが新しく作成されるリソースです。planの出力をちゃんと読む習慣をつけると事故が減ります(自分への戒め)。

terraform apply

terraform apply

確認プロンプトが出るのでyesと入力すれば実行されます。しばらくするとEC2インスタンスが立ち上がって、outputsに定義したインスタンスIDとパブリックIPが表示されます。

applyを実行するとterraform.tfstateが自動作成されます。tfstateには、実行で作成されたリソース内容が全て書き込まれています。以降Terraformはtfstateファイルを参照して、リソースの差分確認(追加リソースの作成や削除)を行います。

このtfstateファイルの管理がわりと重要で、複数人で使う場合はS3に置くのが定番です。その辺は第2回で詳しく触れます。

terraform destroy(後片付け)

terraform destroy

練習が終わったら忘れずに。EC2を放置すると課金が続くので、これだけは必ず実行してください。コマンド1つで作ったリソースをまとめて消せるのはTerraformの大きな利点です。

※この記事にはプロモーションが含まれます

ちなみに、お名前.com レンタルサーバー(WordPressに特化した高速レンタルサーバー。月額990円〜、独自ドメイン実質0円)も気になっています。お名前.com レンタルサーバー

まとめ

今回はTerraformの概念の確認からインストール、EC2を1台立ち上げるまでを一通りやってみました。「コードを書いてapplyするとAWSにリソースが生えてくる」という感覚がなんとなくつかめたと思います。

正直、HCLの書き方はまだ手探り感があります。特にdata sourceの使い方(AMIを動的に取得する部分)は、もっとうまい書き方がある気がしています。

次回は、変数や出力値の扱い方、そしてtfstateファイルをチーム運用する方法について詳しく見ていく予定です。

📚 シリーズ「Terraform × AWS インフラ自動化入門」(第1回 / 全4回)

→ 次回の記事: 公開後にリンクが追加されます

参考になったらクリックしてもらえると嬉しいです!

Blogmura NetDev Ranking
タイトルとURLをコピーしました