Циклическая зависимость терраформа

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

Моя терраформа выглядит так

resource "aws_lambda_function" "user_signup_lambda" {
  function_name = "user_signup_lambda"
  filename = var.file_name
  source_code_hash = filebase64sha256(var.file_name)
  handler = var.handler
  runtime = var.runtime
  memory_size = var.memory_size
  timeout = var.timeout
  role = var.iam_role_arn

  environment {
    variables = aws_cognito_user_pool.user_pool.id
  }
}

resource "aws_cognito_user_pool" "user_pool" {
  name = "some-user-pool"

  ....other config

  lambda_config {
     post_confirmation = module.user_signup_lambda.arn
  }

Это приводит к следующей ошибке:

Error: Cycle: module.user_signup_lambda.var.environment_variables, module.user_signup_lambda.aws_lambda_function.lambda_function, module.user_signup_lambda.output.arn, aws_cognito_user_pool.user_pool

Есть ли что-то еще, кроме жесткого кодирования идентификатора пользовательского пула?


person Joshua Smart    schedule 08.06.2020    source источник
comment
Зачем нужен идентификатор пула пользователей? В объекте события уже должен быть userPoolId, который вы можете прочитать оттуда. docs.aws.amazon.com/cognito/latest/developerguide/ содержит пример лямбда-функции и пример ввода события.   -  person ydaetskcoR    schedule 08.06.2020
comment
Ты прав ... Я могу это сделать так. Виноват! Благодарность! Однако есть ли способ обойти эту проблему, если не удалось получить ее из запроса?   -  person Joshua Smart    schedule 08.06.2020
comment
Проблема в том, что между ними существует явная зависимость. Если вы отделили лямбда-функцию и пользовательский пул Cognito друг от друга, чтобы они применялись отдельно, вы могли бы сделать это, либо жестко закодировав ARN / ID одного в другой, либо просмотрев другой источник данных. Однако нет способа сделать это в том же apply.   -  person ydaetskcoR    schedule 08.06.2020


Ответы (1)


У нас была точно такая же проблема. В итоге мы передали переменную, содержащую имя UserPool, в ресурсы триггеров UserPool и Lambda.

Затем лямбда извлекает информацию о пуле пользователей Cognito по его имени.

Таким образом, между этими двумя ресурсами нет зависимости от цикла.

# Module containing Cognito userPool
resource "aws_cognito_user_pool" "default" {

 ...
  # Triggers
  lambda_config {
    post_confirmation = module.cognito_post_confirmation.lambda_post_confirmation.arn
  }
  name = var.cognito_identity_pool_name
} 


module "cognito_post_confirmation" {
  source                     = "./triggers/post-confirmation"
  cognito_identity_pool_name = var.cognito_identity_pool_name
  ...
}
person Sebastien H.    schedule 04.02.2021