如何使用CloudFormation for API Gateway为自定义Websocket请求授权者创建lambda权限?

时间:2019-02-18 12:41:09

标签: websocket aws-lambda amazon-cloudformation aws-api-gateway lambda-authorizer

我一直在尝试为API网关和$ connect路由的websockets请求授权者创建lambda权限。 AWS文档没有提及为websocket授权者创建适当的lambda权限。当我尝试连接到我的自定义授权者时,我总是收到500错误。

由于AWS文档(https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-lambda-auth.html)没有提及任何有关此权限的信息,因此我认为必须像令牌授权者一样创建lambda权限。

自定义授权者是使用我的CloudFormation脚本创建的,如下所示:

# ***************************************************************
# API Gateway Websocket Authorizer
# ***************************************************************
WebsocketAuthorizer:
    Type: 'AWS::ApiGatewayV2::Authorizer'
    DependsOn: Lambda
    Properties:
        Name: WebsocketAuthorizer
        ApiId:
            Fn::ImportValue:
                !Sub ${Env}-${AWS::Region}-altosignal-global-websockets
        AuthorizerType: REQUEST
        AuthorizerCredentialsArn:
            Fn::ImportValue: 
                !Sub ${Env}-${AWS::Region}-global-iamprocesscommandsfromapigateway-arn
        AuthorizerUri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Lambda.Arn}/invocations
        IdentitySource: 
            - route.request.querystring.token

当我使用控制台手动创建授权者时,最终会出现以下提示:

enter image description here

一旦我将它与$ connect端点挂钩,便可以手动创建此授权器。

因此,这是我要在CloudFormation脚本中设置的权限。我尝试了以下设置,但不起作用。我不断收到500错误:

   LambdaPermission:
        Type: AWS::Lambda::Permission
        DependsOn: 
            - Lambda
            - WebsocketAuthorizer
        Properties:
            Action: lambda:*
            FunctionName: !GetAtt Lambda.Arn
            Principal: apigateway.amazonaws.com
            SourceArn: !Sub 
                - arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${apiId}/${Env}/$connect
                - apiId: 
                    Fn::ImportValue:
                        !Sub ${Env}-${AWS::Region}-altosignal-global-websockets

有人知道针对websocket API网关$ connect端点的自定义授权者的正确lambda权限设置吗?

2 个答案:

答案 0 :(得分:0)

您肯定需要Lambda许可。这就是我设置权限的方法,并且效果很好。我在这里看到的唯一区别是没有提供SourceArn。希望这将为您提供一个起点。

Permission:
    Type: "AWS::Lambda::Permission"
    DependsOn:
    - "WebsocketApi"
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !GetAtt Lambda.Arn
      Principal:
        Fn::Join:
        - ""
        - - "apigateway."
          - Ref: "AWS::URLSuffix"

答案 1 :(得分:0)

我正在使用samcli,并将其作为授权者的权限,这对我有用。

  AuthorizerFunctionPermission:
    Type: AWS::Lambda::Permission
    DependsOn:
      - WebSocketApi
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: arn:aws:lambda:AWS_REGION:YOUR_ACCOUT_ID:function:AUTHORIZER_FUNCTION_NAME
      Principal: apigateway.amazonaws.com

只需替换AWS_REGION,YOUR_ACCOUNT_ID和AUTHORIZER_FUNCTION_NAME