LoginSignup
0
0

Terraformのtfstateをconsulで管理して冗長化を試みる

Last updated at Posted at 2024-04-11

概要

tfstateを冗長化するためにtfstateの保管先(backend)をデフォルトのlocalではなくconsul serverを指定する。
consul serverは複数台建ててクラスタを組み、クラスタ間でデータを同期させる。

仮定

  • ホスト1,ホスト2,ホスト3: Consulのdockerを起動するホスト
  • ホスト4: terraform を実行するホスト

手順

Consul serverを準備する

  1. consul serverのDockerイメージを確認する
    ConsulのDockerイメージは2つあるが、今後はhashicorp/consulの方を更新していくらしいので、そちらを使用する

  2. docker-compose.ymlとserver.jsonを各ホスト(ホスト1~3)に作成する

    docker-compose.ymlの例:

    services:
      consul-server:
        image: hashicorp/consul
        container_name: consul-server
        restart: always
        volumes:
          - ./server1.json:/consul/config/server1.json:ro
        network_mode: "host"
        command: "agent -bootstrap-expect=3 -server -bind=<ホストのIPアドレス> -ui"
    

    server1.json or server2.json or server3.json の例:

    {
            "node_name": "consul-server1",
            "retry_join": [<ホスト1のIP>,<ホスト2のIP>,<ホスト3のIP>],
            "server": true,
            "ui_config": {
                    "enabled": true
            },
            "data_dir": "/consul/data",
            "addresses": {
                    "http": "0.0.0.0"
            }
    }
    

実際にConsul serverをbackendに指定したTerraformをテスト実行させる

  1. ホスト4上にterraformをinstallする

    apt install gpg
    wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
    echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
    sudo apt update && sudo apt install terraform
    
  2. terraformを実行する
    とりあえずnginxを建てる簡単なtfファイルのbackendをconsulにしてテストしてみる
    main.tfの例:

    terraform {
      required_providers {
        docker = {
          source  = "kreuzwerker/docker"
          version = "~> 3.0.1"
        }
      }
      backend "consul" {
        address = "<consul server1のIPアドレス>:8500"
        scheme = "http"
        path = "backendtest/state"
      }
    }
    
    provider "docker" {}
    
    resource "docker_image" "nginx" {
      name         = "nginx"
      keep_locally = false
    }
    
    resource "docker_container" "nginx" {
      image = docker_image.nginx.image_id
      name  = "tutorial_2"
    
      ports {
        internal = 80
        external = 8000
      }
    }
    
    
  3. <consul server1のIPアドレス>:8500にアクセスしてみて、tfstateがアップロードされていれば成功

参考サイト

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