使用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
相关产品推荐
相关产品推荐

