5
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?

BrainPadAdvent Calendar 2024

Day 6

初心者がTerraformと仲良くなるまでにやったこと

Last updated at Posted at 2024-12-05

はじめに

この記事はBrainpad Advent Calendar 2024 の6日目になります。
こんにちは。株式会社ブレインパッドの新卒の斉藤です。

今回は「初心者がTerraformと仲良くなるまでにやったこと」という記事を書くことで、自分が最近学んだことをアウトプットしつつ、新卒同期がアドベントカレンダーに積極的に参加する流れを作っていこうと思います。

概要

入社してから初めてTerraformというものを触りました。Terraformをだいたい扱えるようになるまでにやったことなどを、基本的な構文から設計、CI/CD設定まで順番に簡潔にまとめていこうと思います。

公式ドキュメントを軽く読む

まずは公式ドキュメントを軽く読み、HashiCorp社製品であること、インストール手順、HCLという言語で書くなどを理解する。

基本的な構文を知る

HCL(HashiCorp Configuration Language)で書く。

  • provider: 管理するクラウドプロバイダやサービス(例: AWS, GCP, Azure)
  • variable: 動的な値を管理するための変数
  • resource: 作成するリソース
  • output: 実行結果を出力するための機能

例:Google Cloudの場合

// main.tf
provider "google" {
  project = var.project_id
  region  = var.region
}

// variables.tf
variable "project_id" {
  description = "Google Cloud project ID"
  type        = string
}

variable "region" {
  description = "Google Cloud region"
  type        = string
}

// storage.tf
resource "google_storage_bucket" "my_bucket" {
  name          = "my-example-bucket"
  location      = "ASIA"
  storage_class = "STANDARD"
  
  versioning {
    enabled = true
  }

  lifecycle_rule {
    action {
      type = "Delete"
    }
    condition {
      age = 30
    }
  }

  labels = {
    environment = "dev"
    team        = "example-team"
  }
}

// output.tf
output "bucket_name" {
  value = google_storage_bucket.my_bucket.name
  description = "The name of the created GCS bucket"
}

基本的なコマンドを知る

  • terraform init:プロバイダのプラグインをダウンロードし、プロジェクトを初期化
  • terraform plan:実行計画を作成する。どのリソースが作成、削除されるかを確認
  • terraform apply:実行計画を適用して、リソースを作成または変更

ステートについて知る

Terraformは実行状態をステートファイル(terraform.tfstate)に保存する。このファイルはリソースの現在の状態を記録し、次回の実行時に変更点を検出するために使用される。

ステートの種類

ローカル

デフォルトでは、ステートファイルはローカルに保存される。

リモート

リモートバックエンドというものを使用して、外部のストレージサービスをステートファイルの配置場所に指定できる。(例:S3、GCS、Terraform Cloud)

terraform {
  backend "gcs" {
    bucket = "terraform-state-bucket"
    prefix = ""
  }
}

ステート設計の観点を知る

ステート設計は運用の効率性や安全性に大きく影響する。

観点1: 運用する環境

ステートを環境ごとに分割することで、環境間の干渉を防ぐ。

  • 開発環境用のステート
  • ステージング環境用のステート
  • 本番環境用のステート

観点2: リソースのライフサイクル

リソースのライフサイクルに応じてステートを分割することで、影響範囲を最小限に抑えることができる。

  • 長期間変更のないリソース(例: Cloud Storage)
  • 頻繁に変更されるリソース(例: Compute Engine)

観点3: モジュール化

再利用できそうな構成はモジュール化する。

module "example" {
  source = "./modules/my_module"

  # モジュールに渡す変数
  variable_name_1 = "value1"
  variable_name_2 = "value2"
}

ステートを飼い慣らす

  • terraform state list:ステートに登録されているリソースを一覧表示
  • terraform state rm:ステートからリソースを削除
  • terraform import:既存のリソースをTerraform管理下にインポート
  • terraform init -migrate-state:ステートを別のバックエンドに移行

デプロイを自動化する

CI/CDの設定して効率的に運用する。

例:Google Cloudで利用する場合

name: Terraform CI/CD

on:
  push:
    branches:
      - main

jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

     - name: Auth
       uses: google-github-actions/auth@v2
       with:
          project_id: ${{ secrets.PROJECT_ID }}
          workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}
          service_account: ${{ secrets.SERVICE_ACCOUNT }}

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
        with:
          terraform_wrapper: false

      - name: Initialize Terraform
        run: terraform init

      - name: Terraform Plan
        run: terraform plan

      - name: Apply Terraform (manual approval required)
        if: github.ref == 'refs/heads/main' && github.event_name == 'push'
        run: terraform apply -auto-approve

おわりに

いかがだったでしょうか。

Brainpad Advent Calendar 2024では他にもたくさんの記事が投稿されていますので、そちらもぜひ読んでみてくださいね。

5
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
5
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?