GCP入門: Terraformモジュール操作 -Vol.2-

スポンサーリンク
GCP入門: Terraformモジュール操作 -Vol.2- ノウハウ
GCP入門: Terraformモジュール操作 -Vol.2-
この記事は約17分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terraformでのモジュール操作について解説しています。

スポンサーリンク

背景

下記の記事の続きになります。

実施内容

下記の手順で実施しました。

mkdir 作業用ディレクトリ

cd 作業用ディレクトリ

# terraformのバージョン指定
asdf local terraform 1.9.2

# terraformのバージョン確認
terraform --version

asdf local gcloud 482.0.0

asdf local python 3.12.4

# gcloudのバージョン確認
gcloud --version

# 操作アカウントの設定
gcloud config set account アカウント

# 操作アカウントの確認
gcloud config get-value account

# プロジェクト新規作成
gcloud projects create `プロジェクト名`
# プロジェクトの情報確認
gcloud projects describe `プロジェクト名`

# プロジェクトの設定
gcloud config set project `プロジェクト名`

# 請求先アカウントの確認
gcloud beta billing accounts list

# 請求先アカウントのリンク
gcloud beta billing projects link `プロジェクト名` --billing-account=`請求先アカウント`

# 有効なサービス一覧
gcloud services list

# サービスの有効化
gcloud services enable compute.googleapis.com

# tfファイル作成
touch main.tf outputs.tf variables.tf

# モジュール用のtfファイル作成
mkdir -p modules/gcs-static-website-bucket
cd modules/gcs-static-website-bucket
touch website.tf variables.tf outputs.tf

terraform init

terraform apply

curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html

gsutil cp *.html gs://blog-572-20240825

https://storage.cloud.google.com/blog-572-20240825/index.html

各tfファイルの内容は下記になります。

main.tf

module "gcs-static-website-bucket" {
  source = "./modules/gcs-static-website-bucket"

  name       = var.name
  project_id = var.project_id
  location   = "ASIA-NORTHEAST1"

  lifecycle_rules = [{
    action = {
      type = "Delete"
    }
    condition = {
      age        = 365
      with_state = "ANY"
    }
  }]
}

variables.tf

variable "project_id" {
  description = "リソースのプロビジョニングを行うプロジェクトの ID"
  type        = string
  default     = "ここにプロジェクト ID を指定"

}

variable "name" {
  description = "作成するバケットの名前"
  type        = string
  default     = "ここに(一意の)バケット名を指定"
}

outputs.tf

output "bucket-name" {
  description = "バケット名"
  value       = module.gcs-static-website-bucket.bucket.name
}

modules/gcs-static-website-bucket/website.tf


resource "google_storage_bucket" "bucket" {
  name               = var.name
  project            = var.project_id
  location           = var.location
  storage_class      = var.storage_class
  labels             = var.labels
  force_destroy      = var.force_destroy
  uniform_bucket_level_access = true

  versioning {
    enabled = var.versioning
  }

  dynamic "retention_policy" {
    for_each = var.retention_policy == null ? [] : [var.retention_policy]
    content {
      is_locked        = var.retention_policy.is_locked
      retention_period = var.retention_policy.retention_period
    }
  }

  dynamic "encryption" {
    for_each = var.encryption == null ? [] : [var.encryption]
    content {
      default_kms_key_name = var.encryption.default_kms_key_name
    }
  }

  dynamic "lifecycle_rule" {
    for_each = var.lifecycle_rules
    content {
      action {
        type          = lifecycle_rule.value.action.type
        storage_class = lookup(lifecycle_rule.value.action, "storage_class", null)
      }
      condition {
        age                   = lookup(lifecycle_rule.value.condition, "age", null)
        created_before        = lookup(lifecycle_rule.value.condition, "created_before", null)
        with_state            = lookup(lifecycle_rule.value.condition, "with_state", null)
        matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null)
        num_newer_versions    = lookup(lifecycle_rule.value.condition, "num_newer_versions", null)
      }
    }
  }
}

modules/gcs-static-website-bucket/variables.tf

variable "name" {
  description = "バケットの名前"
  type        = string
}

variable "project_id" {
  description = "バケットを作成するプロジェクトの ID"
  type        = string
}

variable "location" {
  description = "バケットの場所"
  type        = string
}

variable "storage_class" {
  description = "新しいバケットのストレージ クラス"
  type        = string
  default     = null
}

variable "labels" {
  description = "バケットに割り当てる Key-Value ラベルペアの集合"
  type        = map(string)
  default     = null
}


variable "bucket_policy_only" {
  description = "バケットに対するバケット ポリシーのみのアクセスを有効にする"
  type        = bool
  default     = true
}

variable "versioning" {
  description = "true に設定すると、バージョニングがこのバケットで完全に有効になる"
  type        = bool
  default     = true
}

variable "force_destroy" {
  description = "バケットを削除する際、含まれているすべてのオブジェクトが削除されるかどうかがこのブール値オプションで決まる。false の場合、Terraform はオブジェクトが含まれているバケットを削除できない。"
  type        = bool
  default     = true
}

variable "iam_members" {
  description = "バケットに対するアクセス許可を与える IAM メンバーのリスト"
  type = list(object({
    role   = string
    member = string
  }))
  default = []
}

variable "retention_policy" {
  description = "バケット内のオブジェクトをいつまで保持するかに関するバケットのデータ保持ポリシーの構成"
  type = object({
    is_locked        = bool
    retention_period = number
  })
  default = null
}

variable "encryption" {
  description = "このバケットに挿入されるオブジェクトの暗号化に使用される Cloud KMS キー"
  type = object({
    default_kms_key_name = string
  })
  default = null
}

variable "lifecycle_rules" {
  description = "バケットのライフサイクル ルールの構成"
  type = list(object({
    # キーを持つオブジェクト:
    # - タイプ - ライフサイクル ルールのアクションのタイプ。サポートされている値: Delete および SetStorageClass
    # - storage_class - (アクション タイプが SetStorageClass の場合は必須)このライフサイクル ルールの影響を受けるオブジェクトのターゲット ストレージ クラス
    action = any

    # キーを持つオブジェクト:
    # - age - (オプション)この条件を満たすオブジェクトの最短存続期間(日単位)
    # - created_before - (オプション)この条件を満たすオブジェクトの作成日。RFC 3339 形式(例: 2017-06-13)で指定
    # - with_state - (オプション)ライブ オブジェクトとアーカイブ オブジェクトの両方またはどちらかに一致サポートされている値: "LIVE"、"ARCHIVED"、"ANY"
    # - matches_storage_class - (オプション)この条件を満たすオブジェクトのストレージ クラスサポートされている値: MULTI_REGIONAL、REGIONAL、NEARLINE、COLDLINE、STANDARD、DURABLE_REDUCED_AVAILABILITY
    # - num_newer_versions - (オプション)バージョニングされたオブジェクトにのみ関連。この条件を満たすオブジェクトのより新しいバージョンの数
    condition = any
  }))
  default = []
}

modules/gcs-static-website-bucket/outputs.tf

output "bucket" {
  description = "作成されたストレージ バケット"
  value       = google_storage_bucket.bucket
}

tfファイルを作成後、下記のコマンドを実行します。

# 初期化
terraform init

# 実行プランの作成
terraform plan

# 変更を適用
terraform apply

# 状態ファイルの確認
terraform show

# buketにアップロードするファイルを準備
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html
curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html

# buketにアップロード
gsutil cp *.html gs://バケット名

プラウザで`https://storage.cloud.google.com/バケット名/index.html`にアクセスして下図のような画面になれば成功です。

解説

main.tf

このコードはTerraformの設定ファイルの一部で、Google Cloud Storage (GCS) バケットを作成し、静的ウェブサイトホスティング用に構成しています。以下に各部分の説明をします:

  1. module "gcs-static-website-bucket" :
    このモジュールは “gcs-static-website-bucket” という名前で定義されています。
  2. source = "./modules/gcs-static-website-bucket" :
    このモジュールのソースコードは、現在のディレクトリの modules/gcs-static-website-bucket サブディレクトリにあることを示しています。
  3. name = var.name :
    バケットの名前を var.name 変数から設定しています。
  4. project_id = var.project_id :
    Google CloudプロジェクトのIDを var.project_id 変数から設定しています。
  5. location = "ASIA-NORTHEAST1" :
    バケットの地理的な場所をアジア北東1リージョン(東京)に設定しています。
  6. lifecycle_rules :
    バケット内のオブジェクトのライフサイクルルールを定義しています。
  • action : オブジェクトに対するアクションを “Delete”(削除)と指定しています。
  • condition : アクションを実行する条件を指定しています。
    • age = 365 : オブジェクトが作成されてから365日経過したものを対象とします。
    • with_state = "ANY" : オブジェクトの状態に関わらず(ANY)、このルールを適用します。

このコードは、静的ウェブサイトをホストするためのGCSバケットを作成し、1年以上経過したオブジェクトを自動的に削除するライフサイクルルールを設定しています。

modules/gcs-static-website-bucket/website.tf

このコードはGoogle Cloud Storage (GCS) バケットを作成するTerraformのリソース定義です。以下に各部分の詳細な説明を提供します:

  1. リソース定義:
    resource "google_storage_bucket" "bucket" : GCSバケットリソースを定義しています。
  2. 基本設定:
  • name = var.name : バケットの名前
  • project = var.project_id : Google Cloudプロジェクトのid
  • location = var.location : バケットの地理的位置
  • storage_class = var.storage_class : ストレージクラス
  • labels = var.labels : バケットに付けるラベル
  • force_destroy = var.force_destroy : バケットの強制削除を許可するかどうか
  • uniform_bucket_level_access = true : 均一なバケットレベルアクセスを有効化
  1. バージョニング:
   versioning {
     enabled = var.versioning
   }

オブジェクトのバージョニングを制御します。

  1. 保持ポリシー:
   dynamic "retention_policy" {
     for_each = var.retention_policy == null ? [] : [var.retention_policy]
     content {
       is_locked = var.retention_policy.is_locked
       retention_period = var.retention_policy.retention_period
     }
   }

バケットの保持ポリシーを動的に設定します。保持ポリシーが指定されている場合のみ適用されます。

  1. 暗号化:
   dynamic "encryption" {
     for_each = var.encryption == null ? [] : [var.encryption]
     content {
       default_kms_key_name = var.encryption.default_kms_key_name
     }
   }

バケットの暗号化設定を動的に行います。暗号化が指定されている場合のみ適用されます。

  1. ライフサイクルルール:
   dynamic "lifecycle_rule" {
     for_each = var.lifecycle_rules
     content {
       action {
         type = lifecycle_rule.value.action.type
         storage_class = lookup(lifecycle_rule.value.action, "storage_class", null)
       }
       condition {
         age = lookup(lifecycle_rule.value.condition, "age", null)
         created_before = lookup(lifecycle_rule.value.condition, "created_before", null)
         with_state = lookup(lifecycle_rule.value.condition, "with_state", null)
         matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null)
         num_newer_versions = lookup(lifecycle_rule.value.condition, "num_newer_versions", null)
       }
     }
   }

複数のライフサイクルルールを動的に設定します。各ルールにはアクションと条件が含まれます。

このコードは非常に柔軟で、多くの設定オプションを変数を通じて外部から制御できるようになっています。バケットの基本的な属性から、バージョニング、保持ポリシー、暗号化、ライフサイクルルールまで、幅広い設定が可能です。

おわりに

今日は、Terraformでのモジュール操作について解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました