如何用Terraform在API Gateway中配置DELETE路由?
解决API Gateway v2中Terraform配置DELETE路由的错误
错误根源
你的DELETE方法集成配置错误:将Lambda函数的集成类型设为了HTTP_PROXY,但Lambda属于AWS服务集成,必须使用AWS_PROXY类型。HTTP_PROXY仅适用于转发请求到普通HTTP端点,因此会抛出"Invalid HTTP endpoint specified for URI"错误。
修正步骤
1. 修正DELETE集成的类型
将delete_weather_data_integration的integration_type改为AWS_PROXY,与POST方法的集成配置保持一致:
resource "aws_apigatewayv2_integration" "delete_weather_data_integration" { api_id = aws_apigatewayv2_api.weather_api.id integration_type = "AWS_PROXY" # 从HTTP_PROXY改为AWS_PROXY integration_method = "DELETE" integration_uri = aws_lambda_function.delete_weather_data.invoke_arn }
2. 优化Lambda权限的Source ARN(推荐)
避免硬编码执行ARN,改用Terraform动态生成,防止后续API ID或阶段变更导致权限失效:
resource "aws_lambda_permission" "api_gateway_invoke_delete_weather_data" { action = "lambda:InvokeFunction" function_name = aws_lambda_function.delete_weather_data.arn principal = "apigateway.amazonaws.com" source_arn = "${aws_apigatewayv2_api.weather_api.execution_arn}/${aws_apigatewayv2_stage.weather_api_stage.name}/DELETE/*" } # 同时建议把POST的权限也改成动态生成: resource "aws_lambda_permission" "api_gateway_invoke_weather_router" { action = "lambda:InvokeFunction" function_name = aws_lambda_function.weather_router.arn principal = "apigateway.amazonaws.com" source_arn = "${aws_apigatewayv2_api.weather_api.execution_arn}/${aws_apigatewayv2_stage.weather_api_stage.name}/POST/*" }
完整修正后的关键代码片段
# DELETE方法集成 resource "aws_apigatewayv2_integration" "delete_weather_data_integration" { api_id = aws_apigatewayv2_api.weather_api.id integration_type = "AWS_PROXY" integration_method = "DELETE" integration_uri = aws_lambda_function.delete_weather_data.invoke_arn } # DELETE路由 resource "aws_apigatewayv2_route" "delete_weather_data_route" { api_id = aws_apigatewayv2_api.weather_api.id route_key = "DELETE /weather" target = "integrations/${aws_apigatewayv2_integration.delete_weather_data_integration.id}" } # DELETE对应的Lambda权限 resource "aws_lambda_permission" "api_gateway_invoke_delete_weather_data" { action = "lambda:InvokeFunction" function_name = aws_lambda_function.delete_weather_data.arn principal = "apigateway.amazonaws.com" source_arn = "${aws_apigatewayv2_api.weather_api.execution_arn}/${aws_apigatewayv2_stage.weather_api_stage.name}/DELETE/*" }
内容的提问来源于stack exchange,提问作者solidsnake99
相关产品推荐
相关产品推荐

