Cloud Run で GMP を利用する際の注意点
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.metricWriter
とroles/logging.logWriter
の権限が必要となります。
さらに、後述するRunMonitoring
を構成する際は、Google Cloud Secret Manager を利用するため、roles/secretmanager.admin
とroles/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
の場合は、接頭辞にRun
やRunMonitoring
を記載する必要はありません。単にendpoint
やtargetLabels
のように記載します。
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 を利用する場合、ビルダー表示からコード表示にする場合に適切に変換できない場合があります。
Discussion