使用C# AWS SDK在API Gateway非根资源创建Lambda代理集成遇阻
解决API Gateway非根路由Lambda代理集成权限与配置问题
核心问题:Lambda权限的SourceArn格式错误
你的代码中Lambda权限的SourceArn路径规则完全写反了,这会导致API Gateway无法获得正确的Lambda调用权限,进而出现"函数无法找到"的权限类错误。
AWS Execute API的ARN格式为:
arn:aws:execute-api:<region>:<account-id>:<api-id>/<stage>/<method>/<resource-path>
其中通配符*可匹配任意阶段、HTTP方法。针对你的场景:
- 基础路由(如
/auth)的SourceArn需匹配该路径下的所有请求 - 代理路由(如
/auth/{proxy+})的SourceArn需匹配基础路径后的任意子路径
修正后的Lambda.AddPermissions代码如下:
var basePermission = await c.AddPermissionAsync(new AddPermissionRequest { Action = "lambda:InvokeFunction", FunctionName = name, Principal = "apigateway.amazonaws.com", // 匹配基础路径 /path 的所有请求 SourceArn = $"arn:aws:execute-api:{region}:{account}:{apiId}/*/*/{path}", StatementId = Guid.NewGuid().ToString() }); var proxyPermission = await c.AddPermissionAsync(new AddPermissionRequest { Action = "lambda:InvokeFunction", FunctionName = name, Principal = "apigateway.amazonaws.com", // 匹配 /path/{proxy+} 的所有子路径请求 SourceArn = $"arn:aws:execute-api:{region}:{account}:{apiId}/*/*/{path}/*", StatementId = Guid.NewGuid().ToString() }); return new List<string> { basePermission.Statement, proxyPermission.Statement };
额外检查点
- 确认Lambda函数ARN完整性:确保
functionArn是完整的Lambda资源ARN,若使用版本或别名,需在ARN末尾添加:$LATEST或具体版本号(如:v1),否则API Gateway可能无法定位到正确的函数版本。 - 验证集成Uri区域一致性:确保
region参数与Lambda函数所在区域完全一致,避免跨区域调用导致的权限或网络问题。 - 确认部署生效:你的代码已包含
CreateDeploymentAsync调用,但需确保environment参数是正确的阶段名称,否则修改后的配置不会生效。
内容的提问来源于stack exchange,提问作者hcerim
相关产品推荐
相关产品推荐

