DoiT International では、世界中のソフトウェア企業を支援するなかで、複数のお客様から似た課題のご相談をいただくことがよくあります。最近とくに目立つのが、複数の Google Cloud Platform(GCP)プロジェクトのログを 1 つのプロジェクトに集約し、まとめて確認・監視したいというご要望です。
Datadog や Splunk といったサードパーティ製サービスにログを送る企業も多いですが、本記事では GCP の Cloud Logging(旧 Stackdriver)だけを使い、アクセス制御も効かせながらログを統合する方法をご紹介します。シンプルで扱いやすく、増えつつあるこのニーズにきれいに応えられる構成です。
アーキテクチャ

デモのアーキテクチャ概要
概要(TL;DR)
本例では、テストプロジェクトを 2 つ作成し、そのログを集約用プロジェクトに送る構成を作ります。さらにボーナスとして、モニタリングとメトリクスを一元化する方法もご紹介します(こちらもよくあるユースケースです)。
- GCP 上に テストプロジェクト を 3 つ(mike-test-log-view、mike-test-log-a、mike-test-log-b)作成します
- mike-test-log-view プロジェクトに ログバケット を作成し、バケットへのパスをコピーします
- mike-test-log-a と mike-test-log-b の両プロジェクトで、ステップ 2 のパスを宛先とする Cloud Logging バケット タイプの ログシンク を作成します
- 各 ログシンク の詳細を開き、書き込み元の サービスアカウント のメールアドレス(シンクごとに自動生成されます)をコピーします
- mike-test-log-view プロジェクトの IAM ロール を編集し、ログシンクからコピーした各サービスアカウントに Logs Bucket Writer ロールを付与します
- mike-test-log-view プロジェクトの IAM ロール を再度編集し、ログバケットのパスを条件に指定したうえで Logs View Accessor ロールを追加します(ユーザー単位でアクセスを制限するため)
- Logs Explorer ページを開き、上部の「Refine Scope」をクリックして「Scope by storage」を選び、対象の ログバケット を指定します
手順
ここからは、複数の Google Cloud Platform プロジェクトのログを 1 つの集約プロジェクトに送るまでの手順を順番に見ていきます。
ステップ 1:テストプロジェクトを作成する
このステップは説明するまでもないでしょう。デモ用に前述の 3 つのプロジェクトを作成しました。
ステップ 2:ビュー側プロジェクトでログバケットを作成する

Logs Storage を開き「Create Logs Bucket」からバケットを作成し、パスをコピーします
ステップ 3:テストプロジェクトでログシンクを作成する
テストプロジェクト a と b のそれぞれで ログシンク を作成します。

シンクの宛先を「Cloud Logging Bucket」に設定します

「Use a logs bucket in another project」を選択します

テストプロジェクト「a」のログシンク。宛先(ドメインの後ろ)にログバケットへのパスを付け足します

テストプロジェクト「b」のログシンク。宛先(ドメインの後ろ)にログバケットへのパスを付け足します
ステップ 4:ログシンクの詳細を開き、IAM の書き込みアイデンティティを控える
テストプロジェクトごとに、「Log Router Sinks」ページのリストを開き、作成したログシンクの行の右端にある「…」(3 点リーダー)をクリックして「View Details」を選びます。

表示された「Writer identity」(ログシンクとともに自動生成されたサービスアカウント)をコピーします。これをビュー側プロジェクトに追加することで、集約用 ログバケット へのログ書き込みが可能になります。
ステップ 5:ビュー側プロジェクトでログシンク書き込み用の IAM ロールを編集する
各 ログシンク について、集約用のビュー側プロジェクトで IAM 管理ページを開き、ステップ 4 でコピーした「Writer identity」のサービスアカウントをメンバーとして追加し、Logs Bucket Writer ロールを付与します(下図参照)。

IAM ロールを追加し、ログシンクがビュー側プロジェクトにログを書き込めるようにします
ステップ 6:ビュー側プロジェクトでログ閲覧者(ユーザー)用の IAM ロールを編集する
ユーザーが Logs Explorer でログを閲覧できるようにするには、Logs View Accessor ロールを付与し、ビュー(スコープ)を編集できる権限を与えます。

Logs Explorer のビュー(スコープ)を編集できる権限をユーザーに付与します
ユーザーの IAM ロールには 条件 を追加し、対象リソースのみにアクセスを絞り込むことをおすすめします。今回の例では、作成した ログバケット へのパスを指定します。こうすることで、必要なログとバケットだけを閲覧できるように制限でき、コンプライアンス対応にも役立ちます。

ステップ 7:ログを閲覧する
権限の設定が済んだら、数分以内にビュー側プロジェクトでログが見え始めるはずです。まずは「Refine Scope」を行い、下図のように対象のログソースを選択します。

Logs Explorer のスコープを絞り込み、シンク経由で Logs Bucket に送られたログを参照します
これで完了です。下図のように、ビュー側プロジェクトから他プロジェクトのログを確認できるようになりました。

テストプロジェクト「a」のログが「ビュー」プロジェクトに表示されています
ボーナス \#1:除外フィルタでコストを削減
ボーナス \#2:Cloud Monitoring を一元化
Google Cloud Operations(旧 Stackdriver)はオブザーバビリティ機能を一通り備えたプラットフォームで、ロギングに加えて Cloud Monitoring も利用できます。
ビュー側プロジェクトに「Workspace」を作成し、他のプロジェクトを選ぶだけで、モニタリングやダッシュボードもまとめて一元化できます。

本記事が、組織全体のロギングとオブザーバビリティをすっきり整理するヒントになれば幸いです。パブリッククラウドのテクニックや新機能、ベストプラクティスなどについては、DoiT Blog でも随時お届けしていますので、ぜひご覧ください。