grpc-webとenvoyの間の通信のhttps化を試した。
grpc-webの公式には、httpでenovyの設定は載っていて、 envoyの公式には、httpsでの接続のための設定は載っているので、 基本的にはそれらを組み合わせるだけでうまくいった。
envoy.ymlを張っておく。 この例では、grpcのリクエストを8080のポートでenvoyは受け付けて、 httpでgrpc-server:9090へ中継する。
admin: access_log_path: /tmp/admin_access.log address: socket_address: { address: 0.0.0.0, port_value: 9901 } static_resources: listeners: - name: listener_0 address: # grpc-web listen port from client js socket_address: { address: 0.0.0.0, port_value: 8080 } filter_chains: - filters: - name: envoy.filters.http_connection_manager config: codec_type: auto stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: local_service domains: - "*" routes: - match: { prefix: "/" } route: cluster: grpc_service max_grpc_timeout: 0s cors: allow_origin_string_match: - prefix: "*" allow_methods: GET, PUT, DELETE, POST, OPTIONS allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout max_age: "1728000" expose_headers: custom-header-1,grpc-status,grpc-message http_filters: - name: envoy.filters.http.grpc_web - name: envoy.filters.http.cors - name: envoy.filters.http.router tls_context: common_tls_context: tls_certificates: - certificate_chain: filename: "/etc/letsencrypt/live/XXXX/fullchain.pem" private_key: filename: "/etc/letsencrypt/live/XXXX/privkey.pem" clusters: - name: grpc_service connect_timeout: 0.25s type: logical_dns http2_protocol_options: {} lb_policy: round_robin hosts: [{ socket_address: { address: grpc-server, port_value: 9090 }}]
corsなどは、がばがばなので適宜絞っていく必要はある。
TLSの証明書には、let's encryptを使っているが、これは別にnginxを立てた。