Развертывание на нескольких учетных записях AWS с помощью Terraform?

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

Вы можете прочитать больше о решении Cloudformation здесь.

1 ответ

Решение

Вы можете определить псевдонимы нескольких провайдеров, которые можно использовать для выполнения действий в разных регионах или даже в разных учетных записях AWS.

Таким образом, чтобы выполнить некоторые действия в вашем регионе по умолчанию (или получить запрос, если он не определен в переменных окружения /~/.aws/configure/ etc), а также на востоке США 1 у вас будет что-то вроде этого:

provider "aws" {
  # ...
}

# Cloudfront ACM certs must exist in US-East-1
provider "aws" {
  alias  = "cloudfront-acm-certs"
  region = "us-east-1"
}

Затем вы бы назвали их так:

data "aws_acm_certificate" "ssl_certificate" {
  provider    = "aws.cloudfront-acm-certs"
  ...
}

resource "aws_cloudfront_distribution" "cloudfront" {
  ...
  viewer_certificate {
    acm_certificate_arn = "${data.aws_acm_certificate.ssl_certificate.arn}"
    ...
  }
}

Так что, если вы хотите выполнять действия с несколькими учетными записями одновременно, тогда вы можете взять на себя роль в другой учетной записи с чем-то вроде этого:

provider "aws" {
  # ...
}

# Assume a role in the DNS account so we can add records in the zone that lives there
provider "aws" {
  alias   = "dns"
  assume_role {
    role_arn     = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
    session_name = "SESSION_NAME"
    external_id  = "EXTERNAL_ID"
  }
}

И относиться к этому так:

data "aws_route53_zone" "selected" {
  provider     = "aws.dns"
  name         = "test.com."
}

resource "aws_route53_record" "www" {
  provider = "aws.dns"
  zone_id  = "${data.aws_route53_zone.selected.zone_id}"
  name     = "www.${data.aws_route53_zone.selected.name}"
  ...
}

В качестве альтернативы вы можете предоставить учетные данные для различных учетных записей AWS несколькими другими способами, такими как жесткое кодирование их в поставщике или использование различных переменных Terraform, специфических переменных среды AWS SDK или с помощью настроенного профиля.

Я бы также рекомендовал объединить ваше решение с рабочими пространствами Terraform:

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

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

Рабочие области, не используемые по умолчанию, часто связаны с ветвями функций в системе управления версиями. Рабочее пространство по умолчанию может соответствовать "главной" или "магистральной" ветви, которая описывает предполагаемое состояние производственной инфраструктуры. Когда для разработки изменения создается ветка функции, разработчик этой функции может создать соответствующее рабочее пространство и развернуть в нем временную "копию" основной инфраструктуры, чтобы изменения можно было протестировать, не затрагивая производственную инфраструктуру. После того, как изменение будет объединено и развернуто в рабочем пространстве по умолчанию, тестовая инфраструктура может быть уничтожена, а временное рабочее пространство удалено.

AWS S3 находится в списке поддерживаемых серверных ВМ.

Его очень легко использовать (аналогично работе с ветками git) и комбинировать с выбранной учетной записью AWS.

terraform workspace list
   dev
 * prod
   staging

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

  1. https://terragrunt.gruntwork.io/docs/features/work-with-multiple-aws-accounts/

  2. https://assets.ctfassets.net/hqu2g0tau160/5Od5r9RbuEYueaeeycUIcK/b5a355e684de0a842d6a3a483a7dc7d3/devopscon-V2.1.pdf

Другие вопросы по тегам