gpt4 book ai didi

aws-lambda - 用于 Lambda 代理集成的 Terraform API 网关

转载 作者:行者123 更新时间:2023-12-05 06:22:53 36 4
gpt4 key购买 nike

我花了一天时间与 API 网关和 AWS Serverless Express 作斗争无济于事。我的目标是通过 Terraform (v0.12) 部署一个 API 网关,proxies all requests到基于 AWS Serverless Express 的 lambda。 API Gateway 和 Lambda 之间的连接似乎存在,但很脆弱,因为任何调用(来自 API Gateway 控制台或 Postman)都以 502 Bad Gateway 响应,显然是由于超时(lambda CloudWatch 日志如此说明)。看起来 lambda 代码并没有实际运行,只是它无效地旋转起来。

API 网关和 Lambda 应该支持路径参数和查询字符串:

  1. GET/some/path/:id 通过id获取
  2. GET/some/path?query=param 得到收藏
  3. POST/some/path 创建资源
  4. PATCH/some/path/:id 更新资源
  5. DELETE/some/path/:id 删除资源

在几次错误启动之后,我尝试使 API Gateway Terraform 模块尽可能灵活:

resource "aws_api_gateway_rest_api" "rest_api" {
name = "${var.application_name} API"
description = var.description
}

resource "aws_api_gateway_resource" "proxy" {
rest_api_id = aws_api_gateway_rest_api.rest_api.id
parent_id = aws_api_gateway_rest_api.rest_api.root_resource_id # aws_api_gateway_resource.version.id
path_part = "{proxy+}"
}

resource "aws_api_gateway_method" "method" {
rest_api_id = aws_api_gateway_rest_api.rest_api.id
resource_id = aws_api_gateway_resource.proxy.id
http_method = "ANY"
authorization = "NONE"

request_parameters = {
"method.request.path.proxy" = true
}
}

resource "aws_api_gateway_integration" "integration" {
rest_api_id = aws_api_gateway_rest_api.rest_api.id
resource_id = aws_api_gateway_resource.proxy.id
http_method = aws_api_gateway_method.method.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = "arn:aws:apigateway:${local.region}:lambda:path/2015-03-31/functions/${var.lambda_arn}/invocations"
}

resource "aws_api_gateway_deployment" "apig_deployment" {
depends_on = [
"aws_api_gateway_resource.proxy",
"aws_api_gateway_method.method",
"aws_api_gateway_integration.integration"
]

rest_api_id = aws_api_gateway_rest_api.rest_api.id
stage_name = var.api_stage_name

lifecycle {
create_before_destroy = true
}
}

resource "aws_lambda_permission" "apig_to_lambda" {
statement_id = "AllowExecutionFromAPIGateway"
action = "lambda:InvokeFunction"
function_name = var.function_name
principal = "apigateway.amazonaws.com"
source_arn = "arn:aws:execute-api:${local.region}:${local.account_id}:${aws_api_gateway_rest_api.rest_api.id}/*/*/*" # TODO: lock this down
}

最佳答案

您收到 502 错误,表明 api 网关收到的响应不正确。

话虽如此,您的应用程序似乎返回了 json 响应。您可以尝试以下/确认设置吗?

  1. 在您的 lambda 配置中添加正确的二进制 mime 类型。参见 here了解更多详情。

  2. 在 api 网关端允许相同的 mime 类型或通配符,如下所示。

    resource "aws_api_gateway_rest_api" "rest_api" {
name = "${var.application_name} API"
description = var.description

// Wildcard mimes, accept any
binary_media_types = ["*/*"]
}

关于aws-lambda - 用于 Lambda 代理集成的 Terraform API 网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897491/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com