如何通过CDK为IAM用户授予仅调用单个API Gateway HTTP端点的权限?
缩小API Gateway调用权限到特定端点及CDK实现方案
一、手动修改IAM策略缩小权限范围
默认的AmazonAPIGatewayInvokeFullAccess策略允许调用所有端点,要限制到特定端点,只需修改策略中的Resource字段,指定对应API端点的ARN即可。
AWS API Gateway的资源ARN格式为:arn:aws:execute-api:<区域>:<账号ID>:<API ID>/<阶段>/<HTTP方法>/<路径>
举个实际例子:如果要让用户仅能调用us-east-1区域、账号123456789012下,API ID为xyz789的prod阶段中GET /user-a这个端点,策略可以改成:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke", "execute-api:ManageConnections" ], "Resource": "arn:aws:execute-api:us-east-1:123456789012:xyz789/prod/GET/user-a" } ] }
如果需要匹配该路径下的所有子端点(比如/user-a/profile),可以在路径末尾加通配符:arn:aws:execute-api:us-east-1:123456789012:xyz789/prod/GET/user-a/*。
二、用AWS CDK实现多用户端点权限隔离
完全可以用CDK实现,而且能更高效地管理权限。下面是TypeScript的CDK示例,实现同一HTTP Gateway下两个用户分别只能访问各自的端点:
示例代码
import * as cdk from 'aws-cdk-lib'; import * as iam from 'aws-cdk-lib/aws-iam'; import * as apigateway from 'aws-cdk-lib/aws-apigatewayv2'; export class ApiUserPermissionStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 引用已有的HTTP API(如果是新建API,直接用new apigateway.HttpApi创建即可) const targetHttpApi = apigateway.HttpApi.fromHttpApiAttributes(this, 'TargetHttpApi', { httpApiId: 'xyz789', // 替换成你的API ID apiEndpoint: 'https://xyz789.execute-api.us-east-1.amazonaws.com' }); // 创建用户A及对应权限策略 const userA = new iam.User(this, 'ApiUserA'); const userAPermission = new iam.Policy(this, 'UserAPermission', { statements: [ new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['execute-api:Invoke', 'execute-api:ManageConnections'], resources: [ // 允许调用GET /user-a端点 targetHttpApi.arnForExecuteApi('GET', '/user-a'), // 如需允许子路径,添加下面这行: // targetHttpApi.arnForExecuteApi('GET', '/user-a/*') ] }) ] }); userA.attachInlinePolicy(userAPermission); // 创建用户B及对应权限策略 const userB = new iam.User(this, 'ApiUserB'); const userBPermission = new iam.Policy(this, 'UserBPermission', { statements: [ new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['execute-api:Invoke', 'execute-api:ManageConnections'], resources: [ // 允许调用POST /user-b端点 targetHttpApi.arnForExecuteApi('POST', '/user-b') ] }) ] }); userB.attachInlinePolicy(userBPermission); } }
关键说明
arnForExecuteApi是CDK提供的工具方法,能自动生成符合规范的资源ARN,不用手动拼接,减少出错概率。- 可以根据实际需求调整HTTP方法(GET/POST/PUT等)和路径,也可以用通配符匹配同一前缀下的所有端点。
- 如果是新建HTTP API,直接用
new apigateway.HttpApi(this, 'MyHttpApi', {...})创建实例,再引用即可。
内容的提问来源于stack exchange,提问作者Lloukas
相关产品推荐
相关产品推荐

