げっとシステムログ

WEB開発メモ

Rust で gRPC を Google Cloud Run で

CONTENTS
  1. Rust で gRPC
  2. TLS 対応
  3. Cloud Run の認証に対応
  4. まとめ
  5. 参考資料

Rust で gRPC

Rust で gRPC するために tonic を使用する。

protocol buffers からコードを生成したり、サーバーコードを書いたり、クライアントコードを書く。 この時に苦労したこととかあったはずだけど、仕事で忙しくしているうちに失われてしまった。 仕事が忙しくても、新しいことをしたときはブログにまとめるべきなんだ。 反省。

TOP

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 が入る。

TOP

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 を指定する。

ちなみに、「すべてのトラフィックを許可」しないといけない。

TOP

まとめ

Rust で Google Cloud Run に認証ありでデプロイされている gRPC サービスに接続する方法をまとめた。

忙しくしているうちに色々調べてつまづいた記録が失われてしまった。 本当はその情報が欲しかったのだけどしょうがないね。

TOP

参考資料

TOP