1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 17日目: 初めてのTerraform!簡単なS3バケットをデプロイしてみよう

Posted at

初めてのTerraform!簡単なS3バケットをデプロイしてみよう

はじめに

前回は、Terraformのインフラ定義言語であるHCLの基本を学びました。今回は、その知識を活用して、実際にTerraformでS3バケットをデプロイする手順を解説します。Terraformの基本的なワークフローを理解することが目標です。

前提条件

このチュートリアルを実行する前に、以下の準備が必要です:

  1. Terraformのインストール: 公式サイトからダウンロード済み
  2. AWS CLIの設定: aws configureでアクセスキーとシークレットキーを設定済み
  3. 適切な権限: S3バケットの作成・削除権限を持つIAMユーザーまたはロール

ステップ1:プロジェクトディレクトリの作成と設定

まず、プロジェクト専用のディレクトリを作成し、必要な設定ファイルを準備します。

mkdir terraform-s3-tutorial
cd terraform-s3-tutorial

1.1 メインの設定ファイル(main.tf)

# main.tf
# Terraformとプロバイダのバージョン管理
terraform {
  required_version = ">= 1.0"
  
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"  # 最新の安定版を使用
    }
    random = {
      source  = "hashicorp/random"
      version = "~> 3.1"
    }
  }
}

# AWSプロバイダの設定
provider "aws" {
  region = var.aws_region

  # 全リソースに共通のタグを自動付与
  default_tags {
    tags = {
      Project     = "terraform-tutorial"
      ManagedBy   = "terraform"
      Environment = var.environment
    }
  }
}

# バケット名にランダムサフィックスを追加してユニークにする
resource "random_id" "bucket_suffix" {
  byte_length = 4
}

# S3バケットの作成
resource "aws_s3_bucket" "my_first_bucket" {
  bucket = "${var.bucket_prefix}-${var.environment}-${random_id.bucket_suffix.hex}"

  tags = {
    Name        = "MyFirstTerraformBucket"
    Description = "Terraform学習用のS3バケット"
  }
}

# S3バケットのバージョニング設定
resource "aws_s3_bucket_versioning" "my_first_bucket_versioning" {
  bucket = aws_s3_bucket.my_first_bucket.id
  versioning_configuration {
    status = "Enabled"
  }
}

# S3バケットの暗号化設定
resource "aws_s3_bucket_server_side_encryption_configuration" "my_first_bucket_encryption" {
  bucket = aws_s3_bucket.my_first_bucket.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

# S3バケットのパブリックアクセスブロック(セキュリティのため)
resource "aws_s3_bucket_public_access_block" "my_first_bucket_pab" {
  bucket = aws_s3_bucket.my_first_bucket.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

1.2 変数定義ファイル(variables.tf)

# variables.tf
variable "aws_region" {
  description = "AWSリージョン"
  type        = string
  default     = "ap-northeast-1"

  validation {
    condition = can(regex("^[a-z]{2}-[a-z]+-[0-9]$", var.aws_region))
    error_message = "有効なAWSリージョン形式を入力してください(例: ap-northeast-1)。"
  }
}

variable "environment" {
  description = "環境名(dev, staging, prod)"
  type        = string
  default     = "dev"

  validation {
    condition = contains(["dev", "staging", "prod"], var.environment)
    error_message = "環境名は dev, staging, prod のいずれかを指定してください。"
  }
}

variable "bucket_prefix" {
  description = "S3バケット名のプレフィックス"
  type        = string
  default     = "my-terraform-bucket"

  validation {
    condition = can(regex("^[a-z0-9-]+$", var.bucket_prefix))
    error_message = "バケット名プレフィックスは小文字の英数字とハイフンのみ使用できます。"
  }
}

1.3 出力定義ファイル(outputs.tf)

# outputs.tf
output "bucket_name" {
  description = "作成されたS3バケットの名前"
  value       = aws_s3_bucket.my_first_bucket.id
}

output "bucket_arn" {
  description = "作成されたS3バケットのARN"
  value       = aws_s3_bucket.my_first_bucket.arn
}

output "bucket_region" {
  description = "S3バケットが作成されたリージョン"
  value       = aws_s3_bucket.my_first_bucket.region
}

output "bucket_domain_name" {
  description = "S3バケットのドメイン名"
  value       = aws_s3_bucket.my_first_bucket.bucket_domain_name
}

1.4 変数値設定ファイル(terraform.tfvars)

# terraform.tfvars(オプション)
# 環境に応じて値を変更してください
aws_region    = "ap-northeast-1"
environment   = "dev"
bucket_prefix = "my-terraform-learning"

ステップ2:Terraformの初期化

プロジェクトディレクトリで以下のコマンドを実行します:

terraform init

実行結果の確認ポイント

  • ✅ AWSプロバイダプラグインのダウンロード完了
  • .terraformディレクトリの作成
  • .terraform.lock.hclファイルの生成
  • Terraform has been successfully initialized!メッセージの表示

ステップ3:設定の検証

コードの構文チェックを実行します:

terraform validate

成功するとSuccess! The configuration is valid.と表示されます。

ステップ4:実行計画の確認

terraform plan

実行計画の読み方

  • +マーク:新規作成されるリソース
  • ~マーク:変更されるリソース
  • -マーク:削除されるリソース

計画では以下のリソースが作成される予定です:

  • aws_s3_bucket
  • aws_s3_bucket_versioning
  • aws_s3_bucket_server_side_encryption_configuration
  • aws_s3_bucket_public_access_block
  • random_id

ステップ5:リソースの作成(デプロイ)

terraform apply

実行前に計画が再表示され、確認を求められます。yesと入力してEnterを押してください。

デプロイ完了の確認

  1. Terraformの出力確認

    Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
    
    Outputs:
    bucket_arn = "arn:aws:s3:::my-terraform-learning-dev-1a2b3c4d"
    bucket_name = "my-terraform-learning-dev-1a2b3c4d"
    ...
    
  2. AWSマネジメントコンソールでの確認

    • S3サービスにアクセス
    • 作成されたバケットの存在を確認
    • バケットのプロパティ(暗号化、バージョニング)を確認
  3. AWS CLIでの確認

    aws s3 ls | grep my-terraform-learning
    

ステップ6:状態の確認

Terraformが管理しているリソースの状態を確認できます:

# リソース一覧の表示
terraform state list

# 特定のリソースの詳細情報表示
terraform state show aws_s3_bucket.my_first_bucket

ステップ7:リソースの削除

⚠️ 注意: 本番環境では慎重に実行してください。

terraform destroy

削除対象のリソースが表示され、yesで確認後に削除が実行されます。

セキュリティとベストプラクティス

今回実装したセキュリティ対策

  1. パブリックアクセスブロック: 意図しない公開を防止
  2. サーバーサイド暗号化: データの暗号化
  3. バージョニング: 誤削除からの保護
  4. バリデーション: 入力値の検証

ファイル管理の注意点

  • terraform.tfvarsにはセンシティブな情報を含めない
  • .gitignoreに以下を追加:
    # Terraform
    .terraform/
    *.tfstate
    *.tfstate.*
    terraform.tfvars
    .terraform.lock.hcl
    

まとめ:Terraformの基本ワークフロー

このチュートリアルで、Terraformの基本的な5つのコマンドを習得しました:

コマンド 目的 タイミング
terraform init 作業ディレクトリの初期化 プロジェクト開始時、プロバイダ変更時
terraform validate 設定ファイルの構文チェック コード作成・変更後
terraform plan 実行計画の確認 デプロイ前の確認
terraform apply リソースのデプロイ 実際のインフラ構築時
terraform destroy リソースの削除 環境の削除時

次のステップ

このワークフローを理解することが、Terraformを使いこなすための基礎となります。次回は、今回学んだ変数の活用や、より複雑なリソース管理、状態管理について詳しく解説します。

実際のプロジェクトでは、リモート状態管理(S3 + DynamoDB)や、CI/CDパイプラインとの統合も重要になります。お楽しみに!

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?