コンテンツに移動
サーバーレス

Cloud Run でサイドカーのデプロイが可能に - モニタリング エージェントやプロキシなどに最適

2023年6月6日
Google Cloud Japan Team

※この投稿は米国時間 2023 年 5 月 24 日に、Google Cloud blog に投稿されたものの抄訳です。

Cloud Run はフルマネージド型のコンテナ ランタイムで、コンテナ内のコードをゼロから適切な数のインスタンスに自動スケールして、受信リクエストすべてに対応できるようにします。これまで、Cloud Run サービス内のインスタンスはそれぞれ、1 つのコンテナで実行されていました。このたび Cloud Run サイドカーが導入され、ウェブ リクエストを処理するメインコンテナの他に、独立したサイドカー コンテナを起動して実行できるようになりました。

Cloud Run サイドカーの利用例を以下に示します。

  • アプリケーションのモニタリング、ロギング、トレーシングを行う

  • アプリケーション コンテナの前面で Nginx、Envoy、または Apache2 をプロキシとして使用する

  • 認証や承認用のフィルタを追加する(例: Open Policy Agent)

  • アウトバウンド接続用のプロキシを実行する(Alloy DB Auth プロキシなど)

https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudrun01.max-2000x2000.png

同じインスタンス内のコンテナはすべて同じネットワーク名前空間を共有し、「localhost:port」という形式で互いに通信できます(ポートには、各コンテナがリッスンしているポート番号を指定します)。また、共有ボリュームを使って、コンテナ間でファイルを共有することもできます。

Cloud Run サイドカーによって、カスタム モニタリングや、ロギング、ネットワーキング、セキュリティなど、新しいパターンや用途が広がります。以下に例を示します。

アプリケーション モニタリング、ロギング、トレーシング用のサイドカー

サイドカーは、メインコンテナと並行して実行される追加のコンテナです。サイドカーを使用すれば、Cloud Run サービスに OpenTelemetry などのカスタム エージェントを追加し、ログや、指標、トレースを任意のバックエンドにエクスポートすることができます。以下の例では、Cloud Run サービスのデプロイに OpenTelemetry サイドカーを追加し、カスタマイズしたログ、指標、トレースをエクスポートしています。
https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudrun02.max-1300x1300.png

プロキシ

メインコンテナの前面で、プロキシ リクエスト用のコンテナを実行することもできます。たとえば、以下の例のようにして、DockerHub の公式の Nginx イメージを使用できます。このようなプロキシは抽象化レイヤとしての役割を果たします。具体的には、リクエストをインターセプトして適切なエンドポイントに転送することで、クライアントとサーバー間でアプリケーションへのトラフィックを効率よく流すために役立ちます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudrun03.max-1500x1500.png

nginx サイドカーを含む service.yaml の例を以下に示します。

読み込んでいます...

以下は gzip 圧縮を行う nginx_config で、Secret Manager 内に「nginx_config」というシークレット名で格納されています。

読み込んでいます...

上記の例では、以下の 2 つのコンテナをデプロイしています。

  1. ウェブページの処理を担当する hello コンテナ

  2. この hello コンテナの受信リクエストに対してプロキシの役割を果たす nginx コンテナ

nginx config を渡すために、Secret Manager に格納し、nginx コンテナの特定の場所でそれをマウントしています。または、run.googleapis.com/container-dependencies というアノテーションを使って、コンテナをオーダーするという方法をとることもできます。この方法なら、nginx コンテナを hello コンテナより先に確実に起動して、トラフィックを常に nginx プロキシに流すことができます。

ネットワークとセキュリティ

サイドカーを使って、高度なネットワーキング処理を行うことも可能です。たとえば、Envoy プロキシをホストして、高度なトラフィック ルーティングやフィルタリングを行うことができます。または、セキュリティ強化用のサイドカーを実行して、トラフィックをインターセプトし、検出および攻撃防止を常時行うようにすることもできます。
https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudrun04.max-1600x1600.png

このようなパターンの一例として、サイドカーを使ってデータ取り込みツールに変更を加えた Nasdaq の事例があります。

「当社では、チャンク化されていない HTTP1 リクエストが、上限の 32 MB に達してしまうという問題を抱えていました。この問題を回避するため、HTTP2 リクエストを受け付けることにしましたが、そのためには本格的なコード リファクタリングが必要となります。そこで、フロントエンドとバックエンドのコードベースへの変更を最小限に抑えるため、Envoy を使って HTTP2 受信リクエストを HTTP1 に書き換えて、バックエンド サービスに直接転送することにしました。Cloud Run サイドカーのおかげで、無事にこれを実装できました。具体的には、Envoy サイドカーを使用し、リクエスト ペイロードが 32 MB を超える HTTP2 受信トラフィックを HTTP1 のアプリケーションに直接リダイレクトしています。これにより、コードに変更を加えずに済み、エンジニアリング費用も大幅に節約できました」 - Nasdaq、ソフトウェア エンジニアリング ディレクター Philippe Trembley 氏

データベース接続用プロキシ

サイドカーを使って、アプリケーションと並行して CloudSQLAlloyDB などのデータベース クライアント プロキシを実行することもできます。それにより、安全性の高い接続や、簡単な承認処理、IAM ベースの認証経由で、これらの周辺データベース サービスにすぐに接続することができます。
https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudrun05.max-1900x1900.png

使ってみる

メインコンテナにプロキシやサイドカーを追加するには、コマンドラインまたは Cloud コンソールから、お使いの Cloud Run サービスの YAML を編集する必要があります。詳しくはドキュメントをご覧ください。また、複数のコンテナで共有可能なメモリ内ボリュームを作成して、コンテナ間でデータを共有することもできます。

Cloud Run は、サービスの実行に大変便利です。サイドカーとプロキシを使用することで、Cloud Run でできることがいっそう広がります。ご利用の Cloud Run サービスでサイドカーを構成する方法については、こちらをご覧ください。

- Google Cloud サーバーレス担当プロダクト マネージャー Sagar Randive

投稿先