You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:25:31