通过AWS ALB(应用负载均衡器)使用GRPC API。

0

【以下的问题经过翻译处理】 你好,我正在尝试在ECS(在Fargate上)上运行一个带有GRPC API的Netty服务器,并将其放在应用负载均衡器后面,以便Android GRPC客户端可以连接到它。调用被转发了,但服务器日志显示了一个错误,类似于:

io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 1603010102010000fe03036a5663244616ee784100b9d61c

我了解到这样的错误可能与客户端和服务器都未使用SSL有关,就我而言,这可以说是正确的。

服务器本身未配置为使用SSL(我不知道要部署哪个证书)。不过,我预期ALB已经配备了一个ACM公共证书,并且应该进行SSL卸载。然而,无法在协议版本为GRPC时将负载均衡目标组配置为除HTTPS以外的其他协议,这表明情况并非如此。

有人能向我澄清这一点,或者提供一个可行的示例吗?任何帮助将不胜感激。

这是我CFN模板中相关的ALB配置:

 ApplicationLoadBalancer:
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
    Properties:
      Name: my-alb
      Scheme: "internet-facing"
      Type: "application"
      Subnets:
        - !Ref public-sn-1
        - !Ref public-sn-2
      SecurityGroups:
        - !Ref ALBSecurityGroup
      IpAddressType: "ipv4"

  HubListener:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 50051
      Protocol: HTTPS
      SslPolicy: "ELBSecurityPolicy-2016-08"
      Certificates:
        - CertificateArn: !Ref AlbCertificateArn
      DefaultActions:
        - Order: 1
          TargetGroupArn: !Ref HubTargetGroup
          Type: "forward"

  HubTargetGroup:
    Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
    Properties:
      Port: 50051
      Protocol: HTTPS
      ProtocolVersion: GRPC
      HealthCheckEnabled: true
      HealthCheckPath: "/grpc.health.v1.Health/Check"
      HealthCheckPort: "traffic-port"
      HealthCheckProtocol: HTTP
      TargetType: ip
      Matcher:
        GrpcCode: 0
      VpcId: !Ref VpcId
profile picture
专家
已提问 2 年前73 查看次数
1 回答
0

【以下的回答经过翻译处理】 您正在将目标组配置为HTTPS,这可能是您收到此错误的原因。您可以将目标组配置为HTTP,这样应该可以成功连接:

HubTargetGroup:
    Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
    Properties:
      Port: 50051
      Protocol: HTTP #从HTTPS更改而来
      ProtocolVersion: GRPC
      HealthCheckEnabled: true
      HealthCheckPath: "/grpc.health.v1.Health/Check"
      HealthCheckPort: "traffic-port"
      HealthCheckProtocol: HTTP
      TargetType: ip
      Matcher:
        GrpcCode: 0
      VpcId: !Ref VpcId

仅供参考,此博客文章与您描述的设置非常相似,但是通过控制台进行操作:https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/

profile picture
专家
已回答 2 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则