📁 完全なコードはGitHubで公開:GitHub: pipeiac02
シリーズ一覧(全12回)
Phase 1: 基盤構築
Phase 2: ワークフロー
Phase 3: セキュリティ・運用
Phase 4: 開発効率化
1. はじめに
1-1. 今回のゴール
これまで作成してきたTerraformコードの構成を確認し、CI/CDに向けて準備します。
| ゴール | 内容 |
|---|---|
| 確認 | ファイル構成を確認する |
| 理解 | 各ファイルの役割を理解する |
| 準備 | CI/CD(次回)に向けた準備 |
1-2. ファイル間の参照関係は?
第2〜9回で作成した .tf ファイルはの参照関係を図解してみます。
- 左から右へ: 設定 → リソース → 出力
- 矢印: 参照関係(例:
iam.tfはs3.tfのbucket.arnを参照)
2. 現状のチェック
2-1. チェックリスト
CI/CDに進む前に、以下を確認しておきます。
| # | 確認項目 | 期待値 |
|---|---|---|
| 1 | 全ての variable が variables.tf にある |
✓ |
| 2 | 全ての output が outputs.tf にある |
✓ |
| 3 | 共通タグが locals で定義されている |
✓ |
| 4 | ハードコードされた値がない | ✓ |
| 5 |
terraform validate が成功する |
✓ |
2-2. よくある問題と対処
| 問題 | 原因 | 対処 |
|---|---|---|
| 変数が見つからない | variables.tf に未定義 | variable ブロックを追加 |
| 循環参照エラー | ファイル間で相互参照 | 依存関係を見直す |
| タグの不統一 | locals未使用 |
merge(local.common_tags, {...}) を使用 |
3. ファイル構成の設計
3-1. 現在のファイル構成
pipeiac02/
├── test-data/
│ └── *.json # テスト用サンプルデータ
└── tf/
├── main.tf # プロバイダ設定 + locals(共通タグ)
├── variables.tf # 入力変数
├── outputs.tf # 出力値
├── backend.tf # S3バックエンド設定(CI/CD用)
├── s3.tf # S3リソース
├── lambda.tf # Lambdaリソース
├── glue.tf # Glueリソース
├── stepfunctions.tf # Step Functionsリソース
├── eventbridge.tf # EventBridgeリソース + S3通知設定
├── sns.tf # SNSリソース
├── cloudwatch.tf # CloudWatchリソース
├── iam.tf # IAMリソース
├── terraform.tfvars # 変数値(Git管理外)
│
└── lambda/ # Lambdaコード
└── etl.py
3-2. ファイル分割の考え方
| ファイル | 役割 | 内容 |
|---|---|---|
| main.tf | 基本設定 | terraform / provider / locals ブロック |
| variables.tf | 入力変数 | variable ブロック |
| outputs.tf | 出力値 | output ブロック |
| backend.tf | 状態管理 | S3バックエンド設定 |
| *.tf | リソース | resource / data ブロック |
4. 実装
4-1. main.tf(基本設定 + 共通タグ)
# main.tf
# ================================
# Terrform/プロバイダ設定
# ================================
terraform {
required_version = ">= 1.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
archive = {
source = "hashicorp/archive"
version = "~> 2.0"
}
}
}
provider "aws" {
region = var.aws_region
}
# ================================
# 共通タグ
# ================================
locals {
common_tags = {
Project = var.project
Environment = var.environment
ManagedBy = "Terraform"
}
}
ポイント: locals ブロックで共通タグを定義し、
各リソースで merge(local.common_tags, {...}) で使用します。
4-2. variables.tf(入力変数)
# variables.tf
# ================================
# 変数定義
# ================================
variable "project" {
description = "プロジェクト名"
type = string
default = "dp"
}
variable "environment" {
description = "環境名(dev/prod)"
type = string
default = "dev"
}
variable "aws_region" {
description = "AWSリージョン"
type = string
default = "ap-northeast-1"
}
variable "bucket_suffix" {
description = "S3バケット名のサフィックス(日付など)"
type = string
default = "20260115"
}
variable "alert_email" {
description = "アラート通知先メールアドレス"
type = string
}
ポイント: alert_email は terraform.tfvars で設定し、Git管理外にします。
4-3. outputs.tf(出力値)
# outputs.tf
# ================================
# 出力値
# ================================
# S3バケット
output "raw_bucket_id" {
description = "Rawバケット名"
value = aws_s3_bucket.raw.id
}
output "processed_bucket_id" {
description = "Processedバケット名"
value = aws_s3_bucket.processed.id
}
# Lambda
output "lambda_etl_arn" {
description = "Lambda ETL関数ARN"
value = aws_lambda_function.etl.arn
}
output "lambda_etl_name" {
description = "Lambda ETL関数名"
value = aws_lambda_function.etl.function_name
}
# Glue
output "glue_database_name" {
description = "Glue Database名"
value = aws_glue_catalog_database.main.name
}
output "glue_crawler_name" {
description = "Glue Crawler名"
value = aws_glue_crawler.main.name
}
# Step Functions
output "sfn_arn" {
description = "Step Functions State Machine ARN"
value = aws_sfn_state_machine.pipeline.arn
}
output "sfn_name" {
description = "Step Functions State Machine名"
value = aws_sfn_state_machine.pipeline.name
}
# SNS
output "sns_topic_arn" {
description = "SNS Topic ARN"
value = aws_sns_topic.alert.arn
}
4-4. terraform.tfvars(変数値ファイル)
# terraform.tfvars(Git管理外)
project = "dp"
environment = "dev"
aws_region = "ap-northeast-1"
bucket_suffix = "20260115"
alert_email = "your-email@example.com"
注意: terraform.tfvars はメールアドレスなどの情報を含むため、.gitignore に追加してGit管理外にします。
4-5. リソースファイルの構成
各リソースファイルはサービスごとに分かれています。
s3.tf の例:
# s3.tf
# Rawバケット(生データ用)
resource "aws_s3_bucket" "raw" {
bucket = "${var.project}-raw-${var.bucket_suffix}"
force_destroy = true
tags = merge(local.common_tags, {
Name = "${var.project}-raw"
})
}
# Processedバケット(加工済みデータ用)
resource "aws_s3_bucket" "processed" {
bucket = "${var.project}-processed-${var.bucket_suffix}"
force_destroy = true
tags = merge(local.common_tags, {
Name = "${var.project}-processed"
})
}
eventbridge.tf の一部:
# eventbridge.tf
# S3バケットのEventBridge通知を有効化
resource "aws_s3_bucket_notification" "raw" {
bucket = aws_s3_bucket.raw.id
eventbridge = true
}
ポイント: S3へのアップロード検知(EventBridge通知)は eventbridge.tf に配置しています。
4-6. ファイル一覧と役割
| ファイル | 役割 | 作成した回 |
|---|---|---|
| main.tf | プロバイダ設定 + 共通タグ | 第2回 |
| variables.tf | 入力変数 | 第2回 |
| outputs.tf | 出力値 | 第2回 |
| backend.tf | S3バックエンド(CI/CD用) | 第11回 |
| s3.tf | S3バケット | 第2回 |
| lambda.tf | Lambda関数 | 第3回 |
| iam.tf | IAMロール/ポリシー | 第3,4,5,6回 |
| glue.tf | Glue Database/Crawler | 第4回 |
| stepfunctions.tf | Step Functions | 第5回 |
| eventbridge.tf | EventBridgeルール + S3通知 | 第6回 |
| sns.tf | SNSトピック | 第8回 |
| cloudwatch.tf | アラーム/ダッシュボード | 第9回 |
5. 動作確認
5-1. フォーマット確認
cd pipeiac02/tf
terraform fmt -check
問題なければ出力なし。問題があれば:
terraform fmt # 自動フォーマット
5-2. バリデーション
terraform validate
期待される出力:
Success! The configuration is valid.
5-3. 計画(plan)
terraform plan
既存のインフラと一致していれば差分なし:
No changes. Your infrastructure matches the configuration.
5-4. 出力値の確認
注意: terraform output は state ファイルから値を取得します。
事前に terraform apply でリソースが作成済みである必要があります。
terraform output
期待される出力(apply済みの場合):
glue_crawler_name = "dp-crawler"
glue_database_name = "dp_db"
lambda_etl_arn = "arn:aws:lambda:ap-northeast-1:..."
lambda_etl_name = "dp-etl"
processed_bucket_id = "dp-processed-20260115"
raw_bucket_id = "dp-raw-20260115"
sfn_arn = "arn:aws:states:ap-northeast-1:..."
sfn_name = "dp-pipeline"
sns_topic_arn = "arn:aws:sns:ap-northeast-1:..."
5-5. 動作テスト
# テストデータをアップロード
aws s3 cp test-data/ec-sales.json s3://$(terraform output -raw raw_bucket_id)/input/
# 実行状態を確認
sleep 15
aws stepfunctions list-executions \
--state-machine-arn $(terraform output -raw sfn_arn) \
--max-results 1 \
--query 'executions[0].status'
期待される出力:
"SUCCEEDED"
5-6. 確認チェックリスト
| 確認項目 | 期待値 |
|---|---|
| terraform fmt | エラーなし |
| terraform validate | Success |
| terraform plan | No changes(理想) |
| terraform output | 全出力が表示 |
| 動作テスト | SUCCEEDED |
6. まとめ
6-1. この記事でやったこと
| 項目 | 内容 |
|---|---|
| 確認 | ファイル構成を確認した |
| 理解 | 各ファイルの役割を理解した |
| 準備 | CI/CD(次回)に向けた準備完了 |
6-2. 確認ポイントの振り返り
| 確認項目 | 結果 |
|---|---|
| ファイル間の依存関係 | 設定 → リソース → 出力 の流れ |
| ブロック種別の配置 | 各ファイルに適切に分散 |
| 変数・出力の集約 | variables.tf / outputs.tf に集約 |
| 共通タグ | main.tf 内 locals で定義 |
6-3. 設計のベストプラクティス
| プラクティス | 説明 |
|---|---|
| 変数の集約 | 全変数を variables.tf に |
| 出力の集約 | 全出力を outputs.tf に |
| 共通タグの定義 | main.tf 内の locals で定義 |
| ハードコード排除 | 値は変数または locals で |
| 環境別設定 | terraform.tfvars で管理 |
6-4. 次回予告
第11回: CI/CD では、自動デプロイを実装していきます。
- GitHub Actions の設定
- terraform plan/apply の自動化
- プルリクエストでのレビューフロー