🔍

Cloud Run アプリのパケットキャプチャをしよう

に公開

こんにちは、Cloud Support の Rnrn です。去年はアドベントカレンダー(物理) を買うか悩んでいるうちに冬が終わった 私ですが、11 月 30 日にダメ元で店頭に立ち寄ったところ 1 個だけ残っていたので今年はついにチョコレートのアドベントカレンダーを買いました。今日はナッツプラリネでした🫒

今回の記事では PCAP サイドカー (pcap sidecar) による、 Cloud Run にデプロイしたアプリケーションのパケットキャプチャについてご紹介します。

3 行でまとめると
・Cloud Run アプリケーションの外向き通信が急に失敗し始めた時トラブルシューティング に有効です
・稼働しているアプリケーション本体およびそのコードに変更・影響を与えることなく動作します
・OSS のコンテナをサイドカーとしてデプロイするだけなので、すぐに使い始められます

それではいきましょう!

PCAP サイドカーの概要

PCAP サイドカーは Cloud Run のサイドカーを利用してデプロイし、同じネットワーク Namespace 内で tcpdump を使用してパケット キャプチャを実行することで Cloud Run アプリケーションのパケットキャプチャを実現するためのコンテナイメージです。

このコンテナイメージは Google Cloud の公式プロダクトではありませんが、Google のサポートエンジニアが中心となって開発され、Github で OSS プロジェクト として公開されています。

Cloud Run のサイドカーについては 2023年のYukiさんの記事 で紹介していますので、公式へのリンクも含めそちらをご参照いただければと思いますが、簡単に言うと 1 つのリビジョンの中にアプリケーションのコードを含むメインコンテナとは別のサブコンテナを追加でデプロイすることができる機能です。それぞれはそれぞれに割り当てたリソースを使用するため、CPU やメモリが競合する心配はありません。また、あくまで独立したコンテナを追加するだけなので、メインのアプリケーションコードやそのコンテナに変更を加えることなく使えます。

PCAP サイドカーでできること

  • Cloud Run (第 1 世代および第 2 世代実行環境) のパケットキャプチャ
  • ARP, ICMP, TCP, UDP の分析やフロー ID を使用した一連の通信の紐付け
  • 分散トレース コンテキスト によるパケットのリンクや HTTP/1.1 および HTTP/2 の分析
  • シンプルなフィルタ・複雑な BPF フィルタを使用したパケットのフィルタリング (※PCAP_FILTERで定義する BPF フィルタリング は Cloud Run 第 2 世代 のみのサポート)
  • tcpdump*.pcap および JSON 変換されたパケットファイルの Google Cloud Storage (GCS) へのエクスポート

より詳しくは README > Features をご参照ください。

PCAP サイドカーが活躍する場面

PCAP サイドカーは以下のような場面で有効なトラブルシューティング手段となります。

  • Connection Timeout、Connection Reset、TLS Handshake error、Unreachable Host/Network error などのエラーが発生した時
  • ルーティングやファイアウォールによるネットワーク分断が疑われる時
  • トークンのリクエストとレスポンスなどメタデータサーバーのオペレーションを調べたい時
  • 内向き通信でコンテナが受信しているもの (HTTP メッセージ) を調べたい時
  • アプリケーションから想定外の HTTP レスポンスが返却されて問題が発生している時
  • 無効なフォワードプロキシ構成による問題が疑われる時

PCAP サイドカーの使い方

  1. まずはイメージを選択します。イメージには第 1 世代向けと第 2 世代向けがあり、Cloud Run 第 2 世代はどちらも利用可能ですが、第 1 世代は第 1 世代向けを使う必要があります。特に細かなバージョンの指定がない場合は以下のタグを使えば問題ありません。

    1. Cloud Run 第 1 世代向けイメージ: latest
    2. Cloud Run 第 2 世代向けイメージ: newest

    例: us-central1-docker.pkg.dev/pcap-sidecar/pcap-sidecar/pcap-sidecar:latest

  2. 環境変数を設定してデプロイします。最低限必要な変数と Cloud Logging に結果を出力するのに必要な変数を設定します。絶対に変える必要があるところ以外はサンプルの値をいれておきますね。

export PROJECT_ID='' # プロジェクトID
export SERVICE_NAME='cloudrun-pcaptest' # デプロイ先の Cloud Run サービス名
export SERVICE_REGION='asia-northeast1' # デプロイ先の Cloud Run リージョン
export SERVICE_ACCOUNT=''        # Cloud Run のサービスアカウント
export INGRESS_CONTAINER_NAME='cloud-run-main-container' # メインのコンテナ名
export INGRESS_IMAGE_URI='' #メインのコンテナのイメージ
export INGRESS_PORT=8080 # メインのコンテナのポート
export PCAP_SIDECAR_NAME='sidecar'      # PCAPサイドカーコンテナの名前
export PCAP_SIDECAR_IMAGE_URI='us-central1-docker.pkg.dev/pcap-sidecar/pcap-sidecar/pcap-sidecar:latest' # PCAPサイドカーのイメージ
export PCAP_JSON_LOG='true' # オプショナルの設定 (キャプチャを JSON に変換して Cloud Logging に出力する)

デプロイコマンドを実行します。

gcloud run deploy ${SERVICE_NAME}   --project=${PROJECT_ID}   --region=${SERVICE_REGION}   --service-account=${SERVICE_ACCOUNT}   --container=${INGRESS_CONTAINER_NAME} --image=${INGRESS_IMAGE_URI}   --port=${INGRESS_PORT}   --container=${PCAP_SIDECAR_NAME}   --image=${PCAP_SIDECAR_IMAGE_URI}   --cpu=1 --memory=1G 

これだけです!デプロイが完了すると以下のように PCAP サイドカーが立ち上がっている様子を確認することができます。

PCAP サイドカーのログにしぼりたいときは、labels.container_name を使うとフィルタすることができます。

resource.type = "cloud_run_revision"
resource.labels.service_name = "cloudrun-pcaptest" # サービス名
resource.labels.location = "asia-northeast1" # リージョン
labels.container_name="sidecar" # サイドカーのコンテナ名

Tips として、Cloud Support では皆様の GCS にアップロードされたファイルを確認することはできないため、もし PCAP sidecar で収集した情報を添えてサポートケースを起票いただく際には、上記のように Cloud Logging に出力いただくか、ファイルを直接サポートケースに添付いただけるとスムーズです。

PCAP サイドカーを使う前に

GCS のどのロケーションにファイルが保存されるかであったり、サイドカーの min_instance の設定など事前に確認しておくと良い点が Github の Considerations に記載されているのでご一読いただくことをおすすめします。

特に重要と思われる点をいくつかピックアップします。

  1. PCAP サイドカーによるパケットキャプチャはインスタンスの稼働中常に行われることになるため、基本的に調査に必要な情報が取得できたらサイドカーのないリビジョンにロールバックするのがおすすめです。性質上、常に有効化しておくものではなく、必要な時にデプロイして用が済んだら削除する使い方が想定されています。
  2. PCAP サイドカーそのものは OSS として公開されているコンテナイメージで、そのものにコストは発生しませんが、GCS へのファイルの保存や Cloud Logging への出力はそれぞれにコストが発生する操作である点にご注意ください。

最後に

GKE / GAE Flex で PCAP サイドカーを使う方法や、Advanced Options、PCAP ファイルをマージする方法など、README には更に詳しい情報がいろいろと載っています。もしなにか使っていて問題を見つけたり、困ったりしたことがあれば気軽に Issue を立ててみてくださいね!

Cloud Support 発のツールに興味がある方は KHI の記事もおすすめです。
また、アドベントカレンダーの他の記事にも興味のある方はこちらからぜひどうぞ。

Google Cloud Japan

Discussion