Я искал способ 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