如何为 AWS API Gateway Custom Authorizer 提供 Lambda 权限?

Posted

技术标签:

【中文标题】如何为 AWS API Gateway Custom Authorizer 提供 Lambda 权限?【英文标题】:How to provide AWS API Gateway Custom Authorizer a Lambda Permission? 【发布时间】:2019-12-25 14:42:54 【问题描述】:

我有一个 AWS Lambda 函数,在成功将其设置为授权方后,我尝试为其提供权限。

基本上我想在 CloudFromation 中实现以下目标 -

以下是我的 CloudFormation 资源,无法设置权限 -

GWAuthPermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt AuthTest.Arn
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:$AWS::Region:$AWS::AccountId:$ApiGatewayRestApi/authorizers/$AuthTest"

ApiGatewayRestApi - 网关的逻辑 IDAuthTest - 自定义身份验证 lambda 函数的逻辑 ID

【问题讨论】:

试试Serverless,比CloudFormation简单,内部生成cloudformation模板。 serverless.com/framework/docs/providers/aws/events/apigateway/… @Gangaraju 实际上,由于多个供应商和不同的开发人员偏好,有些人更喜欢 SAM,有些人更喜欢无服务器,所以 Cloidformation 被决定为基础设施设置的标准。 您仍然可以尝试无服务器来生成 CloudFormation 模板并将生成的代码复制到您的项目中。 【参考方案1】:

我能够通过以下方式解决它 -

添加了AWS::ApiGateway::Authorizer资源, 并将其转介给AWS::Lambda::Permission

代码 -

GWAuth:
    Type: AWS::ApiGateway::Authorizer
    Properties: 
      AuthorizerUri: !Sub "arn:aws:apigateway:$AWS::Region:lambda:path/2015-03-31/functions/$AuthLambda.Arn/invocations"
      RestApiId: !Ref ApiGatewayRestApi
      Type: "REQUEST"
      IdentitySource: method.request.header.authorization
      Name: custom_auth

  GWAuthPermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt AuthLambda.Arn
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:$AWS::Region:$AWS::AccountId:$ApiGatewayRestApi/authorizers/$GWAuth"

【讨论】:

以上是关于如何为 AWS API Gateway Custom Authorizer 提供 Lambda 权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?

如何为 API Gateway Websocket 编写 Java Lambda 处理程序?

AWS:如何为自定义域名配置 Cloudfront

如何为 AWS RDS 凭证创建配置文件并将其导入我的 AWS Lambda API?

如何为 AWS 放大 GraphQL API 添加服务器端业务逻辑?

如何为 Alexa Skills Kit 和 API.AI 使用单个 AWS Lambda?