🔥

Cloud Run で GMP を利用する際の注意点

2023/12/18に公開

TL;DR

この記事は 2023/12/18 にサポートが開始された、Cloud Run の Prometheus サイドカーのマネージドサービスを実装する際の注意点をまとめたものです。

Google Cloud の公式ドキュメント上で設定手順の案内がございますので、そちらに倣って設定をすることで Prometheus サイドカーを作成できます。

Google Cloud での準備をする際

Google Cloud の API

Google Cloud 上で関連する各サービスを利用するには API の有効化が必要です。
以下のように全ての API を有効化するよう事前に設定してください

# 上から順に Cloud Run, Artifact Registry, Secret Manager, Cloud Monitoring/Logging, Cloud Build, IAM を有効化します
gcloud services enable run.googleapis.com
gcloud services enable artifactregistry.googleapis.com
gcloud services enable secretmanager.googleapis.com
gcloud services enable monitoring.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable iam.googleapis.com

Cloud Run のサービスアカウント

デフォルトの場合は特に意識しませんが、Cloud Run は Compute Engine のデフォルトサービスアカウントを使用します。
このアカウントにはロールの自動付与を無効にしていない場合、Google Cloud の基本編集者ロールという広範囲な権限が付与されてしまいます。

反対に、カスタムのサービスアカウントを利用する場合は、少なくとも監視情報を送信するためにroles/monitoring.metricWriterroles/logging.logWriterの権限が必要となります。
さらに、後述するRunMonitoringを構成する際は、Google Cloud Secret Manager を利用するため、roles/secretmanager.adminroles/secretmanager.secretAccessorの権限が必要となります。

Cloud Run サービスにサイドカーを追加する際

RumMonitoringの構成

RunMonitoringは Google Cloud マネージドで Prometheus のコレクターから取得する監視テレメトリデータを生成するためのものです。Kubernetes のPodMonitoringを Cloud Run に利用できる一部の機能のみに限定して提供しています。

そもそもPodMonitoringは Kubernetes の同一名前空間上にあるポッドをスコープとする監視機能で、RunMonitoringでも以下の構成がサポートされています

フィールド 説明 スキーマ 必須
RunMonitoring: metadata すべての永続化リソースが持つ共通のメタデータ metav1.ObjectMeta false
RunMonitoring: spec Cloud Run 用の Prometheus 設定 RunMonitoringSpec true
RunMonitoringSpec: endpoints スクレイピング用のエンドポイント 
HTTP で取得するためのポート・パス・パラメータや取得間隔・タイムアウトなどを設定できる
[] ScrapeEndpoint true
RunMonitoringSpec: targetLabels エンドポイント毎に Prometheus ターゲットに付与されるラベル
instance:<CLOUD_RUN_INSTANCE_ID>がデフォルトで設定される
RunTargetLabels false
RunMonitoringSpec: limits スクレイピング時の制限
データサンプルとラベルの最大数や、ラベル名と値の最大長を制限できる
*ScrapeLimits false
RunTargetLabels: metadata Cloud Run には以下のメタデータが付与される
instance:<CLOUD_RUN_INSTANCE_ID>, revision:<REVISION_NAME>, service:<SERVICE_NAME>, configuration:<CONFIGURATION_NAME>
*[]string false

これらを最小限に設定すると以下のようになります。

apiVersion: monitoring.googleapis.com/v1beta
kind: RunMonitoring
spec:
  endpoints:
  - port: 8080

これらを最大限に設定すると以下のようになります。

apiVersion: monitoring.googleapis.com/v1beta
kind: RunMonitoring
metadata:
  name: max-custom-configuration
spec:
  endpoints:
  - port: 8080
    scheme:
    path: /custom
    params:
     param1: ["<VALUE1>"]
     param2: ["<VALUE2>"]
    interval: 30s
    timeout: 20s
    basicAuth:
      username:
        name: basic-auth-secret
        key: username
      password:
        name: basic-auth-secret
        key: password
    tlsConfig:
      insecureSkipVerify: false
    metricRelabeling:
    - action: replace
      sourceLabels:
      - __address__
      targetLabel: <LABEL_KEY>
      replacement: <LABEL_VALUE>
  targetLabels:
    metadata:
    - service
    - revision
  limits:

上記の yaml ファイルの通り、RunMonitoringの場合は、接頭辞にRunRunMonitoringを記載する必要はありません。単にendpointtargetLabelsのように記載します。

Cloud Run の構成

Cloud Run の構成にはサイドカーの追加の他に、container-dependenciesを追加する必要があります。
これにより、メインアプリケーションの前にサイドカーを起動するように設定できます。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
    run.googleapis.com/launch-stage: ALPHA
    run.googleapis.com/cpu-throttling: 'false'
  name: my-cloud-run-service
spec:
  template:
    metadata:
      annotations:
        run.googleapis.com/execution-environment: gen2
+       run.googleapis.com/container-dependencies: '{"collector":["app"]}'
    spec:
      containers:
      - image: "REGION-docker.pkg.dev/PROJECT_ID/run-gmp/sample-app"
        name: app
        startupProbe:
          httpGet:
            path: /startup
            port: 8000
        livenessProbe:
          httpGet:
            path: /liveness
            port: 8000
        ports:
        - containerPort: 8000
+     - image: "us-docker.pkg.dev/cloud-ops-agents-artifacts/cloud-run-gmp-sidecar/cloud-run-gmp-sidecar:1.0.0"
+       name: collector

サンプルアプリを構築する際

Google Cloud は Cloud Run for GMP のために、サンプルアプリを構築できる GitHub リポジトリを公開しています。
これを利用する際の注意点についても記載していきます。

$ git clone https://github.com/GoogleCloudPlatform/run-gmp-sidecar/

create-sa-and-ar.shを利用する

create-sa-and-ar.sh をそのまま利用すると、デフォルトではus-east1が設定されています。これを変更しても良いですが、clean-up-cloud-run.shも同時に変更するようにしましょう。
同様に、設定されるサービスアカウント名はrun-gmp-saとなります。

$ ./create-sa-and-ar.sh

そのまま sh ファイルを実行すると、エラーが発生します。
これは--conditionを明示的にしていしていないことによるもので、非対話モード(sh ファイルによる実行)ではサポートされていません。--condition=NONEを追加するか、コンソールから直接バインディングのコマンドを入力する必要があります。

cloudbuild-simple.yamlによるビルド

cloudbuild-simple.yamlをはじめとする Cloud Build 用の yaml ファイルで前述の sh ファイルで作成したrun-gmpリポジトリを使用するには、${LOCATION}がリポジトリを作成したリージョンである必要があります。

これが設定されていない場合は、Build step failure: build step 1 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1というエラーが発生します。

gcloud config set compute/region <REGION>

Google Cloud Managed Prometheus で確認する際

サンプルアプリを Cloud Run に作成し、公開された URL にアクセスすると「User request received!」という文字が表示されます。

ある程度リクエストを送信した後に、Cloud Monitoring の Metrics Explorer から Prometheus メトリクスをクエリできます。
ここでは、< >MQL がデフォルトになっているので、< >PromQLを選択しクエリを実行するようにしてください。

PromQL を利用する場合、ビルダー表示からコード表示にする場合に適切に変換できない場合があります。

GitHubで編集を提案

Discussion