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

使用AWS SAM配置API Gateway的IAM认证遇权限问题及疑问

关于API Gateway AWS_IAM认证及Lambda权限配置的问题与解决

问题背景

用户提供了如下SAM模板,用于创建带AWS_IAM认证的API Gateway和关联的Lambda函数:

MyDemoLambdaApiFunction:
  Type: AWS::Serverless::Function
  Properties:
    Description: >
      Currently does not support S3 upload event.
    Handler: app.lambda_handler
    Runtime: python3.11
    CodeUri: .
    MemorySize: 1028
    Events:
      MyDemoAPI:
        Type: Api
        Properties:
          RestApiId: !Ref api
          Path: /gtl
          Method: GET

MyDemoLambdaInvokePermission:
  Type: 'AWS::Lambda::Permission'
  Properties:
    FunctionName: !GetAtt MyDemoLambdaApiFunction.Arn
    Action: 'lambda:InvokeFunction'
    Principal: apigateway.amazonaws.com
    SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${api}/*/*'

api:
  Type: AWS::Serverless::Api
  Properties:
    Name: "myTestApi"
    StageName: api
    TracingEnabled: true
    OpenApiVersion: 3.0.2
    Auth:
      DefaultAuthorizer: AWS_IAM
      InvokeRole: NONE
      ResourcePolicy:
        CustomStatements:
          - Effect: 'Allow'
            Action: 'execute-api:Invoke'
            Resource: ['execute-api:/api/gtl']
            Principal: "*"

直接从浏览器调用API URL时收到错误:

{"message":"Missing Authentication Token"}

移除DefaultAuthorizer配置后可正常调用,但用户希望仅允许自身AWS账户内的身份调用API,尝试将ResourcePolicy的Principal改为指定IAM角色ARN也无效,同时疑问:创建AWS::Lambda::Permission时,何时该用AWS_IAM认证?

问题分析与解决

1. "Missing Authentication Token"错误原因

当API Gateway启用AWS_IAM默认授权器时,所有请求必须携带有效的AWS签名认证信息(如通过AWS SDK生成的Authorization请求头)。直接从浏览器访问URL时没有携带这些签名,因此触发认证失败错误。

2. 实现仅允许自身AWS账户调用API的正确配置

你的ResourcePolicy存在两处错误:

  • 资源格式错误:execute-api的资源ARN必须遵循arn:aws:execute-api:<region>:<account-id>:<api-id>/<stage>/<method>/<path>格式,你写的execute-api:/api/gtl不符合规范
  • 主体配置逻辑错误:要限制仅自身账户内的IAM实体调用,需通过aws:PrincipalAccount条件实现,而非直接指定Principal为角色ARN

修正后的ResourcePolicy示例:

ResourcePolicy:
  CustomStatements:
    - Effect: 'Allow'
      Action: 'execute-api:Invoke'
      Resource: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${api}/${StageName}/GET/gtl'
      Principal: "*"
      Condition:
        StringEquals:
          aws:PrincipalAccount: !Sub '${AWS::AccountId}'

此配置后,仅来自你AWS账户的IAM身份(用户、角色等)在提供有效签名的情况下,才能调用该API。

3. AWS::Lambda::Permission与AWS_IAM认证的关系

AWS::Lambda::Permission是用来授权API Gateway服务调用你的Lambda函数,和API Gateway对客户端的AWS_IAM认证是两个独立环节:

  • 只要用API Gateway触发Lambda,就必须配置这个权限,允许apigateway.amazonaws.com作为主体调用Lambda,这和客户端是否使用IAM认证无关
  • 你当前的MyDemoLambdaInvokePermission配置是正确的,它仅负责打通API Gateway到Lambda的权限,不影响客户端的认证逻辑

4. 浏览器调用的可行方案

如果需要从浏览器直接调用且保持IAM认证,需:

  • 使用AWS Amplify、AWS SDK for JavaScript等工具,让前端获取临时IAM凭证并生成签名请求
  • 为前端用户创建对应的IAM角色/用户,分配允许调用该API的权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:48:33