Как заставить Terraform выдавать конкретное сообщение об ошибке c в зависимости от того, в какой учетной записи находится пользователь? - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть модуль terraform, который выполняет делегирование домена. Для нескольких переменных существует некоторая проверка по жестко заданному значению для проверки того, что пользователь использует допустимые входные данные, например:

resource "null_resource" "validate_region" {
  count = contains(local.regions, var.region) == true ? 0 : "Please provide a valid AWS region. E.g. (us-west-2)"
}

с local.regions в жестком коде и var.region в качестве пользователя переменная Приведенный выше код работает так: когда пользователь устанавливает переменную неправильно, он выдает ошибку, подобную этой:

Error: Incorrect value type

  on .terraform/foo/main.tf line 46, in resource "null_resource" "validate_region":
  46:   count = contains(local.regions, var.region) == true ? 0 : "Please provide a valid AWS region. E.g. (us-west-2)"

Invalid expression value: a number is required.

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

data "aws_caller_identity" "account" {}

resource "null_resource" "validate_account" {
  count = data.aws_caller_identity.account.account_id == var.primary_account_id ? 0 : "Please check that you are using the AWS creds for the primary account for this domain."
}

data "aws_route53_zone" "primary" {
  name = local.primary_name
}

с различными изменениями синтаксиса в части "{data.aws_caller_identity.account.account_id == var.primary_account_id}" ? 0, пытаясь заставить работать логику c, но не повезло. Я хотел бы, чтобы он выдавал ошибку, как это делает валидация региона, где будет отображаться сообщение об ошибке, которое я написал. Вместо этого (в зависимости от синтаксиса) он будет работать, как и ожидалось, для правильной учетной записи и выдаст ошибку Error: no matching Route53Zone found для неправильной учетной записи, ИЛИ он выдаст совершенно другую ошибку, предположительно, из-за того, что синтаксис все испортил.

Как мне заставить это работать? это возможно?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

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

Вы можете определить это в блоке провайдера aws. Пример может выглядеть следующим образом:

provider "aws" {
  region              = "eu-west-1"
  allowed_account_ids = ["123456789012"]
}

Теперь, если вы попытаетесь использовать учетные данные для другой учетной записи AWS, Terraform завершится ошибкой на этапе планирования:

Error: AWS Account ID not allowed: 234567890123
0 голосов
/ 18 февраля 2020

Я выяснил, что этот блок:

data "aws_route53_zone" "primary" {
  name = local.primary_name
}

работал до блока ресурсов проверки учетной записи. Добавьте depends_on примерно так:

data "aws_route53_zone" "primary" {
  name       = local.primary_name
  depends_on = [null_resource.validate_account,
  ]
}

И все хорошо.

...