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>
使用 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>