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

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

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

始める前に

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. ユーザー管理のサービス アカウントがあることを確認し、次の変数をユーザー管理のサービス アカウントに適した値に設定します。

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

    • CUSTOM_SA: ユーザー管理のサービス アカウントのメールアドレス。

    サービス アカウントの作成方法について詳しくは、サービス アカウントを作成するをご覧ください。

  3. ログシンクの宛先として機能するログバケットがあることを確認し、次の変数をログバケットに適した値に設定します。必要に応じて、ログバケットを作成します。

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

    • LOCATION: ログバケットのロケーション。

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

  4. ログシンクを作成するプロジェクトに存在する Logging サービス アカウントの名前を特定し、次の変数を適切な値に設定します。

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

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

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      レスポンスの loggingServiceAccountId で始まる行に、サービス アカウントのメールアドレスが示されます。

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

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

    プロジェクト間でのサービス アカウントの有効化の詳細については、プロジェクト間でサービス アカウントの接続を有効にするをご覧ください。

  6. IAM ロールを付与する

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

    ユーザー管理のサービス アカウントがシンクの宛先にログエントリを書き込めるようにする

    次のステップで作成するシンクの宛先にログエントリを書き込むために必要な権限を、ユーザー管理のサービス アカウントに付与します。シンクの宛先は、LOG_BUCKET_PROJECT_ID という名前のプロジェクトに保存されているログバケットになります。

    ユーザー管理のサービス アカウントに必要な権限を付与するには、ログバケットを含むプロジェクトに対するログバケット書き込みロール(roles/logging.bucketWriter)を付与します。

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

    上記のコマンドの詳細については、gcloud projects add-iam-policy-binding をご覧ください。

    サービス アカウントの権限借用を構成する

    デフォルトの Cloud Logging サービス アカウント LOGGING_SA を構成して、ユーザー管理のサービス アカウント CUSTOM_SA の権限を借用できるようにします。デフォルトの Cloud Logging サービス アカウントは、ユーザー管理のサービス アカウントを使用するログシンクを作成する Google Cloud プロジェクトに存在します。

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

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

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

    サービス アカウント トークン作成者のロールの詳細については、サービス アカウント トークン作成者ロールをご覧ください。

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

    プリンシパルがユーザー管理のサービス アカウントとしてオペレーションを実行できるようにする

    シンクを作成するプリンシパルに、ユーザー管理のサービス アカウントとしてオペレーションを実行するために必要な権限を付与します。

    必要な権限を付与するには、ユーザー管理のサービス アカウント CUSTOM_SA_PROJECT_ID を保存する Google Cloud プロジェクトで、サービス アカウント ユーザー ロール(roles/iam.serviceAccountUser)をプリンシパルに付与します。

    以下のコマンドを実行する前に、次のように置き換えます。

    • PRINCIPAL: ロールを付与するプリンシパルの ID。通常、プリンシパル ID の形式は PRINCIPAL-TYPE:ID です。例: user:my-user@example.com PRINCIPAL に使用できる形式の一覧については、プリンシパル ID をご覧ください。

    gcloud iam service-accounts add-iam-policy-binding コマンドを実行します。

    gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
    --project=CUSTOM_SA_PROJECT_ID \
    --member='PRINCIPAL' \
    --role='roles/iam.serviceAccountUser'
    

    カスタムロールを使用する場合は、プリンシパルに iam.serviceAccounts.actAs 権限が必要です。

    サービス アカウント ユーザー ロールの詳細については、サービス アカウント ユーザー ロールをご覧ください。

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

    ユーザー管理のサービス アカウントでシンクを作成するには、gcloud logging sinks create コマンドを実行し、--custom-writer-identity オプションを含めます。

    以下のコマンドを実行する前に、次のように置き換えます。

    • SINK_NAME: ログシンクの名前。

    gcloud logging sinks create コマンドを実行します。

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

    シンクがログエントリを転送していることを確認する

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

    シンクがログエントリを正しく転送していることを確認するには、次のようにします。

    1. gcloud logging write コマンドを実行します。

      以下のコマンドを実行する前に、次のように置き換えます。

      • LOG_NAME: ログの名前です。たとえば、このフィールドを mylog に設定できます。

      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
      

    次のステップ