Dataflow テンプレートを使用した Google Cloud のデータの Elastic Stack へのエクスポート
Google Cloud Japan Team
※この投稿は米国時間 2021 年 11 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。
Google Cloud は、お客様の問題を解決すると同時に、活発なパートナー エコシステムをサポートすることに重点を置いています。IT 運用、セキュリティ運用、アプリケーションのパフォーマンス モニタリング、コスト分析など、マルチクラウドやハイブリッド クラウドの環境を把握するために、サードパーティのモニタリング ソリューションを利用している方は多いと思います。同時に、大規模な Google Cloud のログ、イベント、アラートを確実にエクスポートするクラウドネイティブな方法が求められています。
これらの一般的なデータ移動操作のための目的に特化した Dataflow テンプレートを拡張する取り組みの一環として、Google Cloud は以下の 3 つの Dataflow テンプレートを立ち上げ、Google Cloud のデータを Elastic Cloud またはセルフマネージド Elasticsearch デプロイメントにエクスポートしました。Pub/Sub to Elasticsearch(ストリーミング)、Cloud Storage to Elasticsearch(バッチ)、BigQuery to Elasticsearch(バッチ)です。
このブログ投稿では、Pub/Sub to Elasticsearch Dataflow テンプレートを使って、Google Cloud のログを Elastic Cloud にエクスポートするストリーミング パイプラインを設定する方法をご紹介します。この Dataflow テンプレートを使うと、Cloud Logging からのログや、Cloud Security Command Center からのセキュリティ調査結果などのイベントなど、Pub/Sub トピックに配信できるあらゆるメッセージを Elasticsearch に転送できます。
ステップバイステップのチュートリアルでは、Cloud Logging での発行元のログシンクの構成から、Kibana UI での GCP との Elastic インテグレーションの構成、Kibana ダッシュボードでの GCP 監査ログの可視化までの構成全体を網羅しています。
Push と Pull の比較
従来、Elasticsearch ユーザーにはデータコレクタとして、Pub/Sub トピックから Elastic search に pull するオプションがありました。pull は Logstash またはBeats を介して行われました。この 文書化されたソリューションはうまく機能していますが、考慮しなければならないトレードオフがあります。
一つ以上のデータコレクタを管理する必要があり、高可用性とログ量の増加に伴うスケールアウトのための運用の複雑さが増加
サブスクリプションを作成し、一つ以上の Pub/Sub トピックからデータを pull するために、前述のデータコレクタに権限を与えることで、Google Cloud への外部リソース アクセスが必要
Google はお客様から、データコレクタの中間フリートの管理を必要とせず、ログを Elasticsearch デプロイメントに直接ストリーミングする、よりクラウドネイティブなアプローチを必要としているという要望をいただいています。ここで、マネージド Cloud Dataflow サービスが活躍します。Dataflow ジョブは、Pub/Sub トピックからログを自動的に pull し、ペイロードを解析して項目を抽出し、オプションの JavaScript ユーザー定義関数(UDF)を適用してログを変換または削除し、最終的に Elasticsearch クラスタに転送できます。
Elasticsearch へのロギング エクスポートの設定
エンドツーエンドのロギング エクスポート方法は以下のとおりです。


以下に、手順を示します。
Pub/Sub トピックとサブスクリプションの設定
ログシンクの設定
Pub/Sub トピック向けに IAM ポリシーを設定
Elastic GCP インテグレーションのインストール
Elasticsearch の API キーの作成
Elastic Dataflow のテンプレートに Pub/Sub をデプロイ
Kibana で GCP のログを表示して分析
Pub/Sub トピックとサブスクリプションの設定
まず、エクスポートしたログを受け取る Pub/Sub トピックと、Dataflow ジョブが後でログを pull できる Pub/Sub サブスクリプションを設定します。これは、Cloud Console または gcloud を使った CLI で行うことができます。例えば、gcloud を使うと次のようになります。
注: サブスクリプションが作成される前にトピックに追加されたデータが失われないように、Cloud Logging シンクを設定する前にサブスクリプションを作成することが重要です。
パイプラインの誤った構成(API キーの間違いなど)や Elasticsearch クラスタへの接続不能などにより、配信不能となったメッセージが格納されている Pub/Sub deadletter トピックについても、同じ手順を繰り返します。
Cloud Logging シンクの設定
先に作成した Pub/Sub トピックを宛先として、ログシンクを作成します。この場合も、ログビューアまたはgcloud logging を使用する CLI を介して行われます。たとえば、現在の Google Cloud プロジェクト([MY_PROJECT] を置き換える)のすべてのログをキャプチャするには、次のコードを使用します。
注: Google Cloud 組織内のすべてのプロジェクトまたはフォルダからログをエクスポートするには、「gcloud logging sink」コマンドの例として、集約エクスポート をご覧ください。たとえば、適切な権限があれば、すべてのプロジェクトの Cloud Audit Logs を一つの Pub/Sub トピックにエクスポートして、後で Elasticsearch に転送できます。
この最後のコマンドの出力は次のようになります。
返されたサービス アカウント [LOG_SINK_SERVICE_ACCOUNT] をメモしておきます。通常は @gcp-sa-logging.iam.gserviceaccount.com で終わります。
Pub/Sub トピック向けに IAM ポリシーを設定
シンクのエクスポートを機能させるには、返されたシンクのサービス アカウントに Cloud IAM ロールを付与し、Pub/Sub トピックにログを公開する権限を付与する必要があります。
Cloud Console を使用してログシンクを作成した場合、エクスポート先を所有していれば、新しいサービス アカウントに書き込み権限が自動的に付与されます。この場合、Pub/Sub topic my-logs です。
Elastic GCP インテグレーションのインストール
Kibana ウェブ UI から「Integrations」に移動し、GCP を検索します。「Google Cloud Platform(GCP)」インテグレーションを選択し、[Add Google Cloud Platform(GCP)] をクリックします。
次の画面では、[Collect Google Cloud Platform (GCP) ... (input: gcp-pubsub)] のチェックがオフになっていることを確認してください。これは、Pub/Sub トピックからデータを pull するのをポーラーに頼らず、Dataflow パイプラインでデータをストリーミングするためです。


Elasticsearch の API キーの作成
Elasticsearch の API キーをまだ持っていない場合は、[Stack Management] > [API keys] に移動して、Kibana ウェブ UI から API キーを作成します。Elasticsearch API キーの詳細については、Elastic ドキュメントをご覧ください。後で Dataflow パイプラインが Elasticsearch との認証に使用する base64 エンコードされた API キーをメモしておきます。
先に進む前に、Elastic Cloud UI の [Cloud] > [Deployments] で確認できる Cloud ID をメモしておきます。
Elastic Dataflow パイプラインへの Pub/Sub のデプロイ
Pub/Sub to Elastic パイプラインは、コンソール、gcloud CLI、または REST API 呼び出し(詳細はこちら)から実行できます。コンソールの例では、Dataflow ジョブのページに移動し、[Create Job from Template] をクリックし、プルダウン メニューから [Cloud Pub/Sub to Elasticsearch] テンプレートを選択します。必要なパラメータをすべて記入後、フォームは以下のようになります。


[Show Optional Parameters] をクリックすると、オプションのパラメータのリストが表示されます。
[The type of logs...] パラメータに「audit」を入力して、Kibana で以前に有効にした GCP インテグレーションで利用可能な対応する GCP 監査ダッシュボードに入力するために、送信するデータセットの種類を指定します。


[Run job] をクリックすると、数分後にパイプラインが Elastic Cloud にイベントのストリーミングを開始します。正しく動作しているかどうかは、Dataflow ジョブをクリックして [Job Graph] タブを選択することで、以下のように視覚的に確認できます。今回のテスト プロジェクトでは、Dataflow ステップの WriteToElasticsearch がその時点で 1 秒間に 2,800 個強の要素を送信しています。


次に Kibana UI にアクセスし、[Observability] > [Overview] の順に移動して、GCP 監査ログが Elasticsearch に取り込まれていることをすぐに確認できます。


Kibana で GCP 監査ログを可視化
Kibana UI の検索インターフェースから、Google Cloud Audit Logs を表示できるようになりました。[Observability] > [Logs] > [Stream] または [Analytics] > [Discover] のいずれかに移動し、KQL で以下のシンプルなクエリを入力して、GCP 監査ログのみをフィルタリングします。


上の表は、誰がどのリソースに何をしたかを明らかにするために、以下の項目を列として選択して作成したものです。
protoPayload.authenticationInfo.principalEmail - 誰が
protoPayload.methodName - 何を
protoPayload.serviceName - どの(サービス)に
protoPayload.resourceName - どの(リソース)に
Kibana で GCP 監査のダッシュボードを開く
[Analytics] > [Dashboards] に移動し、「GCP」を検索します。[Logs GCP Audit] ダッシュボードを選択して、GCP の監査ログを可視化します。このダッシュボードでは、クラウドのアクティビティがどこから来ているかの地図表示、アクティビティ量のタイムチャート、トップ アクションとアクションが行われたリソースの内訳などが表示されます。


さらなる機能
Pub/Sub to Elasticsearch Dataflow テンプレートは、膨大な量のログをほぼリアルタイムで確実に収集するために必要な作業を抽象化することを目的としています。同時に、スループットのための配信バッチサイズ(メッセージ数またはバイト数)、フォールト トレラントのための再試行設定(試行回数または期間)、Elasticsearch に配信する前に出力メッセージを変換するカスタム ユーザー定義関数(UDF)などのオプション パラメータを使用して、パイプラインを独自の要件に合わせて調整できる高度なカスタマイズ機能も備えています。Dataflow UDF の詳細と具体的な例については、UDF による Dataflow テンプレートの拡張をご覧ください。
また、Pub/Sub to Elasticsearch Dataflow テンプレートに加えて、ユースケースに応じて Elasticsearch にエクスポートするための 2 つの新しい Dataflow テンプレートがあります。
Cloud Storage to Elasticsearch: この Dataflow テンプレートは、Cloud Storage の CSV ファイルの行を JSON ドキュメントとして Elasticsearch にエクスポートする場合に使用します。
BigQuery to Elasticsearch: この Dataflow テンプレートは、BigQuery テーブルの行(または SQL クエリの結果)を Elasticsearch にエクスポートする場合に使用します。これは特に Cloud Billing による請求データまたは Cloud Asset Inventory による アセットのメタデータ スナップショットを転送する場合に便利です。これらはいずれも BigQuery にネイティブにエクスポートできます。
次のステップ
前述の Elastic Dataflow を含む、Google が提供するすべての Dataflow テンプレートに関する最新の参考資料は、ユーザー ドキュメントをご覧ください。皆様からのフィードバック、機能リクエストをお待ちしております。対応する GitHub リポジトリに直接課題を作成したり、Cloud Console からサポートケースを作成したり、Stack Overflow フォーラムで質問できます。
Google Cloud 上で Elastic Cloud を利用するには、Google Cloud Marketplace 経由でサブスクリプション利用することで、数分後には Google Cloud に独自の Elasticsearch クラスタを作成できます。手順については、Elastic のスタートガイドをご覧ください。
謝辞
これらの Elastic Dataflow テンプレートを共同利用者のために提供してくださった Google 社内外の方々に感謝します。
Google 戦略的クラウド エンジニア Prathap Kumar Parvathareddy
Elastic プロダクト マネージャー Michael Yang
- ソリューション アーキテクト Roy Arsan
- カスタマー エンジニア Brendan Foley