ユーザー管理のサービス アカウントでログシンクを構成する

このページでは、ユーザー管理のサービス アカウントで構成されたシンクを作成してログをルーティングする方法について説明します。デフォルトでは、Logging はリソース内のすべてのシンクに Logging サービス アカウントを使用します。ただし、ログシンクが別のプロジェクトにある場合、独自のユーザー管理サービス アカウントを作成して管理できます。これにより、ユーザー管理のサービス アカウントを含むプロジェクトから Identity and Access Management の権限を集中管理できます。

シンクの宛先がログバケットまたは Google Cloud プロジェクトの場合にのみ、ユーザー管理のサービス アカウントを使用するシンクを作成できます。このドキュメントの例では、宛先がログバケットであるユーザー管理のサービス アカウントを使用するシンクを設定する方法を示しています。

準備

  1. このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。

  2. ユーザー管理のサービス アカウントがあることを確認します。サービス アカウントの作成方法については、サービス アカウントを作成するをご覧ください。

  3. このドキュメントのコマンドを使用するには、次の値を指定します。

    • DESTINATION_PROJECT_ID: ログバケットを含むプロジェクトのプロジェクト ID。

    • CUSTOM_SA_PROJECT_ID: ユーザー管理のサービス アカウントを含むプロジェクトのプロジェクト ID。

    • SINK_PROJECT_ID: ログシンクを作成するように計画しているプロジェクトのプロジェクト ID。

    • CUSTOM_SA: ユーザー管理のサービス アカウント。サービス アカウントの作成方法については、サービス アカウントを作成するを参照してください。

      ユーザー管理のサービス アカウントの形式は、次のようになります。

      SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    • LOGGING_SA: デフォルトの Logging サービス アカウント。このメールを取得するには、次のコマンドを実行します。

         gcloud logging settings describe --project=SINK_PROJECT_ID
      

      出力には、サービス アカウントに関する次の情報が含まれます。

      loggingServiceAccountId: serviceAccount:service-123456789012@gcp-sa-logging.iam.gserviceaccount.com

    • BUCKET_NAME: ログバケットの名前。

      ログバケットのシンクの宛先パスは次のようになります。

      logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME

  4. ユーザー管理のサービス アカウントを含むプロジェクトで、組織のポリシーのブール型制約 iam.disableCrossProjectServiceAccountUsage が適用されていないことを確認します。デフォルトでは、この制約が適用されます。この制約を無効にして、別のプロジェクトのリソースにサービス アカウントを接続できるようにするには、次のコマンドを実行します。

      gcloud resource-manager org-policies disable-enforce \
      iam.disableCrossProjectServiceAccountUsage \
      --project=CUSTOM_SA_PROJECT_ID
    

    プロジェクト間でサービス アカウントを有効にする方法については、サービス アカウントをプロジェクト間で接続できるようにするをご覧ください。

IAM ロールを付与する

このセクションでは、ユーザー管理のサービス アカウントを使用するシンクを作成するための前提条件について説明します。

ログシンクの宛先であるログバケットを含むプロジェクトで、次の操作を行います。

  1. ログバケット書き込みロール(roles/logging.bucketWriter)をユーザー管理のサービス アカウントに付与します。このロールにより、ユーザー管理のサービス アカウントはログバケットにログを書き込めます。

     gcloud projects add-iam-policy-binding DESTINATION_PROJECT_ID \
     --member="serviceAccount:CUSTOM_SA" \
     --role="roles/logging.bucketWriter"
    

ユーザー管理のサービス アカウントを使用するログシンクを作成する Google Cloud プロジェクトで、次の操作を行います。

  1. サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を、ユーザー管理のサービス アカウントの Cloud Logging サービス アカウントに付与します。

      gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
      --project=CUSTOM_SA_PROJECT_ID \
      --member="serviceAccount:LOGGING_SA" \
      --role="roles/iam.serviceAccountTokenCreator"
    

    上記のコマンドにより、サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を使用して、Logging サービス アカウントがユーザー管理のサービス アカウントの権限を借用できます。

    サービス アカウントのなりすましには、リソースへのアクセス権を持たないサービス アカウントとリソースにアクセスする権限を持つサービス アカウントの 2 つのプリンシパルが関与します。この場合、ユーザー管理のサービス アカウントは、宛先プロジェクトのログバケットにログを書き込むことができるため、権限のあるアカウントです。Logging サービス アカウントには、ログをルーティングする権限があります。

    サービス アカウント トークン作成者のロールの詳細については、サービス アカウントの管理となりすましのロール: サービス アカウント トークン作成者のロールをご覧ください。

    サービス アカウントの権限借用の詳細については、サービス アカウントの権限借用についてをご覧ください。

  2. ログシンクを作成するプリンシパルにサービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を付与します。具体的には、プリンシパルにサービス アカウントに対する iam.serviceAccounts.actAs 権限が必要です。

     gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
     --member 'user:user@example.com' \
     --role "roles/iam.serviceAccountUser"
    

    上記のコマンドを使用すると、ユーザーはユーザー管理のサービス アカウントとして操作を実行できます。

    サービス アカウント ユーザーのロールの詳細については、サービス アカウントの管理となりすましのロール: サービス アカウント ユーザーのロールをご覧ください。

ユーザー管理のサービス アカウントを使用するログシンクを作成する

gcloud

ユーザー管理のサービス アカウントでシンクを作成するには、変数を独自の情報に置き換え、gcloud logging sinks create コマンドを --custom-writer-identity フラグで実行します。

    gcloud logging sinks create SINK_NAME logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
    --custom-writer-identity=serviceAccount:CUSTOM_SA \
    --project=SINK_PROJECT_ID

API

  1. Google Cloud プロジェクトにログシンクを作成するには、Logging API の projects.sinks.create を使用します。LogSink オブジェクトで、customWriterIdentity パラメータを渡します。メソッドのリクエストの本文に適切な値を指定します。

    • name: シンクの識別子。シンクを作成した後は、シンクの名前は変更できませんが、シンクを削除して新しいシンクを作成することはできます。
    • destination: ログをルーティングするログバケット。宛先のパスの形式は次のとおりです。

      logging.googleapis.com/projects/DESTINATION_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME
      
  2. projects.sinks.create を呼び出してシンクを作成します。

Logging API を使用したシンクの作成の詳細については、LogSink のリファレンス ドキュメントをご覧ください。

シンクがログをルーティングすることを確認する

このセクションでは、gcloud CLI を使用してログエントリの書き込みと読み取りを行い、シンクがログを正しくルーティングしていることを確認します。

シンクがログを正しくルーティングしていることを確認するには、次のようにします。

  1. 変数を独自の情報に置き換え、gcloud logging write コマンドを使用してサンプル ログエントリを書き込みます。

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    上記のコマンドは、次のメッセージを返します。

    Created log entry.

  2. 書き込んだログエントリを読み取るには、次のコマンドを実行します。

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

次のステップ