現場実践|Terraform中級

Terraform実践中級編|tfstateの管理・モジュール設計・CIでのterraform plan自動化

「Terraformの基礎は分かったが本番環境での運用方法が分からない」——TerraformのS3リモートstateバックエンド・DynamoDBによる状態ロック・モジュール化・GitHub ActionsでのPR時plan自動化を解説します。

読了目安:約18分更新日:2026年3月

💡 ローカルにtfstateを置いてTerraformを運用するのはチーム開発では即座にNG。S3+DynamoDBのリモートバックエンドへの移行とモジュール設計がチームでのTerraform運用の第一歩です。

この記事を書いた人
現役ITエンジニア・IT講師(経験14年)
CCNA・CCNP 取得LPIC-1 保有SES現場を複数経験

Terraformを使ったAWS環境のIaC化を複数プロジェクトで担当してきた立場から解説します。

1. S3リモートバックエンドの設定

terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket"
    key            = "production/terraform.tfstate"
    region         = "ap-northeast-1"
    encrypt        = true
    dynamodb_table = "terraform-state-lock"
  }
}

# S3バケットとDynamoDBテーブルを先に作成
# aws s3api create-bucket --bucket my-terraform-state-bucket \
#   --region ap-northeast-1 \
#   --create-bucket-configuration LocationConstraint=ap-northeast-1
# aws dynamodb create-table --table-name terraform-state-lock \
#   --attribute-definitions AttributeName=LockID,AttributeType=S \
#   --key-schema AttributeName=LockID,KeyType=HASH \
#   --billing-mode PAY_PER_REQUEST

2. モジュール設計のベストプラクティス

  • 再利用可能なモジュールを作る:「EC2+セキュリティグループ+IAMロール」のようなよく使う組み合わせをモジュール化して複数環境で再利用する
  • 環境別の変数ファイルを作る:modules/・envs/dev・envs/prod のディレクトリ構成で環境間の設定差分をvariables.tfで管理する
  • tfvarsファイルをgitignoreに追加:シークレット情報を含むterraform.tfvarsはGitにコミットしない。AWS Secrets ManagerやSSMパラメータストアで管理する

3. GitHub Actionsでterraform planを自動化

name: Terraform Plan
on: pull_request

jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789:role/github-tf
          aws-region: ap-northeast-1

      - name: Terraform init
        run: terraform init

      - name: Terraform plan
        run: terraform plan -no-color 2>&1 | tee plan.txt

      - name: Comment PR with plan
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require("fs");
            const plan = fs.readFileSync("plan.txt", "utf8");
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: "## Terraform Plan\n" + plan
            });
📌 この記事のポイント
  • S3+DynamoDBのリモートバックエンドでtfstateを複数人で安全に管理する
  • modules/・envs/ディレクトリ構成でモジュールを環境別に再利用するのがTerraformのベストプラクティス
  • GitHub Actionsでターゲット時にterraform planを実行してPRコメントに表示するCI設定が実務標準

キャリアの疑問、一緒に解決しませんか?

Route Bloomでは、インフラ系ITエンジニアを目指す方への個別サポートを行っています。2026年7月からフリーランス講師として本格始動予定です。

※Terraformのバージョンにより構文が異なります。公式ドキュメントもご参照ください。

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:経営/個人事業/アパレル