集約シンクを構成する

このドキュメントでは、集約シンクの作成方法について説明します。既存のシンクの管理については、シンクを管理するをご覧ください。

集約シンクは、組織、フォルダ、請求先アカウントに含まれる Google Cloud リソースのログエントリを結合してルーティングします。たとえば、監査ログエントリを組織のフォルダから Cloud Storage バケットに集約してルーティングできます。

集約シンク機能がないと、シンクは、シンクが作成された正確なリソース(Google Cloud プロジェクト、組織、フォルダ、請求先アカウント)からのログエントリのルーティングに限定されます。

集約シンクを作成するには、Cloud Logging API または gcloud コマンドライン ツールを使用します。Google Cloud Console を使用して集約シンクを作成することはできません。Google Cloud Console では、プロジェクト レベルの(集約されていない)シンクのみ作成できます。Cloud プロジェクトでシンクを作成するには、シンクを構成するをご覧ください。

シンクのより幅広い概念については、ルーティングとストレージの概要: シンクをご覧ください。

選択できる宛先

集約シンクを使用して、同じ組織、フォルダ、請求先アカウント内のログを次の宛先にルーティングできます。

  • Cloud Storage: Cloud Storage バケットに保存される JSON ファイル。
  • Pub/Sub: Pub/Sub トピックに配信される JSON メッセージ。サードパーティによる Logging との統合サービス(Splunk など)をサポートします。
  • BigQuery: BigQuery データセットに作成されるテーブル。
  • 別の Cloud Logging バケット: Cloud Logging ログバケットに保持されるログエントリ。

始める前に

シンクを作成する前に、次のことを確認します。

  • ログ エクスプローラで表示可能なログを含むリソースがある。

  • ログの送信元である Google Cloud 組織、フォルダ、請求先アカウントに、次のいずれかの IAM ロールがある。

    • オーナーroles/owner
    • Logging 管理者roles/logging.admin
    • ログ設定書き込み (roles/logging.configWriter)

    これらのロールに含まれる権限を使用して、シンクを作成、削除、変更できます。IAM ロールの設定については、Logging アクセス制御ガイドをご覧ください。

  • サポート対象の宛先にリソースがある、または作成できる。

    gcloud コマンドライン ツール、Cloud Console、Google Cloud APIs ログシンクのいずれかでログシンクのエクスポート先を作成してから、ログシンクを作成してください。任意の組織の任意の Cloud プロジェクトにエクスポート先を作成できますが、シンクのサービス アカウントに、エクスポート先への書き込み権限があることを確認する必要があります。

集約シンクの作成

集約シンクを使用するには、Google Cloud の組織、フォルダ、請求先アカウントにシンクを作成し、シンクの includeChildren パラメータを True に設定します。これにより、そのシンクは組織、請求先アカウント、フォルダに加えて、それに含まれているすべてのフォルダ、請求先アカウント、Cloud プロジェクトから(再帰的に)ログエントリをルーティングできるようになります。シンクの追加フィルタと除外フィルタを設定して、エクスポート先にルーティングするログエントリを指定します。

請求先アカウント、フォルダ、組織ごとに最大 200 個のシンクを作成出来ます。

API

ログシンクを作成するには、Logging API の organizations.sinks.createfolders.sinks.createbillingAccounts.sinks.create のいずれかを使用します。次のように、メソッドの引数を準備します。

  1. parent パラメータを、シンクを作成する Google Cloud 組織、フォルダ、請求先アカウントに設定します。親は次のいずれかにする必要があります。

    • organizations/ORGANIZATION_ID
    • folders/FOLDER_ID
    • billingAccounts/BILLING_ACCOUNT_ID
  2. メソッドのリクエスト本文の LogSink オブジェクトで、次の設定を行います。

    • includeChildrenTrue に設定する。

    • filter プロパティを設定します。フィルタの長さは 20,000 文字までです。

      役立つフィルタの例については、集約シンク用のフィルタの作成をご覧ください。

    • 残りの LogSink フィールドを他のシンクの場合と同様に設定します。詳細については、シンクを作成するをご覧ください。

  3. organizations.sinks.createfolders.sinks.createbillingAccounts.sinks.create のいずれかを使用してシンクを作成します。

  4. API レスポンスで返された writer_identity フィールドからサービス アカウント名を取得します。

  5. そのサービス アカウントにシンクのエクスポート先への書き込み権限を付与します。

    シンクのエクスポート先を変更する権限がない場合は、その変更を行うことができるユーザーにサービス アカウント名を送信します。

    リソースに対する権限をサービス アカウントに付与する方法については、エクスポート先の権限の設定セクションをご覧ください。

gcloud

ログシンクを作成するには、logging sinks create コマンドを使用します。

  1. シンク名、シンクのエクスポート先、フィルタ、およびフォルダ、請求先アカウント、または組織の ID を指定します。

    たとえば、次のようにフォルダレベルで集約シンクを設定します。

    gcloud logging sinks create SINK_NAME \
    storage.googleapis.com/STORAGE_BUCKET_NAME --include-children \
    --folder=FOLDER_ID --log-filter="logName:activity"

    注:

    • シンクを組織レベルで作成するには、--folder=FOLDER_ID--organization=ORGANIZATION_ID に置き換えます。請求先アカウントの場合は、--folder=FOLDER_ID--billing-account=BILLING_ACCOUNT_ID に置き換えます。

    • シンクが組織内のすべてのプロジェクトをインクルードするには、--organization フラグが create に渡された場合でも --include-children フラグを設定する必要があります。false(デフォルト)に設定すると、シンクはホストリソースからのログのみを転送します。

    • 役立つフィルタの例については、集約シンク用のフィルタの作成をご覧ください。

  2. コマンド出力から、シンクの作成に使用されたサービス アカウント名を取得します。

  3. そのサービス アカウントにシンクのエクスポート先への書き込み権限を付与します。

    シンクのエクスポート先を変更する権限がない場合は、その変更を行うことができるユーザーにサービス アカウント名を送信します。

    リソースに対する権限をサービス アカウントに付与する方法については、エクスポート先の権限の設定セクションをご覧ください。

集約シンクのフィルタを作成する

他のシンクと同様に、集約シンクにも個々のログエントリを選択するフィルタが含まれます。集約シンクの作成に使用できるフィルタの例については、ログ エクスプローラを使用したサンプルクエリをご覧ください。

以下に、集約シンク機能を使用するときに役立つフィルタの比較例を示します。一部の例で次の表記を使用しています。

  • : は部分文字列演算子です。= 演算子を代わりに使用しないでください。
  • ... はさらにフィルタ比較が続くことを表します。
  • 変数は色付きのテキストで示されます。これらは有効な値に置き換えてください。

フィルタの長さは 20,000 文字までです。

フィルタリング構文の詳細については、Logging のクエリ言語をご覧ください。

ログソースを選択する

特定の Cloud プロジェクト、フォルダ、組織からログを転送するには、次に挙げる比較演算子の使用例のいずれかを使用します。

logName:"projects/PROJECT_ID/logs/" AND ... 
logName:("projects/PROJECT_A_ID/logs/" OR "projects/PROJECT_B_ID/logs/") AND ... 
logName:"folders/FOLDER_ID/logs/" AND ... 
logName:"organizations/ORGANIZATION_ID/logs/" AND ... 

モニタリング対象リソースを選択する

Cloud プロジェクトの特定のモニタリング対象リソースだけからログを転送するには、複数の比較演算子を使用してリソースを厳密に指定します。

logName:"projects/PROJECT_ID/logs" AND
resource.type=RESOURCE_TYPE AND
resource.labels.instance_id=INSTANCE_ID

リソースタイプの一覧については、モニタリング対象リソースタイプをご覧ください。

ログエントリのサンプルを選択する

ログエントリのランダムなサンプルを転送するには、sample 組み込み関数を追加します。たとえば、現在のフィルタに一致するログエントリの 10% だけを転送するには、次の記述を追加します。

sample(insertId, 0.10) AND ...

詳細については、sample 関数をご覧ください。

Cloud Logging のフィルタの詳細については、Logging のクエリ言語をご覧ください。

エクスポート先の権限を設定する

このセクションでは、シンクのエクスポート先にログを書き込むための Identity and Access Management 権限を Logging に付与する方法について説明します。Logging のロールと権限のリストについては、アクセス制御をご覧ください。

シンクを作成すると、Logging によって一意の書き込み ID と呼ばれるシンクのサービス アカウントが新規に作成されます。シンクのエクスポート先では、このサービス アカウントにログエントリの書き込みを許可する必要があります。このサービス アカウントは、Cloud Logging によって所有および管理されているため、直接管理できません。シンクが削除されると、このサービス アカウントは削除されます。

サービス境界で保護されたリソースにログをルーティングするには、そのログシンクのサービス アカウントをアクセスレベルに追加し、宛先サービス境界に割り当てる必要があります。これは、プロジェクト レベル(集約されていない)のシンクには必要ありません。詳細については、VPC Service Controls: Cloud Logging をご覧ください。

シンクをエクスポート先にルーティングするための権限を設定するには、次の手順を行います。

API

  1. API メソッドの organizations.sinks.getfolders.sinks.getbillingAccounts.sinks.get のいずれかを呼び出して、シンクの writerIdentity フィールドからサービス アカウントを取得します。

    サービス アカウントは次のようになります。

    serviceAccount:p123456789012-12345@gcp-sa-logging.iam.gserviceaccount.com
    
  2. 新しいシンクの書き込み ID をエクスポート先の権限リストに追加し、エクスポート先への書き込み権限を付与します。

    エクスポート先への IAM オーナー アクセス権がある場合は、次の方法でエクスポート先にサービス アカウントを追加します。

    • Cloud Storage のエクスポート先の場合は、シンクの書き込み ID を Cloud Storage バケットに追加し、ストレージのオブジェクト作成者のロールを付与します。
    • BigQuery のエクスポート先の場合は、シンクの書き込み ID をデータセットに追加し、BigQuery データ編集者のロールを付与します。
    • Cloud Pub/Sub の場合は、シンクの書き込み ID をトピックに追加し、Pub/Sub パブリッシャーのロールを付与します。
    • 異なる Cloud プロジェクトの Logging バケットのエクスポート先の場合は、シンクの書き込み ID をエクスポート先のログバケットに追加し、roles/logging.bucketWriter 権限を付与します。

    シンク先へのオーナー アクセス権がない場合は、書き込み ID のサービス アカウント名を、その権限を持つ担当者に送信します。送信された担当者は、前のステップの指示に従って、書き込み ID をエクスポート先に追加する必要があります。

gcloud

  1. 新しいシンクからシンクの書き込み ID(メールアドレス)を取得します。

  2. シンク内の writerIdentity フィールドからサービス アカウントを取得します。

    gcloud logging sinks describe SINK_NAME
    

    サービス アカウントは次のようになります。

    serviceAccount:p123456789012-12345@gcp-sa-logging.iam.gserviceaccount.com
    
  3. エクスポート先へのオーナー アクセス権がある場合は、次の方法でエクスポート先にサービス アカウントを追加します。

    • Cloud Storage のエクスポート先の場合は、シンクの書き込み ID をバケットに追加し、ストレージのオブジェクト作成者の役割を付与します。
    • BigQuery のエクスポート先の場合は、シンクの書き込み ID をデータセットに追加し、BigQuery データ編集者の役割を付与します。
    • Cloud Pub/Sub の場合は、シンクの書き込み ID をトピックに追加し、Pub/Sub パブリッシャーの役割を付与します。
    • 異なる Cloud プロジェクトの Logging バケット宛先の場合は、シンクの書き込み ID をエクスポート先のログバケットに追加し、roles/logging.bucketWriter 権限を付与します。

    シンク先へのオーナー アクセス権がない場合は、書き込み ID のサービス アカウント名を、その権限を持つ担当者に送信します。送信された担当者は、前のステップの指示に従って、書き込み ID をエクスポート先に追加する必要があります。

    たとえば、異なる Cloud プロジェクトの Logging バケット間でログをルーティングする場合は、次のように roles/logging.bucketWriter をサービス アカウントに追加します。

    1. 宛先プロジェクトの Cloud Identity and Access Management ポリシーを取得し、JSON 形式でローカル ファイルに書き込みます。

      gcloud projects get-iam-policy DESTINATION_PROJECT_ID --format json > output.json
      
    2. サービス アカウントが、作成したエクスポート先にのみ書き込みを許可する IAM 条件を追加します。次に例を示します。

      {
      "bindings": [
       {
         "members": [
           "user:username@gmail.com"
         ],
         "role": "roles/owner"
       },
       {
         "members": [
           "SERVICE_ACCOUNT"
         ],
         "role": "roles/logging.bucketWriter",
         "condition": {
             "title": "Bucket writer condition example",
             "description": "Grants logging.bucketWriter role to service account SERVICE_ACCOUNT used by log sink SINK_NAME",
             "expression":
               "resource.name.endsWith(\'locations/global/buckets/BUCKET_ID\')"
         }
       }
      ],
      "etag": "BwWd_6eERR4=",
      "version": 3
      }
    3. IAM ポリシーを更新します。

      gcloud projects set-iam-policy DESTINATION_PROJECT_ID output.json
      

次のステップ