このセッションで学ぶこと

1
Infrastructure as Code の概念と価値 手動構築とコード管理を比較し、IaCがもたらす再現性・監査可能性・速度を理解します
2
Terraform のワークフローと主要概念 Write/Plan/Apply/Destroy の4段階と、Provider/Resource/Module/State の関係を把握します
3
Docker の基本とマルチステージビルド Image/Container/Registry の関係を理解し、本番向け軽量イメージの構築手法を学びます
4
AIによるコード生成とセキュリティチェック HCLやDockerfileのAI生成フロー、Trivy/Snykによるイメージスキャンの実践を確認します

1. Infrastructure as Code の概念と価値

インフラ構築を手作業で行う時代は終わりつつあります。サーバーの設定をコードで記述し、バージョン管理し、レビューし、自動適用する。これがInfrastructure as Code(IaC)の考え方です。ソフトウェア開発のベストプラクティスをインフラ管理に持ち込むアプローチと言い換えられます。

Before: 手動構築
  • AWSコンソールでポチポチとリソースを作成
  • 手順書はExcelやWiki、しかも最新かどうか不明です
  • 担当者によって微妙に設定が違います
  • 「本番環境を再現して」と言われると数日かかります
  • 変更履歴が追えません。誰がいつ何を変えたか不明です
  • 障害復旧はベテランの記憶頼み
After: IaC(コード管理)
  • HCLファイルにリソースを宣言的に定義
  • Gitでバージョン管理、PRレビューで変更を承認
  • 同じコードから常に同じ環境が再現されます
  • terraform apply 1コマンドで環境が立ち上がります
  • git log で変更履歴が完全に追跡できます
  • 障害時もコードから環境を再構築できます
効果の数値を表示
環境構築時間
90%削減
手動: 数日〜数週間
IaC: 数分〜数十分[DORA Report]
構成ドリフト
71%削減
コード管理による一貫性確保
標準化インフラ実装での実測値[WJAETS 2025]
復旧時間
80%削減
コード再適用による即時復旧
Eliteチームは1時間未満で復旧[DORA Report]

2. Terraform ワークフロー全体図

Terraform の作業は4つのフェーズで回ります。コードを書き(Write)、差分を確認し(Plan)、適用し(Apply)、不要になったら破棄する(Destroy)。Plan で変更内容を事前に確認できるのが最大の安全弁です。

Write
HCLコード記述
Plan
差分を事前確認
Apply
インフラに適用
Destroy
リソース破棄
フェーズ コマンド 実行内容 注意点
Write - HCLファイルにリソースを宣言します。Provider(AWS, GCP等)とリソースタイプを指定します モジュール化で再利用性を高めます
Init terraform init Providerプラグインのダウンロード、Backend(State保存先)の初期化を行います プロジェクト初回と Provider 追加時に実行します
Plan terraform plan 現在のStateとコードの差分を計算し、追加/変更/削除されるリソースを表示します 本番適用前に必ず確認します。CI/CDで自動実行が推奨されます
Apply terraform apply Planの内容をクラウドに適用します。実際にリソースが作成・変更・削除されます 本番は承認フロー必須です。-auto-approve は開発環境のみで使用します
Destroy terraform destroy 管理している全リソースを削除します。開発・検証環境のクリーンアップに使います 本番環境では原則使用禁止です。部分削除は targeted destroy で行います

3. Terraform 主要概念マップ

Terraform を構成する5つの概念を押さえておきます。Provider がクラウドAPIとの接続口、Resource が個々のインフラ部品、Module が再利用可能なパッケージ、State が現在の状態記録、Backend がStateの保存先です。

Terraform Configuration (.tf)
|
ProviderAWS, GCP, Azure 等
クラウドAPIの接続定義
|
ResourceEC2, S3, VPC 等
個々のインフラ部品
|
Module再利用可能なパッケージ
複数Resourceをまとめる
State File
現在のインフラ状態を記録
tfstate ファイル
←→
Backend
State の保存先
S3, GCS, Terraform Cloud
実際のクラウドリソース
AWS EC2, RDS, VPC...
Providerを通じて操作
概念 役割 具体例 管理の要点
Provider クラウドサービスへの認証と接続 aws, google, azurerm(3,000以上のProviderが公開) バージョン固定(required_providers)で安定性を確保します
Resource 作成・管理するインフラ部品の定義 aws_instance, aws_s3_bucket 命名規則をチームで統一します
Module 複数Resourceをまとめた再利用単位 VPCモジュール, ECSモジュール Terraform Registry に公式モジュールがあります
State 現在のインフラ状態と設定値の記録 terraform.tfstate ローカル保存は避けます。リモートBackend必須です
Backend Stateファイルの保存・ロック制御 S3 + DynamoDB, Terraform Cloud チーム開発ではロック機構が必要です

4. AIによるHCLコード生成のフロー

Terraform のHCLコードをゼロから書くのは手間がかかります。AIに要件を伝えてひな型を生成させ、人間がレビューして Plan で安全確認し、Apply で適用する。このフローが現実的な使い方になります。

1
要件を自然言語で記述
「VPC 1つ、パブリックサブネット2つ、プライベートサブネット2つ、NATゲートウェイ1つ、東京リージョン」のように構成要件を伝えます。CIDR範囲やタグ命名規則も含めると精度が上がります。
2
AIがHCLコードを生成
LLMがProvider定義、Resource定義、変数定義、Output定義を含むHCLファイルを生成します。モジュール分割の提案も可能です。
3
人間がレビュー
セキュリティグループのルール、IAMポリシーの権限範囲、リソースのサイジングを確認します。AIは過剰に開放的なルール(0.0.0.0/0 へのフルアクセス等)を生成しがちなので要注意です。
4
terraform plan で差分確認
作成されるリソースの数と種類を確認します。想定外のリソースが含まれていないか、既存リソースへの影響がないかを確認します。
5
terraform apply で適用
問題なければ適用します。本番環境ではCI/CDパイプライン経由の承認フロー(PR承認後に自動apply)が推奨されます。
# AIが生成したHCLコード例(VPCモジュール)
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true

  tags = {
    Name = "${var.project}-vpc"
    Environment = var.environment
    ManagedBy = "terraform"
  }
}

resource "aws_subnet" "public" {
  count = length(var.public_subnet_cidrs)
  vpc_id = aws_vpc.main.id
  cidr_block = var.public_subnet_cidrs[count.index]
  availability_zone = var.azs[count.index]

  tags = {
    Name = "${var.project}-public-${count.index + 1}"
  }
}

AIが生成するHCLコードの品質は高いですが、セキュリティ周りの設定は人間の確認が必須です。特にIAMポリシーの「*」(ワイルドカード)指定、セキュリティグループのインバウンドルール、S3バケットのパブリックアクセス設定は要確認です。

5. Docker の基本アーキテクチャ

Docker は「アプリケーションとその実行環境をパッケージにして持ち運べる」技術です。Dockerfileからイメージを作り、イメージからコンテナを起動し、イメージはRegistryで共有します。この3つの関係を押さえれば、Docker の全体像が見えます。

Dockerfile
ビルド手順書
テキストファイル
⟶ build
Image
読み取り専用テンプレート
レイヤー構造
⟶ run
Container
実行中のインスタンス
書き込み可能レイヤー
↑ push / pull ↓
Registry
Docker Hub, ECR, GCR, GHCR
イメージの保管・配布
概念 役割 ライフサイクル ポイント
Dockerfile イメージのビルド手順をコードで記述 開発者が作成 → Gitで管理 1行1レイヤーです。命令の順序がキャッシュ効率に影響します
Image コンテナのテンプレート(読み取り専用) build → tag → push → pull 軽量なベースイメージ(Alpine, Distroless)を推奨します
Container Imageから作られた実行中のプロセス run → stop → rm 使い捨て前提です。データはVolumeに永続化します
Registry Imageの保管・配布サービス push(アップロード)/ pull(ダウンロード) プライベートRegistryで社内イメージを管理します

6. マルチステージビルドの図解

本番環境にビルドツールやソースコードは不要です。マルチステージビルドを使えば、ビルド用ステージで成果物を作り、ランタイム用ステージには成果物だけをコピーできます。イメージサイズが劇的に小さくなります。

Build Stage
- Node.js + npm
- ソースコード一式
- devDependencies
- TypeScriptコンパイラ
- ビルド成果物 (dist/)

Size: ~1.2 GB
Runtime Stage
- Node.js (Alpine)
- ビルド成果物 (dist/) のみ
- production dependencies のみ


Size: ~150 MB
イメージサイズ削減
87%
1.2GB → 150MB
プル時間とストレージコストを大幅削減(Node.jsアプリの典型的な例)
攻撃対象面
縮小
ビルドツール・ソースコードが
本番イメージに含まれない
起動時間
高速化
軽量イメージは
コンテナ起動が速い
# マルチステージビルドの Dockerfile 例

# --- Build Stage ---
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# --- Runtime Stage ---
FROM node:20-alpine
WORKDIR /app
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]

7. AIによるDockerfile生成と安全チェック

Dockerfileの生成もAIに任せられます。ただし、AIが生成するDockerfileにはセキュリティ上の問題が含まれがちで、そのまま使うのは危険です。生成後にセキュリティチェックを通すフローを標準にします。

要件記述
言語・FW・ポート
AI生成
Dockerfile出力
人間レビュー
セキュリティ確認
ビルド&スキャン
Trivy / Snyk
Registry Push
本番デプロイ

コンテナセキュリティチェックリスト

1
ベースイメージは公式かつ軽量なものを使います(Alpine, Distroless, Chainguard)。latest タグは避け、バージョンを固定します
2
root ユーザーで実行しません。USER 命令で非特権ユーザーに切り替えます
3
シークレット(APIキー、パスワード)をDockerfileに書きません。ビルド時はBuildKitのsecretマウント、実行時は環境変数またはSecrets Managerを使います
4
不要なパッケージを入れません。ビルドに必要なツールはマルチステージビルドのビルドステージに閉じ込めます
5
.dockerignore を設定します。.git, node_modules, .env, テストファイルなどをイメージに含めません
6
COPY の範囲を最小限にします。COPY . . ではなく、必要なファイルだけを明示的にコピーします
7
HEALTHCHECK 命令を定義します。オーケストレーターがコンテナの生死を判断するために必要です
8
ポートの公開は最小限にします。EXPOSE で必要なポートだけを宣言します

8. Trivy / Docker Scout / Snyk によるイメージスキャンパイプライン

コンテナイメージの脆弱性スキャンはCI/CDパイプラインに組み込みます。ビルド直後にスキャンし、Critical/High の脆弱性が見つかればデプロイを停止します。これを自動化すれば、脆弱なイメージが本番に到達することを防げます。Docker Scout はDocker Desktop に統合されたスキャン機能で、開発中のローカルスキャンにも使えます。

1
docker build でイメージをビルド
Dockerfileからイメージを作成します。ビルドキャッシュを活用して高速化します。
2
Trivy / Snyk でスキャン
イメージ内のOSパッケージ、言語パッケージ(npm, pip等)、設定ファイルの脆弱性を検出します。CVE番号と対応バージョンが報告されます。
3
重大度に基づく判定
Critical / High の脆弱性が存在する場合、パイプラインを失敗させます。Medium以下は報告のみで通過を許可するケースが多いです。
4
Registry Push / デプロイ
スキャンをパスしたイメージだけがRegistryにプッシュされ、本番デプロイの対象になります。
ツール 特徴 料金 CI/CD統合
Trivy Aqua Security製のOSSです。高速で、コンテナイメージ、ファイルシステム、IaCファイルをスキャンできます 無料 GitHub Actions, GitLab CI, Jenkins 対応
Docker Scout Docker公式のセキュリティスキャンです。Docker Desktop統合で、SBOM生成とリアルタイム脆弱性監視に対応しています Free / Team / Business Docker CLI, GitHub Actions 対応
Snyk Container 商用ツールです。修正提案が優秀で、ベースイメージの推奨も提示されます Free / Team / Enterprise GitHub Actions, GitLab CI, Bitbucket 対応
Grype OSS(Anchore)で、Trivyの代替として使えます。SBOM生成ツールSyftと連携します 無料 GitHub Actions 対応
# GitHub Actions での Trivy スキャン例
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'myapp:${{ github.sha }}'
    severity: 'CRITICAL,HIGH'
    exit-code: '1'
    format: 'table'

9. 環境別構成管理 -- dev / staging / prod の分離戦略

開発・ステージング・本番の3環境を Terraform で管理する場合、環境ごとに設定値(インスタンスサイズ、レプリカ数等)を分離する必要があります。同じモジュールを使い、変数だけ切り替えるのが定石です。

Development
- インスタンス: t3.small
- レプリカ数: 1
- DB: db.t3.micro (Single-AZ)
- ログレベル: DEBUG
- 自動削除: 有効(毎晩22時)
- コスト: 最小
Staging
- インスタンス: t3.medium
- レプリカ数: 2
- DB: db.t3.small (Multi-AZ)
- ログレベル: INFO
- 本番と同じ構成(スケール小)
- E2Eテスト実行環境
Production
- インスタンス: t3.large
- レプリカ数: 3+(Auto Scaling)
- DB: db.r6g.large (Multi-AZ)
- ログレベル: WARN
- バックアップ: 自動(7日保持)
- 監視・アラート: 完全構成

ディレクトリ構成パターン

# 推奨: 環境ごとのtfvarsファイル + 共通モジュール

infrastructure/
  modules/
    vpc/
      main.tf
      variables.tf
      outputs.tf
    ecs/
      main.tf
      variables.tf
      outputs.tf
  environments/
    dev/
      main.tf # モジュール呼び出し
      terraform.tfvars # dev用パラメータ
      backend.tf # dev用State保存先
    staging/
      main.tf
      terraform.tfvars
      backend.tf
    prod/
      main.tf
      terraform.tfvars
      backend.tf

Terraform Workspaces を使う方法もありますが、環境間の差異が大きい場合はディレクトリ分離の方が見通しが良いです。Workspacesは同じ構成でパラメータだけ変える場合(dev/staging が同構成など)に向いています。

10. Terraform + Docker + CI/CD 統合アーキテクチャ

Terraform でインフラを構築し、Docker でアプリをパッケージし、CI/CDで自動デプロイします。この3つを組み合わせた全体像を把握しておきます。

開発者のワークフロー
開発者
コード変更を Push
GitHub / GitLab
PR作成 → レビュー
CI Pipeline
テスト・ビルド・スキャン
CI/CD パイプライン
terraform plan
インフラ差分確認
docker build
イメージビルド
Trivy Scan
脆弱性チェック
デプロイ
terraform apply
インフラ更新
Registry Push
ECR / GHCR
ECS / K8s Deploy
コンテナ更新
レイヤー 担当ツール 管理対象 自動化ポイント
インフラ Terraform VPC, サブネット, RDS, ECS Cluster PRマージ時に terraform apply を自動実行
アプリケーション Docker アプリのパッケージング、依存関係管理 Dockerfileの変更で自動ビルド → スキャン
デプロイ CI/CD (GitHub Actions等) ビルド、テスト、スキャン、デプロイの自動化 環境ごとの承認フロー(dev自動, prod手動承認)
監視 CloudWatch / Datadog メトリクス、ログ、アラート 異常検知でSlack通知 + 自動ロールバック

用語集

IaC (Infrastructure as Code)
インフラの構成をコードで記述・管理する手法です。手動操作を排除し、バージョン管理・レビュー・自動化を可能にします。Terraform, OpenTofu, Pulumi, CloudFormation などが代表的なツールです。
HCL (HashiCorp Configuration Language)
HashiCorpが開発した設定記述言語です。TerraformのコードはHCLで書かれます。JSONに似た宣言的な構文で、人間にも読みやすい設計になっています。
Provider
Terraformがクラウドサービスと通信するためのプラグインです。AWS Provider, Google Provider, Azure Provider などがあり、Terraform Registry には3,000以上のProviderが公開されています。各クラウドやSaaSのAPIを抽象化し、統一的なインターフェースで操作できるようにします。
Resource
Terraformで管理するインフラの最小単位です。EC2インスタンス、S3バケット、VPCなど、クラウド上の1つの構成要素に対応します。resource ブロックで宣言します。
Module
複数のResourceをまとめた再利用可能なパッケージです。VPCの構成(サブネット、ルートテーブル、NAT GW等)を1つのモジュールとしてパッケージ化し、環境ごとに再利用します。
State
Terraformが管理するインフラの現在の状態を記録するファイル(terraform.tfstate)です。コードとクラウドの実態の差分を計算するために使われます。リモートBackendで管理するのが推奨されます。
Docker Image
コンテナの元となる読み取り専用のテンプレートです。ファイルシステムのスナップショットとメタデータ(実行コマンド、環境変数等)で構成されます。レイヤー構造を持ち、差分だけをダウンロードできます。
Container
Docker Imageから起動された実行中のプロセスです。ホストOSのカーネルを共有しつつ、ファイルシステム・ネットワーク・プロセス空間が隔離されます。VMよりも軽量で起動が速いのが特長です。
Registry
Docker Imageを保管・配布するサービスです。Docker Hub(公開)、Amazon ECR / Google GCR / GitHub GHCR(プライベート対応)があります。CI/CDパイプラインからpush/pullして利用します。
Multi-stage Build
Dockerfileで複数のFROM命令を使い、ビルド用ステージとランタイム用ステージを分離する手法です。ビルドに必要なツールを最終イメージに含めず、軽量で安全なイメージを作成できます。
Trivy
Aqua Securityが開発したOSSの脆弱性スキャナーです。コンテナイメージ、ファイルシステム、Gitリポジトリ、IaCファイルの脆弱性を検出します。高速で、CI/CDへの組み込みが容易です。
OCI (Open Container Initiative)
コンテナのランタイムとイメージフォーマットの業界標準仕様です。Docker以外のツール(Podman, containerd等)でもOCI準拠イメージを扱えます。ベンダーロックインを避けるための標準規格です。

参考URL一覧

Terraform Documentationdeveloper.hashicorp.com Terraform Registry -- Providers & Modulesregistry.terraform.io Docker Documentationdocs.docker.com Docker -- Multi-stage Buildsdocs.docker.com Trivy -- Comprehensive Security Scanneraquasecurity.github.io Snyk Container -- Vulnerability Managementsnyk.io Terraform Tutorialsdeveloper.hashicorp.com Docker Security Best Practicesdocs.docker.com Open Container Initiativeopencontainers.org OWASP Docker Security Cheat Sheetcheatsheetseries.owasp.org OpenTofu -- Open Source Terraform Forkopentofu.org Docker Scout -- Software Supply Chain Securitydocs.docker.com