循环依赖地形

时间:2020-06-08 11:59:53

标签: aws-lambda terraform amazon-cognito aws-userpools

我有一个关于Terraform的循环依赖问题。我有一个用户池user_pool,当用户注册时,该池调用lambda user_signup_lambda作为触发器。此lambda还需要用户池的ID作为环境变量。

我的地形看起来像这样

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

除了硬编码用户池ID以外,是否还有其他解决方法?

1 个答案:

答案 0 :(得分:1)

我们遇到了完全相同的问题。我们最终将一个包含 UserPool Name 的变量传递给 UserPool 和 Lambda 触发器资源。

然后 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
  ...
}