Terraform部署C# AWS无服务器WebAPI后Swagger出现API加载错误
问题根因
Visual Studio自带的「Publish to AWS Lambda」功能会自动完成API Gateway路径适配、路由规则配置等兼容处理,而Terraform官方指南的默认示例未适配Swagger所需的路径匹配逻辑,导致Swagger UI请求的/Stage/swagger/v1/swagger.json无法被正确转发到ASP.NET Core的处理流程。
所需额外配置
- 调整ASP.NET Core项目的Swagger配置
在Startup.cs或Program.cs中新增路径基础适配逻辑,兼容API Gateway的阶段前缀:
// Configure方法最开头添加路径前缀适配 var basePath = Environment.GetEnvironmentVariable("ASPNETCORE_BASE_PATH"); if (!string.IsNullOrEmpty(basePath)) { app.UsePathBase(basePath); } // 修改NSwag Swagger UI配置 app.UseSwaggerUi3(settings => { settings.Path = "/swagger"; // 动态拼接带阶段前缀的swagger.json路径 settings.DocumentPath = $"{basePath ?? ""}/swagger/v1/swagger.json"; });- 调整ASP.NET Core项目的Swagger配置
- 在Terraform中为Lambda函数添加环境变量
在aws_lambda_function资源的环境变量块中配置API Gateway阶段前缀,示例如下:
resource "aws_lambda_function" "serverless_api" { # 保留原有函数配置不变 environment { variables = { # 变量值替换为你实际使用的API Gateway阶段名,默认一般为Stage ASPNETCORE_BASE_PATH = "/Stage" } } }- 在Terraform中为Lambda函数添加环境变量
- 完善API Gateway的代理路由规则
确保所有路径请求都能转发到Lambda处理,需新增通配符代理路由配置:
# 通配符路径资源 resource "aws_api_gateway_resource" "api_proxy" { rest_api_id = aws_api_gateway_rest_api.serverless_api.id parent_id = aws_api_gateway_rest_api.serverless_api.root_resource_id path_part = "{proxy+}" } # 通配符路径ANY方法配置 resource "aws_api_gateway_method" "proxy_any" { rest_api_id = aws_api_gateway_rest_api.serverless_api.id resource_id = aws_api_gateway_resource.api_proxy.id http_method = "ANY" authorization = "NONE" } # 通配符路径绑定Lambda集成 resource "aws_api_gateway_integration" "proxy_lambda" { rest_api_id = aws_api_gateway_rest_api.serverless_api.id resource_id = aws_api_gateway_method.proxy_any.resource_id http_method = aws_api_gateway_method.proxy_any.http_method type = "AWS_PROXY" uri = aws_lambda_function.serverless_api.invoke_arn }- 完善API Gateway的代理路由规则
- 开启API Gateway二进制媒体类型支持
保证Swagger UI的静态资源(css、js等)能被正确返回,在API Gateway资源中添加如下配置:
resource "aws_api_gateway_rest_api" "serverless_api" { name = "aspnetcore-serverless-api" # 保留原有配置不变 binary_media_types = ["*/*"] }- 开启API Gateway二进制媒体类型支持
验证操作
所有配置完成后执行terraform apply部署更新,触发一次Lambda冷重启后,访问https://{你的API网关ID}.execute-api.{区域}.amazonaws.com/Stage/swagger即可正常加载Swagger UI。
内容的提问来源于stack exchange,提问作者ndp
相关产品推荐
相关产品推荐

