115 Aug. 18, 2024, 12:24 p.m.

Создание нескольких окружений для разработки Terraform

Задача: разделить инфраструктуру на несколько сред

Для достижения результата потребуется изменить и написать скрипт, который будет формировать конфигурации.

Исходно имеем такой код:

terraform {
  backend "s3" {
    bucket = "terraform"
    key      = "prod/myproject/aws_sg/terraform.tfstate"
    region = "eu-central-1"
  }
}

provider "aws" {
  region = "eu-central-1"
}

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "terraform"
    key    = "prod/myproject/aws_vpc/terraform.tfstate"
    region = "eu-central-1"
  }
}

Сделаем так чтобы переменная среды TF_VAR_ENVIRONMENT=<env> подставлялась в конфигурацию и определяла местонахождение remote state.

terraform {
  backend "s3" {}
}

variable "ENVIRONMENT" {
  type    = string
  default = "develop"
}

provider "aws" {
  region = "eu-central-1"
}

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "terraform"
    key    = "${var.ENVIRONMENT}/myproject/aws_vpc/terraform.tfstate"
    region = "eu-central-1"
  }
}

Важно чтобы ваши модули или код умели тоже принимать var.ENVIRONMENT так как некоторые ресурсы, даже при хранении в разных remote state, могут конфликтовать или затирать друг друга

Теперь чтобы не делать всё руками добавим скрипт config.sh

#! /bin/bash

cat > backend-config.tfvars <<- EOM
bucket = "terraform"
key    = "${TF_VAR_ENVIRONMENT}/myproject/aws_sg/terraform.tfstate"
region = "eu-central-1"
EOM

terraform init -backend-config=backend-config.tfvars --reconfigure

Теперь при выполнении backend для терраформа будет генерироваться автоматически.