Skip to main content

State, datasource tf_remote_state

История, Архитектура

Представим ситуацию, когда у вас есть проект, инфрастуктура для которого провиженится в aws c помощью terraform. Имеется пачка манифестов:

├── eks.tf
├── role-cert-manager.tf
├── role-ebs-csi-driver.tf
...
├── main.tf
└── vpc.tf

Амбиции пользователей проекта растут и мы добавляем все новые и новые контроллеры в k8s, при этом раздаем им права на aws с помощью IAM ролей. Кажется какие тут могут проблемы?

Проблемы начинают возникать, когда при изменении tf кода план выполняется больше X минут, скажем ~5 мин.

Создавать новый проект не хочется, по причине того, что IAM как бы тесно связаны с eks (cluster oidc endpoint). Как быть?

Один из вариантов - terraform_remote_state

Как это выглядит?

terraform_remote_state

Создаем вложенный подпроект iam

├── iam
│   ├── data.tf
│   ├── main.tf
│   ├── role-cert-manager.tf
│   └── role-ebs-csi-driver.tf
├── outputs.tf
├── main.tf
└── vpc.tf

Рассмотрим менеджмент манифесты в корневом приложении. Здесь нам важны outputs.tf, они попадают в стейт.

root

provider "aws" {
profile = "mc-project"
region = <aws_region>
}

terraform {
required_version = ">= 1.3.0"

required_providers {
aws = {
source = "hashicorp/aws"
version = "4.42.0"
}
}
}

terraform {
backend "s3" {
profile = "mc-mgmt"
region = <aws_region>
bucket = "mc-terraform-states"
key = "project/stage.tfstate"
dynamodb_table = "mc-terraform-locks"
}
}

Рассмотрим манифесты во вложенном приложении.

branch (iam)

  1. main.tf - стейт кладем уже в другой файл
  2. data.tf - ds берет другой стейт, и может вытаскивать из него объекты типа output (если не ошибаюсь, то можно вытащить только этот объект)
  3. role-ebs-csi-driver.tf - используем output-ы из root проекта в своих целях
provider "aws" {
profile = "mc-project"
region = <aws_region>
}

terraform {
required_version = ">= 1.3.0"

required_providers {
aws = {
source = "hashicorp/aws"
version = "4.42.0"
}
}
}

terraform {
backend "s3" {
profile = "mc-mgmt"
region = <aws_region>
bucket = "mc-terraform-states"
key = "project/stage-iam.tfstate"
dynamodb_table = "mc-terraform-locks"
}
}