Cloud Logging をエクスポートするシナリオ: Elasticsearch

このシナリオでは、選択したログを Logging から Elasticsearch クラスタにエクスポートする方法を説明します。Elasticsearch は、ログや指標などのテレメトリーの非構造化データの取り込み、インデックス付け、および分析を実行するオープンソースのドキュメント データベースです。Logging によって収集されたログを Elasticsearch でログと統合すると、統合されたログ分析ソリューションが得られます。

このシナリオは、Logging のエクスポートのための設計パターンの一部です。

はじめに

Elastic Stack には、Elasticsearch クラスタにデータを取り込むための複数のソリューションがあります。LogstashBeats は、データの収集、変換、取り込みに使用される主要プロダクトです。Logstash と Beats のどちらを選択するかは、データ量、取り込み速度、レイテンシの要件によって決まります。Logstash が Logging からエクスポートされたログを操作するための最も柔軟なオプションであることから、このソリューションは、Elastic Stack の Logstash コンポーネントを重視しています。

Logstash を使用して、複数のソースおよび宛先からログを収集、変換、エクスポートできます。ログの数量が多い場合、Logstash を使用することをおすすめします。Pub/Sub 入力プラグインCloud Storage 入力プラグインを使用して、Logstash と Elasticsearch を統合できます。

Beats は、Elasticsearch へのデータの軽量配送向けオープンソース プラットフォームです。pubsubbeat 配送を使用して、Pub/Sub メッセージを Elasticsearch に取り込むことができます。gcsbeat 配送の場合、バケットのルートレベルでファイルを軽量配送するように設計されているため、Logging によってエクスポートされたログをインポートするのに最適なソリューションではありません。

次のような状況では、Beats を使用してください。

  • ログの数量が少ない(1 台のマシンで処理できる)。
  • Logstash を実行した場合のオーバーヘッドを回避したい。
  • ログ収集の要件は、Elastic 取り込みパイプラインによって満たせる。

次のような状況では、Logstash を使用してください。

  • ログの数量が多い。
  • Elastic 取り込みパイプラインの機能よりも充実したログを利用する必要がある。
  • Elasticsearch 以外のシステムにログをエクスポートできる必要がある。
大量またはきめ細かい 少量かつ少ない労力
リアルタイム logstash-input-google_pubsub pubsubbeat
結果 logstash-input-google_cloud_storage gcsbeat

次の図は、Logstash を使用した Elasticsearch へのバッチおよびリアルタイムのエクスポート向けアーキテクチャを示しています。

Logstash を使用した Elasticsearch へのバッチおよびリアルタイムのエクスポート向けアーキテクチャ。

リアルタイム ロギング エクスポートの設定

このセクションでは、Pub/Sub を使用して、Logging から Logstash へのリアルタイム ロギング エクスポート向けパイプラインを作成します。

Pub/Sub トピックを設定する

すべてのサービスで監査ロギングを有効にする

BigQuery を除き、データアクセスの監査ログはデフォルトで無効になっています。すべての監査ログを有効にするには、IAM ポリシーを更新するための手順に沿って、監査ポリシーのドキュメントに記載されている構成を使用します。手順は次のとおりです。

  • 現在の IAM ポリシーをファイルとしてダウンロードします。
  • 監査ログポリシーの JSON または YAML オブジェクトを現在のポリシー ファイルに追加します。
  • 変更されたポリシー ファイルを使用して Google Cloud プロジェクトを更新します。

以下に、すべてのサービスで監査ログを有効にする JSON オブジェクトの例を示します。

"auditConfigs": [
    {
        "service": "allServices",
        "auditLogConfigs": [
            { "logType": "ADMIN_READ" },
            { "logType": "DATA_READ"  },
            { "logType": "DATA_WRITE" }
        ]
    }
],

ロギング エクスポートを構成する

集約エクスポートまたはログのエクスポートを設定したら、ロギング フィルタを調整して、監査ログ、仮想マシン関連のログ、ストレージログ、データベース ログをエクスポートします。次のロギング フィルタには、管理アクティビティ監査ログとデータアクセス監査ログに加えて、特定のリソースタイプのログが含まれます。

logName:"logs/cloudaudit.googleapis.com" OR
resource.type:gce OR
resource.type=gcs_bucket OR
resource.type=bigquery_resource

gcloud コマンドライン ツールから、gcloud logging sinks create コマンドまたは organizations.sinks.create API 呼び出しを使用して、適切なフィルタを使用してシンクを作成します。次の gcloud コマンドの例では、この組織に対して gcp_logging_sink_pubsub という名前のシンクが作成されます。シンクにはすべての子プロジェクトが含まれ、特定の監査ログを選択するためのフィルタリングを指定します。

ORG_ID=your-org-id
PROJECT_ID=$(gcloud config get-value project)
gcloud logging sinks create gcp_logging_sink_pubsub \
    pubsub.googleapis.com/projects/${PROJECT_ID}/topics/logs-export-topic \
    --log-filter='logName="logs/cloudaudit.googleapis.com" OR resource.type:"gce" OR resource.type="gcs_bucket" OR resource.type="bigquery_resource"' \
    --include-children \
    --organization=${ORG_ID}

コマンドの出力は次のようになります。

Created [https://logging.googleapis.com/v2/organizations/your-org-id/sinks/gcp_logging_export_pubsub_sink].
Please remember to grant `serviceAccount:gcp-logging-export-pubsub-si@logging-oyour-org-id.iam.gserviceaccount.com` Pub/Sub Publisher role to the topic.
More information about sinks can be found at /logging/docs/export/configure_export

この API 呼び出しからの戻り値の serviceAccount エントリにおいて、gcp-logging-export-pubsub-si@logging-oyour-org-id.iam.gserviceaccount.com という ID がレスポンスに含まれます。この ID は、エクスポート用に作成された Google Cloud サービス アカウントを表します。この ID に宛先トピックに対する公開アクセス権を付与するまで、このシンクからのログエントリのエクスポートは失敗します。詳細については、次のセクションまたはリソースのアクセス権の付与のドキュメントをご覧ください。

Pub/Sub トピックの IAM ポリシー権限を設定する

Pub/Sub パブリッシャー権限を持つ pubsub.googleapis.com/projects/${PROJECT_ID}/topics/logs-export-topic トピックにサービス アカウント gcp-logging-export-pubsub-si@logging-oyour-org-id.iam.gserviceaccount.com を追加することにより、そのトピックに公開する権限がサービス アカウントに付与されます。この権限を追加するまで、シンクのエクスポートは失敗します。

サービス アカウントに権限を付与するには、次の操作を行います。

  1. Cloud Console で、[Cloud Pub/Sub のトピック] ページを開きます。

    トピックページに移動

  2. トピック名を選択します。

  3. [情報パネルを表示] をクリックして、権限を構成します。Pub/Sub パブリッシャー権限が選択されていることを確認してください。

    アクセス許可を設定する。

このフィルタを使用してロギング エクスポートを作成すると、構成対象のプロジェクトの Pub/Sub トピックにログファイルの自動入力が開始されます。Cloud Monitoring の Metrics Explorer を使用すると、トピックによるメッセージの受信を確認できます。次のリソースタイプと指標を使用して、短期間に実行されたメッセージ送信オペレーションの数を確認します。エクスポートを適切に構成すると、次のスクリーン ショットのように、グラフに 0 を超えるアクティビティが表示されます。

  • リソースの種類: pubsub_topic
  • 指標: pubsub.googleapis.com/topic/send_message_operation_count
  • フィルタ: topic_id="logs-export-topic"

Metrics Explorer グラフ上のアクティビティ。

ロギング エクスポートの設定

ロギングにおいてはログの保持期間が有限であるため、Cloud Storage へのロギング エクスポートの作成をおすすめします。Logstash を使用してエクスポートされたログを取り込むと、デフォルトの保持期間を超えてログの検索が可能となり、必要に応じて Elasticsearch データベースを再作成することもできるようになります。

Logstash を構成する

  1. 最新の logstash リリースをダウンロードします。
  2. ロール Cloud Storage AdminPub/Sub Subscriber を持つ gcsbeatIAM サービス アカウントJSON アカウントキーを作成します。
  3. Logstash インストール ディレクトリで次のコマンドを実行して、Logstash の Cloud Storage および Pub/Sub 入力プラグインをインストールします。

    ./bin/logstash-plugin install \
        logstash-input-google_cloud_storage \
        logstash-input-exec \
        logstash-input-google_pubsub
    

バッチ取り込みパイプラインを作成する

  • 次のように、Cloud Storage の logstash 構成ファイルを作成します。my-cloud-logs はバケットの ID に置き換えてください。

    input {
      google_cloud_storage {
        type => "gcs"
        interval => 60
        bucket_id => "my-cloud-logs"
        json_key_file => "logstash-sa.json"
        file_matches => ".*\.json"
        codec => "json"
      }
    }
    
    output {
      elasticsearch {
        document_id => "%{[@metadata][gcs][line_id]}"
      }
    }
    

    すべてのオプションの一覧については、google_cloud_storage プラグインの構成ドキュメントをご覧ください。

Logstash によって処理された Cloud Storage のオブジェクトは、メタデータ項目 x-goog-meta-ls-gcs-input:processed でマークされます。入力プラグインは、このメタデータ アイテムを持つオブジェクトをスキップします。データの再処理を計画している場合は、メタデータ ラベルを手動で削除する必要があります。

リアルタイム パイプラインを作成する

  • 次の形式で Pub/Sub ソースの logstash 構成ファイルを作成します。

    input {
      google_pubsub {
          type => "pubsub"
          project_id => "my-project-id"
          topic => "logs-export-topic"
          subscription => "logstash"
          json_key_file => "logstash-sa.json"
      }
    }
    
    output {
      elasticsearch {
        document_id => "%{[@metadata][pubsub_message][messageId]}"
      }
    }
    

全構成項目の一覧については、プラグインのドキュメントをご覧ください。

べき等挿入

Elasticsearch は、ドキュメントの _id フィールドを一意の識別子として使用します。Logstash では、[@metadata] 項目などのメッセージ フィールドを使用して、ロギングからのログメッセージの種類に基づいて、一意のドキュメント ID を作成できます。

google_cloud_storage プラグインのメタデータのドキュメントには、利用可能な Logstash メタデータ フィールドの一覧が含まれています。[@metadata][gcs][line_id] フィールドは、べき等ドキュメント ID を作成するユースケースに対して明示的に挿入されます。

google_pubsub plugin にはメタデータ フィールドの一覧も含まれており、[@metadata][pubsub_message][messageId] が重複排除によく使用されます。

エクスポートされたログの使用

エクスポートされたログが Elasticsearch に取り込まれ、リアルタイムの Beat がサービスとしてデプロイされた後に、Elasticsearch と Elastic Stack のプロダクトを使用して次のタスクを実行できます。

  • ログを検索する。
  • 複雑なイベントを関連付ける。
  • 自動化されたアラートを作成する。
  • グラフで表現されたデータ内の関係を確認する。
  • Kibana ダッシュボードを使用して結果を可視化する。

次のステップ