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

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%削減
手動2-3日 → IaCで数十分
再現性のある即時プロビジョニング
設定ミス発生率
75%削減
手作業の属人性を排除
コードレビューで事前検出
監査対応工数
80%削減
変更履歴がGitに残る
Who/When/Whatが自動記録

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
プル時間とストレージコストを大幅削減
攻撃対象面
縮小
ビルドツール・ソースコードが
本番イメージに含まれない
起動時間
高速化
軽量イメージは
コンテナ起動が速い
# マルチステージビルドの 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