Terraform не развертывается в нескольких аккаунтах - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема с развертыванием terraform / terragrunt в нескольких аккаунтах. Я хочу управлять DNS и KMS в моей «основной» учетной записи и развернуть все остальное в моей среде dev / uat / prod.

Я настроил несколько AWS учетных записей с помощью провайдеров. Один автоматически создается с помощью terragrunt, а другой создается в моем файле main.tf.

Я пробовал много разных способов заставить это работать. Псевдоним обоих провайдеров, установка псевдонима только у одного провайдера и полное удаление террагранта из уравнения. В каждом случае terraform применяется к моей «основной» учетной записи для всех ресурсов.

Ниже приведен пример моего кода:

  backend = "s3"
#   generate = {
#       path = "backend.tf"
#       if_exists = "overwrite"
#   }
  config = {
    bucket                  = "arm-terraform-state"
    key                     = "${path_relative_to_include()}/terraform.tfstate"
    region                  = "us-west-2"
    dynamodb_table          = "arm-terraform-state-lock"
  }
  generate = {
    path = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
}
generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  alias                   = "main"
  region                  = "${local.aws_region}"
  profile                 = "${local.account}"
}
EOF
}
locals {
    region_vars = read_terragrunt_config(find_in_parent_folders("region.hcl"))
    account_vars = read_terragrunt_config(find_in_parent_folders("account.hcl"))
    aws_region   = local.region_vars.locals.aws_region
    account = local.account_vars.locals.aws_profile
}

Выше мой код Terragrunt. Это мой модуль:

resource "aws_iam_role_policy" "logging_role_policy" {
  provider = aws.main
  name = format("aws-sftp-logging-policy-%s-%s",var.product_name,var.env)

  role= aws_iam_role.logging_role.id

  policy = data.aws_iam_policy_document.sftp_logging.json
}
############
# Route 53 #
############
resource "aws_route53_record" "sftp_record" {
  provider = aws.master
  zone_id = data.aws_route53_zone.facteus.zone_id
  name = format("%s-%s",var.product_name,var.env)
  type = "CNAME"
  ttl = "30"
  records = [aws_transfer_server.aws_transfer_service.endpoint]
}

1 Ответ

2 голосов
/ 28 апреля 2020

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

├── dev
│   ├── terragrunt.hcl
│   └── us-east-1
├── master
│   ├── _global
│   │   └── dns
│   ├── terragrunt.hcl
│   └── us-east-1
│       └── kms
├── prod
│   ├── terragrunt.hcl
│   └── us-east-1
└── uat
    ├── terragrunt.hcl
    └── us-east-1

У учетной записи master здесь есть два каталога, которых нет у других:

  1. _global/dns - поскольку маршрут 53 в AWS является глобальной сущностью (не региональной), вы не хотите вкладывать его в us-east-1. Он существует только в учетной записи master, поскольку вы указали, что хотите управлять DNS с главного устройства. (Я бы также рекомендовал назвать его route53, а не dns, но я отвлекся.)

  2. us-east-1/kms - содержит конфигурацию KMS, также только для master .

Теперь, в master/terragrunt.hcl, настройте свою конфигурацию remote_state:

remote_state {
  backend = "s3"
  config = {
    encrypt        = true
    bucket         = "master-terraform-state" # Just for example - must be a globally unique
    key            = "${path_relative_to_include()}/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
  }
}

При желании вы также можете включить iam_role атрибут :

iam_role = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"

Обратите внимание, что это необязательно, поскольку вы также можете просто запустить Terragrunt с учетными данными для главной учетной записи, или вы можете использовать опцию --terragrunt-iam-role CLI, или вы можете установить TERRAGRUNT_IAM_ROLE env var. Во всех случаях вы будете выполнять terragrunt с ролью, которая имеет разрешения для основной учетной записи.

Теперь для учетных записей dev / uat / prod вы можете иметь аналогичную конфигурацию remote_state, заменяя другую. название ведра для каждого из них. Затем вы можете использовать роль IAM, соответствующую каждой из этих учетных записей, либо определив ее как iam_role в terragrunt.hcl в каждой учетной записи, либо другими способами, которые я упомянул.

TL; DR Вам не нужно создавать провайдера для этого, и вам не нужно называть профиль в конфигурации провайдера. Вы просто выполняете terragrunt с правильной ролью IAM для каждой учетной записи. Террагрунт возьмет на себя эту роль, прежде чем вызывать Терраформ. Поместите конфигурацию провайдера в свой модуль Terraform, оставив профиль выключенным.

...