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

标签 websocket aws-lambda aws-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 ) 没有提及有关此权限的任何内容,我认为必须像 TOKEN 授权者一样创建 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 权限设置吗?

最佳答案

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

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

关于websocket - 如何使用 CloudFormation for API Gateway 为自定义 Websocket 请求授权方创建 lambda 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747546/

相关文章:

javascript - ng重复:dupes even with track by $index (special case)

amazon-web-services - CloudFront 背后的 AWS API Gateway,转发 header ?

jenkins - 将参数从 cloudformation 作为变量传递到 jenkins 实例中

python - 使用 WebSocket 以字节形式发送带有图像的 JSON

javascript - Socket.io - 客户端断开连接后手动重新连接

websocket - erlang 中带有牛仔和 websocket 的聊天室

angular - AWS Api Gateway 403 错误 - 从所有来源启用 CORS

python - AWS X射线 : Cannot create segments inside Lambda function and segment not found

amazon-web-services - 由于服务 : AmazonElastiCache; Status Code: 400; Error Code: InvalidParameterCombination 导致 Cloudformation 堆栈失败

amazon-web-services - 空的 Cloudformation Stack 会花钱吗?