AWS Terraform Lambda 预配置并发

6

我试图让预置并发与我的API网关支持的Lambda函数一起使用。

以下配置不起作用,AWS似乎完全忽略了预置并发,并且会冷启动。

resource "aws_lambda_function" "user_history" {
  publish          = true
  filename         = "../distribution/target/distribution/user-history.jar"
  function_name    = "user-history_${var.user}_${terraform.workspace}"
  role             = aws_iam_role.lambda.arn
  source_code_hash = filebase64sha256("../distribution/target/distribution/user-history.jar")
  runtime          = "java11"
  timeout          = 240
  memory_size      = 512
}

resource "aws_api_gateway_integration" "user_history" {
  rest_api_id             = aws_api_gateway_rest_api.vnm_api.id
  resource_id             = aws_api_gateway_resource.user_history.id
  http_method             = aws_api_gateway_method.user_history.http_method
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = aws_lambda_function.user_history.invoke_arn
}

resource "aws_lambda_provisioned_concurrency_config" "user_history_provisioning" {
  function_name = aws_lambda_function.user_history.function_name
  provisioned_concurrent_executions = 2
  count = var.provisioning == true ? 1 : 0
  qualifier = aws_lambda_function.user_history.version
}

我猜这可能与未指定版本有关,因此我尝试添加配置项,按照这里的接受答案进行操作,以便调用lambda函数的URI。

resource "aws_lambda_alias" "user_history_alias"{
  name = "user_history_version"
  description = "Versioned alias"
  function_name = aws_lambda_function.user_history.arn
  function_version = aws_lambda_function.user_history.version
}

data "aws_lambda_function" "user_history" {
  function_name = aws_lambda_function.user_history.function_name
  qualifier = "user_history_version"
}

resource "aws_api_gateway_integration" "user_history" {
  uri = aws_lambda_function.user_history.user_history_version.invoke_arn
}

但是现在我遇到一个错误,它说:该对象没有名为"user_history_version"的参数、嵌套块或导出属性

有人知道如何让我的预留并发工作吗?


在运行terraform apply后,您是否看到在AWS Web控制台中创建了设置?您只需要提供2个,因此如果对该函数有3个或更多并发请求,则仍将出现冷启动。 - Mark B
是的,我可以在AWS UI中看到Lambda函数上的配置文件,AWS还显示此窗口中的并发已准备就绪。这仍然是一个开发环境,在该环境中只有我访问,因此我认为2个实例已经足够了。 - Gelunox
1个回答

5

你已经朝着正确的方向前进了 - 如果使用未经限定的lambda arn,则引用的是$LATEST版本,而您的预配并发使用的是最新发布版本。

您可以通过引用别名ARN (aws_lambda_alias.user_history_alias.arn) 来解决问题,或者如果您不需要别名用于其他目的,则引用aws_lambda_function.user_history.qualified_arn,它将是最新发布版本。


我应该将这个 qualified_arn 放在哪个配置字段中呢?它不能放在网关集成 URI 字段中,因为那里需要一个 invoke arn。 - Gelunox
调用ARN可以进行模板化,例如"arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/${aws_lambda_function.user_history.qualified_arn}/invocations",或者您可以从别名的invoke_arn中提取它。 - Dan Monego
1
我执行了 replace(aws_lambda_function.user_history.invoke_arn, aws_lambda_function.user_history.arn, aws_lambda_function.user_history.qualified_arn) 以获得相同的结果。我还必须更新 aws_lambda_permission.function_name 以包含版本以使其生效。它似乎有点起作用,AWS指标显示通过预配进行调用,但第一个请求仍然感觉有点慢,比以前快,但仍然很慢。 - Gelunox
更新:我已经尝试在我使用的所有Lambda函数中实施此修复,但突然间什么都不起作用了。我稍后会调查为什么会发生这种情况,但我已经花费了足够多的时间研究这个愚蠢的问题,可以称之为沉没成本谬误,责怪亚马逊的糟糕实现,并放弃整个想法。 - Gelunox
1
问题在于某些位置没有将权限设置为合格的ARN。第一个请求仍然很慢,但似乎比以前更快了。 - Gelunox
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接