0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS×Terraform ⑩】データパイプライン構築シリーズ第10回|Terraform構成確認

Last updated at Posted at 2026-01-25

📁 完全なコードは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.tfs3.tfbucket.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_emailterraform.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 の自動化
  • プルリクエストでのレビューフロー

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?