【发布时间】:2020-09-27 09:21:21
【问题描述】:
我有一个 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 进行硬编码之外,还有其他方法吗?
【问题讨论】:
-
为什么需要传递用户池ID?事件对象应该已经包含
userPoolId,您可以从那里读取。 docs.aws.amazon.com/cognito/latest/developerguide/… 有一个示例 Lambda 函数和一个示例事件输入。 -
你说得对……我可以这样。我的错!谢谢!但是,如果无法从请求中获取它,是否有办法解决这个问题?
-
问题是这两种方式都有明显的依赖关系。如果您将 Lambda 函数和 Cognito 用户池彼此分开,以便单独应用它们,那么您可以通过将其中一个的 ARN/ID 硬编码到另一个中或使用数据源查找另一个来实现。不过,没有办法在同一个
apply中做到这一点。
标签: aws-lambda terraform amazon-cognito aws-userpools