You need to enable JavaScript to run this app. Lambda Authorizer策略无法限制Api Gateway代理资源访问问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Lambda Authorizer策略无法限制Api Gateway代理资源访问问题咨询

结论

这是Lambda Authorizer对接/{proxy+}代理资源时的预期行为,核心原因是API Gateway的IAM策略资源匹配逻辑优先对齐控制台显式声明的资源节点,而非请求实际访问的后端路径。

原因说明

  • 当你把所有接口直接定义在API Gateway内部(也就是你备注中正常运行的场景),平台存在GET /a这个独立的资源节点,你返回的允许arn:aws:execute-api:*:*:*/*/GET/a的策略可以精确匹配到该节点,其余路径的资源节点没有被显式Allow,就会触发IAM的隐式拒绝逻辑,表现符合预期。
  • 当你仅配置了ANY /{proxy+}这一个代理资源节点时,所有请求都会命中这个唯一的资源节点,IAM策略评估时会优先匹配该代理节点的ARN格式:arn:aws:execute-api:<区域>:<账号ID>:<API ID>/<阶段>/*/{proxy+}。你返回的具体路径资源ARN无法匹配到代理节点的ARN模式,再结合IAM策略的评估规则,就会出现你遇到的权限和*通配符一致的问题。

解决方案

如果要在代理资源模式下实现精确路径的权限控制,推荐两种方案:

方案1:调整策略规则,使用显式Deny兜底

IAM策略评估逻辑中显式Deny优先级最高,你可以修改返回的策略,仅允许目标路径,拒绝所有其他路径:

if headerValue == 'a':
    return {
        "principalId": "somebody",
        "policyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "execute-api:Invoke",
                    "Effect": "Allow",
                    "Resource": "arn:aws:execute-api:*:*:*/*/GET/a"
                },
                {
                    "Action": "execute-api:Invoke",
                    "Effect": "Deny",
                    "NotResource": "arn:aws:execute-api:*:*:*/*/GET/a"
                }
            ]
        }
    }

方案2:直接在授权器逻辑中判断路径

你可以从Lambda Authorizer的入参event中解析methodArn字段,提取当前请求的方法和路径,不符合要求直接返回全局Deny策略,避免ARN匹配规则带来的问题:

from urllib.parse import unquote

def lambda_handler(event, context):
    # 解析methodArn获取请求方法和路径
    arn_parts = event['methodArn'].split('/')
    http_method = arn_parts[2]
    path = unquote(arn_parts[3] + '/' + '/'.join(arn_parts[4:]) if len(arn_parts) >4 else arn_parts[3])
    
    headerValue = _get_header_value(event, 'my-header')
    if headerValue == 'a':
        if http_method == 'GET' and path == 'a':
            resource = "*"
        else:
            return {
                "principalId": "somebody",
                "policyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Action": "execute-api:Invoke",
                            "Effect": "Deny",
                            "Resource": "*"
                        }
                    ]
                }
            }
    else:
        resource = "*"
    return {
        "principalId": "somebody",
        "policyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "execute-api:Invoke",
                    "Effect": "Allow",
                    "Resource": resource
                }
            ]
        }
    }

内容的提问来源于stack exchange,提问作者Ken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 09:45:05