概要
tfstateを冗長化するためにtfstateの保管先(backend)をデフォルトのlocalではなくconsul serverを指定する。
consul serverは複数台建ててクラスタを組み、クラスタ間でデータを同期させる。
仮定
- ホスト1,ホスト2,ホスト3: Consulのdockerを起動するホスト
- ホスト4: terraform を実行するホスト
手順
Consul serverを準備する
-
consul serverのDockerイメージを確認する
ConsulのDockerイメージは2つあるが、今後はhashicorp/consulの方を更新していくらしいので、そちらを使用する -
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をテスト実行させる
-
ホスト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
-
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 } }
-
<consul server1のIPアドレス>:8500
にアクセスしてみて、tfstateがアップロードされていれば成功
参考サイト
- https://rick-kemery.medium.com/load-balance-a-consul-cluster-using-docker-compose-nginx-and-consul-template-f690d3b4d4b8
- https://knowledge.sakura.ad.jp/2524/
- https://developer.hashicorp.com/terraform/language/settings/backends/configuration
- https://developer.hashicorp.com/consul/tutorials/docker/docker-compose-datacenter
- https://developer.hashicorp.com/consul/tutorials/day-0/docker-container-agents