如何在gRPC请求中向AWS ALB传递Host头以实现内容路由
问题根因
你遇到的问题核心是gRPC Python客户端的Host(HTTP/2里对应:authority伪头)不由你在请求metadata里传入的host字段控制,而是默认取创建安全通道时填入的域名,你手动加的host会被识别为自定义元数据,AWS ALB的Host头匹配规则不会读取这个字段,所以永远触发不了匹配,只会走默认规则。
修复方案
创建gRPC安全通道时,新增grpc.ssl_target_name_override通道参数,指定你要匹配的Host值qa.mydomain.com即可,修正后的代码如下:
import json import grpc import base64 from lib import unified_pb2 from lib import unified_pb2_grpc # Setup alb_domain = 'internal-test-lb-micky-18886655.us-east-2.elb.amazonaws.com' target_host = 'qa.mydomain.com' with open('server.crt', 'rb') as f: trusted_certs = f.read() credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs) # 新增ssl_target_name_override参数指定Host头,ALB会读取该值做路由匹配 channel = grpc.secure_channel( f'{alb_domain}:443', credentials, options=[('grpc.ssl_target_name_override', target_host)] ) # 不需要在metadata里手动传host参数 cf_greeters_stub = unified_pb2_grpc.GreetersStub(channel) cf_request = unified_pb2.Request() cf_request.cf_greeters_request.greeter_text = "hello" data = cf_greeters_stub.GetResponse(cf_request) print(data)
额外配置校验项
如果修改后还是不生效,确认ALB侧配置符合要求:
- ALB 443监听器的规则中,Host头匹配值要准确填写
qa.mydomain.com,不要带端口、路径等多余内容 - 关联的目标组协议需要配置为
gRPC或者HTTP/2,否则ALB无法正确解析gRPC请求 - 你使用的自签名证书需要在SAN(主题备用名称)中包含
qa.mydomain.com,否则TLS握手阶段会报域名不匹配错误,生产环境不要关闭证书校验。
内容的提问来源于stack exchange,提问作者Mickey Mouse
相关产品推荐
相关产品推荐

