Execution failed due to configuration error: API Gateway does not have permission to assume the provided role arn:aws:iam::XXXXXXXXXXXX:role/auth

Execution failed due to configuration error: API Gateway does not have permission to assume the provided role arn:aws:iam::XXXXXXXXXXXX:role/auth

使用 yaml 云形成,我在 AWS::ApiGateway::RestApi 上配置了一个 lambda AWS::ApiGateway::Authorizer。我已经通过控制台成功测试了授权方和网关 API 方法,但是当我使用 curl 访问已部署的 api 时,它失败了,状态代码为 500:

< HTTP/2 500 
< content-type: application/json
< content-length: 16
< date: Fri, 25 Mar 2022 09:45:06 GMT
< x-amzn-requestid: 07f7793c-406c-44c2-b184-dbbfd3f2a4fc
< x-amzn-errortype: AuthorizerConfigurationException
< x-amz-apigw-id: PiNNVFTTPHcFwyA=
< x-cache: Error from cloudfront

我在 API-Gateway-Execution 日志中看到这个错误:

Execution failed due to configuration error: API Gateway does not have permission to assume the provided role arn:aws:iam::XXXXXXXXXXXX:role/auth
Execution failed due to configuration error: Authorizer error

据我了解,API 网关正在尝试执行 lambda 授权方,但没有允许它执行 lambda 的信任关系,尽管如此被授予所述信任:

  lambdaAuthorizerFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      Path: /
      RoleName: auth
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              # allow lambda and apigateway to assume the policies attached to this role
              Service: [ lambda.amazonaws.com, apigateway.amazonaws.com ]
            Action: sts:AssumeRole
      Policies:
        ...

有人可以向我解释一下我做错了什么吗?任何帮助将不胜感激。

更新:

谢谢马辛。这解决了问题,让我从漫长而孤独的努力中解脱出来。

错误 API-Gateway-Execution 日志消息误导了我。它指出 'API Gateway does not have permission to assume the provided role',在没有任何有意义的 AWS 文档的情况下,我的意思是它需要由 AWS::IAM::Role.

中的 AssumeRolePolicyDocument 带来的信任关系

这个问题特别难解决,因为我无法找到关于缺少权限的确切解释,因为它可能引用 'AWS::ApiGateway::Authorizer' 中缺少的 'AuthorizerCredentials'。我试过在那里添加权限没有效果。在我的工作解决方案中,我完全删除了 AuthorizerCredentials。我不清楚这些凭据的实际用途,因为不需要它们。添加它们并没有什么坏处,但并没有解决问题。

我认为缺少的权限也可能与授权方 lambda 的 AssumeRolePolicyDocument 未授予对 apigateway.amazonaws.com 的信任有关,如其他地方所述。但不是。通常情况下,只需要 lambda.amazonaws.com 作为 Principal。

最后,我注意到 Cloud Formation 更新堆栈操作静默无法更新授权者这一事实加剧了这个问题:调试时,从 AWS::ApiGateway::RestApi 和 AWS::ApiGateway::Methods' AuthorizerId 属性默默地保留了授权方。也就是说,在更新删除授权者的情况下,我仍然遇到 'API Gateway does not have permission to assume the provided role' 错误。删除并重新创建堆栈克服了这个障碍。

允许 API 调用您的函数的首选方法是通过 AWS::Lambda::Permission,而不是 IAM 角色。所以你可以创建如下内容:

  permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: apigateway.amazonaws.com
      SourceArn: <arn:aws:execute-api:region>:<accountid>:<api_id>/authorizers/<authorizer_id>