こんにちは。よっしーです(^^)
今日は、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) バケットを作成し、静的ウェブサイトホスティング用に構成しています。以下に各部分の説明をします:
module "gcs-static-website-bucket"
:
このモジュールは “gcs-static-website-bucket” という名前で定義されています。source = "./modules/gcs-static-website-bucket"
:
このモジュールのソースコードは、現在のディレクトリのmodules/gcs-static-website-bucket
サブディレクトリにあることを示しています。name = var.name
:
バケットの名前をvar.name
変数から設定しています。project_id = var.project_id
:
Google CloudプロジェクトのIDをvar.project_id
変数から設定しています。location = "ASIA-NORTHEAST1"
:
バケットの地理的な場所をアジア北東1リージョン(東京)に設定しています。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のリソース定義です。以下に各部分の詳細な説明を提供します:
- リソース定義:
resource "google_storage_bucket" "bucket"
: GCSバケットリソースを定義しています。 - 基本設定:
name = var.name
: バケットの名前project = var.project_id
: Google Cloudプロジェクトのidlocation = 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)
}
}
}
複数のライフサイクルルールを動的に設定します。各ルールにはアクションと条件が含まれます。
このコードは非常に柔軟で、多くの設定オプションを変数を通じて外部から制御できるようになっています。バケットの基本的な属性から、バージョニング、保持ポリシー、暗号化、ライフサイクルルールまで、幅広い設定が可能です。
おわりに
今日は、Terraformでのモジュール操作について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント