Назад | Перейти на главную страницу

Развертывание на несколько учетных записей с Terraform?

Я искал способ Terraform для одновременного развертывания на нескольких учетных записях AWS в Terraform, и все закончилось. У AWS есть концепция сделать это с помощью стеков, но я не уверен, есть ли способ сделать это в TF? Если да, то каковы были бы некоторые решения?

Вы можете узнать больше о решении AWS здесь, https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/

Чтобы использовать одни и те же конфигурации terraform в нескольких учетных записях AWS, необходимо решить две проблемы. Во-первых, вам нужно будет использовать разные файлы состояния для каждой учетной записи. Второй - убедиться, что провайдер AWS использует правильный профиль / учетные данные для желаемой учетной записи.

Использование разных файлов состояний для каждой учетной записи

На высоком уровне terraform работает просто путем создания графа ресурсов зависимостей из предоставленных файлов конфигурации terraform (* .tf); и сравнивает их с файлом состояния. Файл состояния может быть либо локальным (terraform.tfstate) или в удаленном бэкэнд; обычная удаленная серверная часть AWS s3.

Даже если вы укажете провайдеру AWS использовать отдельные учетные записи с помощью переменных (подробнее об этом ниже), если обе учетные записи используют один и тот же бэкэнд, terraform будет постоянно давать сбой. Это произойдет, потому что при переключении с одной учетной записи на другую идентификаторы ресурсов AWS не будут совпадать, и / или в файле состояния будут указаны ресурсы, которых нет в терраформе учетной записи, которую в настоящее время просматривает.

Простой способ обойти это - использовать рабочие места. Рабочие области позволяют использовать разные файлы состояний без указания разных ключей серверной части. Использовать рабочие пространства очень просто. Если у вас есть простой блок терраформирования, такой как:

terraform {
    backend "s3" {
       bucket = "aws_bucket"
       key    = "terraform.tfstate"
       region = "us-east-1"
    }
}

Вы можете создавать новые рабочие пространства, используя terraform workspace new <workspace-name>. Итак, вы можете создать рабочую область для обеих своих учетных записей, используя такую ​​последовательность, как:

terraform workspace new account-1
terraform workspace new account-2

И вы можете переключить свое текущее рабочее пространство, используя terraform workspace select:

terraform workspace select account-1

Настройка поставщика AWS для работы с рабочим пространством

Помимо использования отдельных файлов состояния. Вам также потребуется указать разные учетные данные AWS (т. Е. Ключи доступа) для каждой необходимой учетной записи. Учетные данные AWS указаны с использованием провайдеры. В этом случае мы, очевидно, используем Провайдер AWS.. По сути, вы хотите использовать интерполяция в блоке ресурсов поставщика AWS, поэтому при переключении рабочих областей terraform будет использовать правильные учетные данные. Предполагая, что у вас настроен файл учетных данных aws с отдельным профилем для каждой учетной записи:

[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

Затем вы можете просто написать свой блок поставщика aws как:

provider "aws" {
    region  = "us-east-1"
    profile = "${terraform.workspace}"
}

Итак, пока вы называете свои рабочие области именами ваших профилей aws, тогда при переключении рабочих пространств terraform будет использовать другой профиль учетных данных aws при обновлении состояния и построении графа зависимостей.

Альтернативные методы

Это далеко не единственный способ добиться этого. Вы можете построить модули; а затем иметь разные каталоги, которые вызывают модуль с указанием разных поставщиков AWS и файлов состояния. У каждого метода есть свои плюсы и минусы.

Метод рабочей области - это то, как вы бы сделали это с одним каталогом, и вы должны были бы использовать те же самые файлы конфигурации terraform, как написано.

Для модулей потребуются отдельные файлы конфигурации, которые, по крайней мере, вызывают модули и указывают поставщиков и серверные части. Модули будут иметь смысл, если вы собираетесь создавать несколько учетных записей, несколько регионов и сред. Например, если вы собирались запускать в двух регионах для каждой учетной записи и в двух разных средах (промежуточная и производственная). Модули здесь имеют смысл, потому что они обеспечивают гибкость с использованием таких аргументов, как счетчик (возможно, при промежуточном выполнении будет выполняться меньшее количество экземпляров и т. Д.).

По сути, фокус состоит в том, чтобы получить состояние в одной общей корзине и указать разные учетные данные для предоставленных при переключении учетных записей. Рабочие места идеально подходят для меня

provider "aws" {
  version = "~> 2.18"
  profile = "second_account"
}

terraform {
  backend "s3" {
    encrypt = true
    bucket  = "shared_bucket"
    region  = "us-east-1"
    key     = "state"
    profile = "first_shared_account"
  }

  required_version = "~> 0.12.7"
}

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

aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account