はじめに
Google Cloud の Compute Engine 上で動作するアプリケーションログを
Cloud Logging に連携しようとした際に、いくつかハマりどころがあったので共有します。
前提
今回開発を行った環境における制約を簡単に。
- Compute Engine はクライアント社内ネットワーク内に閉じている
- インターネットへの直接通信は禁止
- GCP API 含め、すべて社内プロキシ経由でのみ通信可能
特に3つ目が重要で、通常であれば、
- Ops Agent のインストール
- ログ設定
だけで Cloud Logging に連携されますが、閉域 + プロキシ必須環境ではそのままでは動きません(でした)
本記事はこの前提環境での対応例になります。
やりたかったこと(ゴール)
Compute Engine 上で出力される以下のログを Cloud Logging に表示する。
/var/log/app/app.log
実施内容
① Ops Agent のインストール
対象VMに Ops Agent をインストール。
詳細は公式ドキュメント参照。
今回は閉域ネットワーク網内でのインストールだったため、個別インストールを行いました。
https://docs.cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation?hl=ja
② ログ収集設定
sudo vi /etc/google-cloud-ops-agent/config.yaml
logging:
receivers:
applog:
type: files
include_paths:
- /var/log/app/app.log
service:
pipelines:
app-pipeline:
receivers: [applog]
③ プロキシ設定(最初に実施)
公式ドキュメントをベースに設定。
sudo vi /etc/systemd/system.conf
DefaultEnvironment="HTTP_PROXY=http://<proxy>:8080/" "HTTPS_PROXY=http://<proxy>:8080/" "NO_PROXY=http://metadata.google.internal/"
しかしここで問題発生
- Ops Agent が正常に連携されない
-
app.logにログを吐き出してみたところ、Cloud Logging に連携されない
ハマったこと①:権限不足で API 実行エラー
■事象
[Network Check] Result: ERROR
[API Check] Result: FAIL
- Cloud Monitoring 側でエージェント未検出
■設定確認
プロキシ設定を確認
sudo systemctl show google-cloud-ops-agent --property=Environment
Environment=
→ なるほど、プロキシにちゃんと設定できていないのか
■対応
Ops Agent 個別に systemd override を作成
sudo mkdir -p /etc/systemd/system/google-cloud-ops-agent.service.d
sudo vi /etc/systemd/system/google-cloud-ops-agent.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy>:8080/" "HTTPS_PROXY=http://<proxy>:8080/" "NO_PROXY=metadata.google.internal"
sudo systemctl daemon-reload
sudo systemctl restart google-cloud-ops-agent
- curl では API 疎通 OK
→プロキシ問題はクリアになったっぽい
が、Ops Agent は 依然として FAIL
■真の原因
/var/log/google-cloud-ops-agent/health-checks.log を確認
{"severity":"INFO","time":"2026-02-09T09:14:02Z","message":"rpc error: code = PermissionDenied desc = Permission monitoring.timeSeries.create denied (or the resource may not exist)."}
→サービスアカウントに以下の権限が不足していた
roles/monitoring.metricWriter
■対応
必要最小権限としてロールを付与
結果
Logging API response status: 200 OK
Monitoring API response status: 200 OK
→ Cloud Logging にログ出力成功
■ここまでの学び
- プロキシ問題に見えて IAM が原因になるケースあり
手順に書いてなかったのに!と思いましたが、前提的な前置きでちゃんと書かれてました。
https://docs.cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation?hl=ja#before_you_begin
GCP のドキュメントを参考にする際は、権限、認可周りは前提にしれっと書いていたりするので、ちゃんと確認しなきゃダメだと反省しました。
ハマったこと②:子プロセスにプロキシが設定されていなかった
■事象
- API Check:PASS
- しかしログが出ない
■ログ
/var/log/google-cloud-ops-agent/subagents/logging-module.log
failed to flush chunk
→ ログ転送に失敗してリトライしている状態
■原因
Ops Agent は内部的に以下の構成
- 親:google-cloud-ops-agent
- 子:google-cloud-ops-agent-fluent-bit(ログ転送担当)
子プロセスにプロキシ設定が適用されていなかった
■確認
sudo systemctl show google-cloud-ops-agent-fluent-bit --property=Environment
Environment=
■対応
sudo mkdir -p /etc/systemd/system/google-cloud-ops-agent-fluent-bit.service.d
sudo vi /etc/systemd/system/google-cloud-ops-agent-fluent-bit.service.d/proxy.conf
[Service]
Environment=HTTP_PROXY=http://<proxy>:8080 HTTPS_PROXY=http://<proxy>:8080 NO_PROXY=metadata.google.internal
sudo systemctl daemon-reload
sudo systemctl restart google-cloud-ops-agent-fluent-bit
■結果
- ログ転送成功
- Cloud Logging に反映
■補足
- 親サービスの設定をシンボリックリンクで流用可能
- 二重管理を避ける運用が望ましい
■なぜ検証環境では問題なかったか
単純な凡ミス…
- 検証環境:FWが緩く、Google Cloud と直接通信可能
- 本番相当:プロキシ必須
おわりに
通常の GCP 環境であれば、
- Ops Agent インストール
- ログ設定
だけで Cloud Logging に連携されます。
しかし、閉域 + プロキシ必須環境では別物でした。
そして公式の手順書は隅々まで読みましょう(読んでも分からないことはある)