【GA4×MCP】gcloud認証WARNINGの解決策 & AWS Workload Identity連携(127バイト制限回避)

前回、【MCP入門】VSCode+CopilotでGA4を直接分析!環境構築から活用まで完全ガイド【続編】GA4のローデータをBigQueryへ連携し、Copilotで分析基盤を構築する方法 を紹介しましたが、実際に試された方の中で、Google認証ファイルの作成時に「WARNING」が出た方はいらっしゃいませんか?

今回は、初心者向けにこのWARNINGの意味と正しい対処法を解説します。さらに、中級者・開発者向けには、AWS環境から鍵ファイル(JSONキー)を使わずにセキュアにGCPへ接続する「Workload Identity連携」について、よくある「127バイト制限エラー」の回避策と最新のPython実装コードを紹介します。

【初心者向け】gcloud認証のWARNINGと3つの選択肢

analytics-mcpを利用するために認証コマンドを実行した際、以下のような画面が表示されることがあります。

Warning画面 これは、「Googleが用意しているデフォルトのアプリID(Client ID)を使いすぎないでね(もうすぐブロックするよ)」という警告です。これを回避するためには、認証方法を理解する必要があります。大きく分けて3つのパターンがあります。

まず用語をざっくり理解しよう

専門用語が出てくると難しく感じますが、以下のように置き換えてイメージしてください。

  • プリンシパル (Principal): 「ID」のこと。人間(IAMユーザー)、ロボット(サービスアカウント)、組織など、アクセスの主体のことです。
  • OAuthクライアントID: 「アプリの名札(ID)」のこと。Googleにログインする際、「どのアプリからログインしようとしているか」を示す情報です。
  • サービスアカウント (SA): プログラム専用のロボットIDです。

パターン①:通常パターン(WARNINGが出る)

gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform

一番手軽ですが、Google共有のIDを使うため警告が出ます。将来的には使えなくなる可能性があるため、あくまで一時的なテスト用と考えてください。

パターン②:自分のOAuthクライアントIDを使う(おすすめ)

gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=YOUR_CLIENT_JSON_FILE

GCPコンソールで自分専用の「OAuthクライアントID(デスクトップアプリ用)」を作成し、そのJSONファイルを指定する方法です。

  • メリット: WARNINGが出ない。個人のGoogleアカウント権限でそのままGA4にアクセスできるため、GA4側での追加設定が不要。
  • 注意点: OAuth同意画面の作成が必要ですが、自分だけが使う「テストモード」なら審査は不要です。

パターン③:サービスアカウント(SA)へのなりすまし

gcloud auth application-default login \
  --impersonate-service-account=SERVICE_ACCOUNT_EMAIL \
  --scopes=https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform

個人の権限ではなく、作成したサービスアカウントの権限を使って操作する方法です。この場合、GA4の管理画面で、そのサービスアカウントのメールアドレスに対してアクセス権限を付与する必要があります。

結論: 個人のローカル環境で試すだけなら、②のパターンが最も安全で確実です。


【中級者向け】AWS環境でのWorkload Identity連携

ここからは、本番運用を見据えたアーキテクチャの話です。 ローカルPCでのテストなら上記の方法で良いですが、AWS上のサーバーやLambdaでanalytics-mcpbigquery mcpを動かしたい場合、認証情報(JSONキーファイル)をサーバーに置くのはセキュリティリスクがあります。

そこで登場するのがWorkload Identity連携です。物理的な鍵ファイルを持たずにGCPリソースへアクセスできます。

GCP側の設定手順

1. サービスアカウントの作成

まず、AWSからのアクセスを受け入れるサービスアカウントを作成します。

サービスアカウント作成

2. Workload Identity プールの作成

外部ID(AWS)を受け入れる「プール」を作成します。

Workload Identityプール

プール名を入力して続行します。

プール作成画面

3. プロバイダ(AWS)の追加

プールにAWSをプロバイダとして追加し、AWSアカウントIDを指定します。

プロバイダ追加

4. 属性マッピングの設定(重要:127バイト制限の回避)

ここでAWSから送られてくる情報をGCP側でどう認識するかを定義します。ここがエラー回避の最大のポイントです。

属性マッピング

Google Cloudの識別子である google.subject には 127バイトの長さ制限 があります。デフォルトの設定では、AWSのIAMロール名やセッション名が長い場合にこの制限を超過し、エラーになることがあります。

CEL式(Common Expression Language)の解説 設定には以下の関数や式を使用します。

  • contains('文字列'): 指定した文字列が含まれているかをチェックします(True/False)。
  • extract('パターン'): {変数名} と記述した部分の文字列を抜き出します。
  • 条件 ? A : B: 三項演算子です。「もし条件がTrueならA、そうでなければB」という意味です。

推奨するマッピング設定 以下のように設定を変更することで、長いARNから不要な部分を削ぎ落とし、エラーを回避できます。

(AWS 1) google.subject へのマッピング:

assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/')
  • 解説: ARN全体から「ロール名」までの重要な部分だけを抽出し、後ろに付く可変の長いセッションID等をカットします。
  • 効果: 文字数が大幅に削減され(例: 130文字→77文字)、127バイト制限をクリアできます。

(AWS 2) attribute.aws_role へのマッピング:

assertion.arn.extract('assumed-role/{role_name}/')
  • 解説: ロール名(例: my-app-role)だけを抽出して、aws_role という属性に保存します。次のステップでの権限設定で役立ちます。

5. アクセス権の付与

作成したプールに対して、サービスアカウントへの「なりすまし権限」を与えます。

アクセス権付与一覧

「サービスアカウントの権限借用を使用してアクセス権を付与する」を選択し、先ほどマッピングした aws_role 属性を使って制限をかけます。

権限付与詳細

  • プリンシパルを選択:
    • 属性名: aws_role
    • 属性値: xxxxxxxx_role (許可したいAWSロール名)

これにより、特定のIAMロールからのみアクセスを許可するセキュアな構成になります。

6. 構成ファイルのダウンロード

最後に構成ファイル(JSON)をダウンロードします。

構成ファイルDL

Pythonによる実装サンプル

analytics-mcpbigquery mcpをPythonから呼び出すサンプルコードです。以前のコードから改良し、EC2メタデータ設定の自動クリーニングや、AWS環境(Lambda, Fargate等)での実行を想定したコードになっています。

"""
Simple test to trigger analytics-mcp tool execution and see debug output
2026/2/3追記:BigQuery MCPツールも追加しました
"""

import asyncio
import os
import json
import boto3

from mcp import StdioServerParameters, stdio_client
from strands.tools.mcp import MCPClient

def create_gcp_workload_identity_config():
    """AWS Workload Identity用のGCP設定ファイルを生成
    
    【処理の流れ】
    1. GCP_WORKLOAD_IDENTITY_TEMPLATE 環境変数からテンプレートファイルを読み込み
    2. credential_source から EC2メタデータ用フィールド(url, region_url)を削除
    3. カレントディレクトリに gcp-workload-config.json として保存
    4. 絶対パスを返却

    【重要】テンプレートファイルの取得方法
    - GCPコンソール > Workload Identity プール > プロバイダー
    - 「構成をダウンロード」からJSON取得
    
    Returns:
        str: 生成した設定ファイルの絶対パス。テンプレート未設定の場合は空文字列。
    """

    # テンプレートファイルのパスを環境変数から取得
    template_path = os.getenv("GCP_WORKLOAD_IDENTITY_TEMPLATE")
    
    # テンプレートが指定されていない場合は処理をスキップ
    if not template_path:
        return ""
   
    # テンプレート全体を読み込んでコピー
    with open(template_path, "r") as f:
        config = json.load(f)

    # credential_source から EC2 メタデータ用のフィールドを削除
    # GCPからダウンロードしたテンプレートには以下が含まれている:
    # - "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials"
    # - "region_url": "http://169.254.169.254/latest/meta-data/placement/availability-zone"
    if "credential_source" in config:
        if "region_url" in config["credential_source"]:
            config["credential_source"].pop("region_url")
        if "url" in config["credential_source"]:
            config["credential_source"].pop("url")

    # カレントディレクトリに保存
    config_file = "gcp-workload-config.json"
    with open(config_file, "w") as f:
        json.dump(config, f, indent=2)
    
    # 絶対パスを取得(MCPサブプロセスから確実にアクセスできるようにするため)
    abs_config_file = os.path.abspath(config_file)

    return abs_config_file

async def test_ga_with_mcp():
    """Test Google Analytics API via analytics-mcp with debug logging"""

    print("\n1. Creating GCP workload identity config from template...")
    config_file = create_gcp_workload_identity_config()

    print("\n2. Ensuring AWS session token...")
    # boto3から現在のセッション認証情報を取得
    session = boto3.Session()
    creds = session.get_credentials()
    frozen_creds = creds.get_frozen_credentials()

    # 念のためトークンがあるかチェック(AWS環境なら必ずあるはず)
    if not frozen_creds.token:
        print("Warning: No Session Token found. This script is intended to run on AWS Environment (IAM Role).")

    # MCPサブプロセスに渡す環境変数
    # AWSの認証情報を環境変数として明示的に渡すことで、
    # Google Authライブラリがこれを検知してWorkload Identity連携を行う
    env = {
        "GOOGLE_APPLICATION_CREDENTIALS": config_file,
        "AWS_ACCESS_KEY_ID": frozen_creds.access_key,
        "AWS_SECRET_ACCESS_KEY": frozen_creds.secret_key,
        "AWS_SESSION_TOKEN": frozen_creds.token, 
        "AWS_REGION": session.region_name or "us-east-1",
    }
   
    print(f"\n3. Starting analytics-mcp with config...")
    
    # MCPクライアント経由でanalytics-mcpを起動
    ga_mcp = MCPClient(
        lambda: stdio_client(
            StdioServerParameters(
                command="uvx",
                args=["analytics-mcp"],
                env=env, # ここで環境変数を渡すのが重要
            )
        )
    )

    # 2026/2/3追記:BigQuery MCPツールも追加しました
    # サービスアカウントに「BigQueryジョブユーザー」「BigQueryメタデータ閲覧者」「BigQueryデータ閲覧者」の権限を追加してください。
    bigquery_mcp = MCPClient(
        lambda: stdio_client(
            StdioServerParameters(
                command="toolbox",
                args=["--prebuilt","bigquery","--stdio"],
                env={
                    # 環境変数GOOGLE_BIGQUERY_PROJECTにGCPプロジェクトIDをセットしておくこと
                    "BIGQUERY_PROJECT": os.getenv("GOOGLE_BIGQUERY_PROJECT"),
                    "GOOGLE_APPLICATION_CREDENTIALS": config_file,
                    "AWS_ACCESS_KEY_ID": frozen_creds.access_key,
                    "AWS_SECRET_ACCESS_KEY": frozen_creds.secret_key,
                    "AWS_SESSION_TOKEN": frozen_creds.token, 
                    "AWS_REGION": session.region_name or "us-east-1"
                }
            )
        )
    )

    with ga_mcp, bigquery_mcp:
        print("\n4. Listing tools...")
        tools = ga_mcp.list_tools_sync()
        print(f"   Found {len(tools)} tools")

        print("\n5. Calling get_account_summaries...")
        result = await ga_mcp.call_tool_async(
            tool_use_id="test-1",
            name="get_account_summaries",
            arguments={}
        )
        print(json.dumps(result, indent=2, ensure_ascii=False))

        # 2026/2/3追記:BigQuery MCPツールも追加しました
        tools.extend(bigquery_mcp.list_tools_sync())
        print("\n6. Calling list_datasets on BigQuery MCP...")
        bq_result = await bigquery_mcp.call_tool_async(
            tool_use_id="test-2",
            name="list_dataset_ids"
        )
        print(json.dumps(bq_result, indent=2, ensure_ascii=False))

if __name__ == "__main__":
    asyncio.run(test_ga_with_mcp())

補足:

実行手順

  1. GA4への権限付与: サービスアカウントのメールアドレスをGA4プロパティの「アクセス管理」に追加してください。
  2. BigQueryの権限付与: サービスアカウントに「BigQueryジョブユーザー」「BigQueryメタデータ閲覧者」「BigQueryデータ閲覧者」の権限を追加してください。
  3. ライブラリ追加: uv add mcp boto3 strands-agents-tools
  4. テンプレート配置: GCPからダウンロードしたJSONファイルを配置。
  5. 環境変数: export GCP_WORKLOAD_IDENTITY_TEMPLATE=ダウンロードしたファイル名.json export GOOGLE_BIGQUERY_PROJECT=GCPのプロジェクトID
  6. 実行: uv run xxx.py でスクリプトを実行。

この構成であれば、AWSのロール名が長くても127バイト制限のエラーに悩まされることなく、セキュアにGCPと連携可能です。



コメント (0)

コメントを投稿するにはログインが必要です。