CONTENTS
Rust で gRPC
Rust で gRPC するために tonic を使用する。
protocol buffers からコードを生成したり、サーバーコードを書いたり、クライアントコードを書く。 この時に苦労したこととかあったはずだけど、仕事で忙しくしているうちに失われてしまった。 仕事が忙しくても、新しいことをしたときはブログにまとめるべきなんだ。 反省。
TLS 対応
この記事にある通り、TLS で通信するためにはクライアントの接続設定で TLS 用の設定をしなければならない。
let tls = ClientTlsConfig::new() .domain_name("example.com"); let channel = Channel::from_static("https://example.com") .tls_config(tls)? .connect() .await?;
example.com の部分に Cloud Run の URL が入る。
Cloud Run の認証に対応
ドキュメントによれば、認証ありの Cloud Run に接続するためには authorization メタデータを送信する必要がある。
let request: tonic::Request; let token: String; request.metadata_mut().insert( "authorization", tonic::metadata::MetadataValue::from_str(&format!("Bearer {}", token))?, );
token は google のメタデータサーバーから取得できる。 (gRPC リクエストを発行するプロセスも Cloud Run で稼働している前提)
let service_url: String; let mut request_url = reqwest::Url::parse("http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity")?; request_url.set_query(Some(&format!("audience={}", service_url))); let request = reqwest::Client::new() .get(request_url) .header("Metadata-Flavor", "Google"); let response = request.send().await?; let token = response.text().await?;
ここでは reqwest を使用して http リクエストを発行している。
service_url
には、アクセス先の gRPC サービス URL を指定する。
ちなみに、「すべてのトラフィックを許可」しないといけない。
まとめ
Rust で Google Cloud Run に認証ありでデプロイされている gRPC サービスに接続する方法をまとめた。
忙しくしているうちに色々調べてつまづいた記録が失われてしまった。 本当はその情報が欲しかったのだけどしょうがないね。