AWS SAM:如何对WebSocket和HTTPS lambda使用相同的API网关?

问题描述

我一直在将AWS SAM用于websocket API,并且运行良好。今天,我需要添加一个HTTPS API,但是尝试这样做会导致在另一个子域下创建一个新的API网关。我希望他们共享同一个域,因此用户只需要更改协议(从HTTPS到WSS)。

这是我的template.yaml的相关部分:

  # This seems to implicitly create and use a `ServerlessRestApi` API gateway
  PingLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: lambda/
      Handler: app.pingHandler
      Runtime: nodejs12.x
      Events:
        Ping:
          Type: Api
          Properties:
            Path: /ping
            Method: get

  # I use this for the varIoUs websocket lambdas,works like a charm
  WebSocketApi:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: SimpleRelayWebSocket
      ProtocolType: WEBSOCKET
      RouteSelectionExpression: \\$default

# ...

# I'd love both of these to use the same subdomain/API gateway setup
Outputs:
  APIURL:
    Description: URL of the Simple Relay HTTPS API
    Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${Stage}'
  WebSocketURL:
    Description: URL of the Simple Relay WSS API
    Value: !Sub 'wss://${WebSocketApi}.execute-api.${AWS::Region}.amazonaws.com/${Stage}'

考虑到WebSocketApi设置了ProtocolType: WEBSOCKET,我不确定该如何进行。是否有某种方法可以将API分成具有不同协议的多种功能,或者我还缺少其他功能

解决方法

我需要做同样的事情。一种可能的解决方案是将两者都放在 CloudFront 分配之后。我可能会这样做,因为我已经在使用 CloudFront 为来自 S3 的前端和一些后端端点提供服务。