如何仅允许AWS Lambda函数访问.NET单体项目API?
限制.NET API仅允许指定AWS Lambda调用的解决方案
先说结论:不是必须用API Gateway,两种方案都能搞定——要么直接在你的.NET API里加身份验证,要么用API Gateway做中间层管控。
方案一:直接在.NET API里做Lambda身份校验
这是最省事的方式,不用加额外组件,直接在API层卡请求来源:
- 利用AWS Lambda的IAM角色临时凭证:让Lambda调用API时自动带签名请求(AWS SDK会自动处理签名),然后在你的.NET API里验证这个签名是不是来自你指定的那个Lambda角色
- 具体步骤:
- 给目标Lambda分配一个专属IAM角色,确保这个角色有调用你API的权限(可以加自定义权限策略)
- 在.NET API里加一个授权过滤器,校验请求的
Authorization头,确认签名对应的IAM角色ARN是你指定的那个 - 简化版示例代码:
public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { var authHeader = context.HttpContext.Request.Headers["Authorization"].FirstOrDefault(); if (string.IsNullOrEmpty(authHeader)) { context.Result = new UnauthorizedResult(); return; } // 调用AWS SDK的签名验证方法,确认请求来自目标Lambda角色 var isValid = await ValidateAwsSignature(context.HttpContext.Request, "arn:aws:iam::123456789012:role/YourTargetLambdaRole"); if (!isValid) { context.Result = new ForbidResult(); } }
- 好处:零额外成本,架构简单;坏处:得自己写签名验证的逻辑,后续如果要加多个Lambda调用,权限管理会有点麻烦
方案二:用API Gateway做中间层
如果想搞更标准化的权限管理,或者以后要扩展更多API,用API Gateway更合适:
- 操作步骤:
- 确保你的.NET API能被API Gateway访问(比如部署在EC2、ECS,或者有公开的可访问端点)
- 创建API Gateway,把请求转发到你的.NET API
- 给API Gateway配置IAM授权,只允许目标Lambda的IAM角色调用这个API
- Lambda调用API Gateway时,AWS SDK会自动给请求签名,API Gateway会自动校验权限
- 好处:权限调整全靠IAM策略,灵活得很,还能复用API Gateway的监控、限流这些功能;坏处:多了一层组件,要额外配置,还有点小成本
选哪个?
- 要是就一个API、一个Lambda调用,直接上方案一,快得很
- 要是以后要加更多API或者需要更完善的API管理,选方案二更靠谱
内容的提问来源于stack exchange,提问作者Mccree
相关产品推荐
相关产品推荐

