📦

Cloud Run のマルチコンテナ (サイドカー) の基本

2023/12/19に公開

2023年は「Cloud Run を触って覚える」をテーマとした ひとりアドベントカレンダー を開催しており、Cloud Run のさまざまな機能や Cloud Run でよく使う構成などをご紹介しています。

19日目は マルチコンテナ (サイドカー) の基本的な使い方についてご紹介します。またユースケースやブログなどの参考情報についてもまとめました。

Cloud Run の概要は「gihyo.jp」で解説していますので、こちらもぜひご覧ください。

https://gihyo.jp/article/2023/10/modern-app-development-on-google-cloud-03

マルチコンテナ (サイドカー) とは

これまで Cloud Run サービスでは、サービスのリビジョンごとに1つのコンテナ イメージを指定し、コンテナ インスタンスは1つのコンテナ イメージをもとに起動していました。マルチコンテナでは リビジョンごとに複数のコンテナ イメージを設定 することができ、メインのコンテナ以外にサブのコンテナをコンテナ インスタンスごとに起動できるようになりました。

ユースケースとしては、ログやメトリクスのエージェントや Nginx などのプロキシ レイヤー、Cloud SQL Auth Proxy などが挙げられます。こういったユースケースは1つのコンテナでも実現自体は可能ですが、コンテナを分離することでメインとなるコンテナにエージェントなどを都度インストールする必要がなくなったり、サブコンテナを複数のサービスで使いまわしたりすることが可能です。

マルチコンテナは2023年5月にプレビューの提供を開始し、2023年11月に GA されました。

https://cloud.google.com/blog/ja/products/serverless/cloud-run-now-supports-multi-container-deployments?hl=ja

クイックスタート

サンプルの hello コンテナに Nginx のコンテナを加える例を試してみましょう。Cloud Shell を起動します。

Cloud Shell の起動
Cloud Shell の起動

Nginx のコンテナ イメージをビルドします。nginx_confDockerfile を作成します。/ の場合は Nginx のデフォルト画面を、/hello の場合は hello コンテナを表示するように設定しています。

nginx_conf
server { 
  listen 8080;
  server_name frontend;

  location / {
    root /usr/share/nginx/html;
  }

  location /hello {
    proxy_pass http://127.0.0.1:8888;
  }
}
Dockerfile
FROM nginx:latest
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

次のコマンドで、Cloud Build を使ってコンテナ イメージをビルド、プッシュします。

gcloud builds submit \
  --region=asia-northeast1 \
  --tag gcr.io/<PROJECT_ID>/nginx-sample .

次に Cloud Run サービスをコンソールから作成します。

サービス作成

[コンテナ イメージの URL] は先ほど登録した Nginx のコンテナ イメージを選択します。

コンテナ イメージの URL の設定
コンテナ イメージの URL の設定

[サービス名] は hello-with-nginx に、リージョンは asia-northeast1 に設定します。

サービス名とリージョンの設定
サービス名とリージョンの設定

[認証] は [未認証の呼び出しを許可] を設定します。

認証の設定
認証の設定

[コンテナ ポート] は 8080 のままで問題ありません。

コンテナ ポートの設定
コンテナ ポートの設定

[コンテナを追加] をクリックします。

コンテナの追加
コンテナの追加

コンテナ イメージの URL は us-docker.pkg.dev/cloudrun/container/hello を設定します。

コンテナ イメージの URL の設定
コンテナ イメージの URL の設定

[コンテナの起動順序] の [以下のコンテナに依存] で、Nginx のコンテナを選択します。このようにすることで、hello コンテナは Nginx コンテナが起動してから起動するようになります。

コンテナの起動順序の設定
コンテナの起動順序の設定

[変数とシークレット] タブを開き、環境変数に PORT を追加します。値は 8888 にします。

環境変数の設定
環境変数の設定

最後に [作成] をクリックします。

作成
作成

実際にアクセスしてみましょう。ルートは Nginx のデフォルト画面が開きます。

Nginx コンテナ
Nginx コンテナ

/hello パスを追加すると hello コンテナのアプリケーションが開きます。

hello コンテナ
hello コンテナ

ユースケース

ユースケースごとに、チュートリアルやブログが公開されています。

PHP アプリケーション (Nginx + PgAdapter)

同僚の Shingo-san が PHP アプリケーションでよく使う構成である Nginx と PgAdapter のマルチコンテナを検証したブログを公開しています。下記についても検証しているので参考にしてください。

OpenTelemetry Collector

同僚の Yoshi-san が OpenTelemetry Collector をマルチコンテナとして動かし、テレメトリを Cloud Trace と Sentry に送るブログを公開しています。OpenTelemetry を使われている場合は非常に参考になると思います。

GMP

メトリクスを GMP (Google Cloud Managed Service for Prometheus) 経由で収集するコンテナが提供されるようになりました。Prometheus 形式でのメトリクス収集の最も簡単な方法になると思います。

下記は AoTo-san による、注意点をまとめたブログです。こちらもぜひ参考にしてください。

Datadog

AoTo-san による Cloud Run 用の Datadog Agent を活用してマルチコンテナ化を検証されたブログです。Cloud Run 用の Datadog Agent は現在ベータ版として提供されていますが、正式リリースされたら Datadog を使う上でのスタンダードになりそうですね。

AlloyDB Auth Proxy & Cloud SQL Auth Proxy

Auth Proxy は DB との接続に IAM による認証・認可を加えることができる機能です。コンテナとしても提供しているので、マルチコンテナとしてデプロイが可能です。

Envoy + Open Policy Agent による認証・認可

Keycloak でログイン機能を実装し、Envoy と Open Policy Agent を使った認証・認可の処理を分離している記事です。特に認可処理は複数の Cloud Run サービスで必要になる場面もありますので、マルチコンテナによるメリットはかなり大きいと思います。

参考情報

マルチコンテナについての公式ドキュメントのリンクをまとめました。マルチコンテナの各機能について詳しく知りたい場合は参考にしてください。

まとめ

コンテナを分離することで、メインのコンテナをシンプルに保つことができたり、ミドルウェアとなるコンテナを Cloud Run サービス間で共通化したりすることができます。ぜひ活用してみてください。

Google Cloud Japan

Discussion