レポートを作成して読み取る

Google Cloudの費用の App Optimize API レポートを作成し、レポートの生成をモニタリングして、結果のデータが準備できたら読み取る方法について説明します。このクイックスタート ガイドでは、REST API または Python クライアント ライブラリを使用できます。

始める前に

  • このガイドの例では、分析するアクティブなリソースを含む Google Cloud プロジェクトが必要です。App Optimize API は、有意義な結果を生成するために課金データと使用率データを必要とします。新しいプロジェクトまたは空のプロジェクトに対して実行されたレポートは空になります。

    このガイドでは、PROJECT_ID として識別されるプロジェクトがデータ スコープを提供し、レポート リソースをホストします。

    App Optimize API は、別のプロジェクトまたは単一プロジェクトまたはフォルダレベルの境界内のアプリケーションのデータを分析するレポートを 1 つのプロジェクトで作成することをサポートしています。複数のプロジェクトで構成される App Hub アプリケーションのレポートを生成するには、レポートを作成するために、アプリケーションに関連付けられているすべてのプロジェクトに対する必要なモニタリング権限と課金権限が必要です。

  • レポート リソースの作成と管理に使用するプロジェクトで、App Optimize API が有効になっていることを確認します。

gcloud

  • Google Cloud CLI をインストールします。

  • フェデレーション ID(連携 ID)を使用するように gcloud CLI を構成します。

    詳細については、連携 ID を使用して gcloud CLI にログインするをご覧ください。

  • gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  • gcloud CLI を初期化した後に更新して、必要なコンポーネントをインストールします。

    gcloud components update
    gcloud components install beta
  • 本番環境での認証の設定については、 Google Cloud 認証ドキュメントの Google Cloudで実行されるコードのアプリケーションのデフォルト認証情報を設定する をご覧ください。

    Python

    1. App Optimize API 用の Python クライアント ライブラリをインストールします。
    2. ローカル開発環境でこのページの Python サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

      1. Google Cloud CLI をインストールします。

      2. フェデレーション ID(連携 ID)を使用するように gcloud CLI を構成します。

        詳細については、連携 ID を使用して gcloud CLI にログインするをご覧ください。

      3. ユーザー アカウントのローカル認証情報を作成します。

        gcloud auth application-default login

        認証エラーが返され、外部 ID プロバイダ(IdP)を使用している場合は、 フェデレーション ID を使用して gcloud CLI にログインしていることを確認します。

      詳細については、 Google Cloud 認証ドキュメントの ローカル開発環境の ADC の設定をご覧ください。

      本番環境での認証の設定については、 Google Cloud 認証ドキュメントの Google Cloudで実行されるコードのアプリケーションのデフォルト認証情報を設定する をご覧ください。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Google Cloud CLI をインストールし、 フェデレーション ID を使用して gcloud CLI にログインします。

    詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

    本番環境での認証の設定については、 Google Cloud 認証ドキュメントの Google Cloudで実行されるコードのアプリケーションのデフォルト認証情報を設定する をご覧ください。

    必要なロール

    このクイックスタートを使用してレポートを作成して読み取るために必要な権限を取得するには、アクティブなリソースを含むプロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

    • App Optimize 管理者 roles/appoptimize.admin
    • 閲覧者(roles/viewer)(または billing.resourceCosts.get を付与する別のロール)

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

    App Optimize API に必要な権限とロールの詳細については、IAM を使用したアクセス制御をご覧ください。

    レポートを作成する

    この例では、選択した PROJECT_ID 内の合計費用に関するレポートを作成します。レポートには、Compute Engine や Cloud Storage などの使用された各Google Cloud プロダクトと、特定の SKU とロケーションごとに費用が分類されます。レポートには過去 3 日間のデータが表示されます。

    レポート リソースを作成するには、次の手順に沿って好きな方法で操作してください。

    gcloud

    gcloud beta app-optimize reports create コマンドを使用してレポートを作成します。

    gcloud beta app-optimize reports create REPORT_ID \
      --project=PROJECT_ID \
      --location=global \
      --dimensions=location,product_display_name,project,sku \
      --metrics=cost \
      --report-filter='hour >= now - duration("72h")' \
      --scopes=project=projects/PROJECT_ID
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • REPORT_ID: 新しいレポートの一意の ID(例: my-first-report

    このコマンドは、レポート作成オペレーションが完了するまで待ってから、作成されたレポート リソースを返します。

    Python

    次の Python コードは、AppOptimizeClient.create_report() を使用してレポートを作成します。

    from google.cloud import appoptimize_v1beta
    
    project_id = "PROJECT_ID"
    report_id = "REPORT_ID"
    
    # Create the App Optimize client and prepare a request for a new report
    client = appoptimize_v1beta.AppOptimizeClient()
    report = appoptimize_v1beta.Report(
        dimensions=['location', 'product_display_name', 'project', 'sku'],
        metrics=['cost'],
        filter='hour >= now - duration("72h")',
        scopes=[
            appoptimize_v1beta.Scope(project=f"projects/{project_id}"),
        ],
    )
    request = appoptimize_v1beta.CreateReportRequest(
        parent=f"projects/{project_id}/locations/global",
        report=report,
        report_id=report_id,
    )
    
    # Request the creation of the report and wait until the process is done
    operation = client.create_report(request=request)
    print("Waiting for report creation operation to complete...")
    response = operation.result()
    print(response)
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • REPORT_ID: 新しいレポートの一意の ID(例: my-first-report)。

    operation.result() メソッドは、レポート作成オペレーションが完了するまで待機します。

    REST

    REST API の projects.locations.reports リソースパスに HTTP POST リクエストを送信します。

    1. リクエストを送信するには、次の curl コマンドを使用します。

      curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        -d '{
          "scopes": [
            {
              "project": "projects/PROJECT_ID"
            }
          ],
          "dimensions": [
            "location",
            "product_display_name",
            "project",
            "sku"
          ],
          "metrics": [
            "cost"
          ],
          "filter": "hour >= now - duration(\"72h\")"
        }' \
        "https://appoptimize.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/reports?report_id=REPORT_ID"
      

      次のように置き換えます。

      • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
      • REPORT_ID: 新しいレポートの一意の ID(例: my-first-report

      API は、レポート生成プロセスを表す長時間実行オペレーション(LRO)オブジェクトを返します。以下に示すのはレスポンスの例です。

      {
        "name": "projects/PROJECT_ID/locations/global/operations/OPERATION_ID",
        "metadata": {
          "@type": "type.googleapis.com/google.cloud.appoptimize.v1beta.OperationMetadata"
        },
        "done": false
      }
      

      "done": false ステータスは、レポートがまだ生成中であることを示します。次のステップで使用するため、OPERATION_ID をメモしておきます。

    2. レポートの生成には時間がかかることがあるため、生成プロセスが完了し、レポートのデータをダウンロードできる状態になるまで、LRO をポーリングする必要があります。

      生成プロセスのステータスを確認するには、HTTP GET リクエストをオペレーションのリソース名に送信します。

      curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://appoptimize.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/operations/OPERATION_ID"
      

      レスポンスを確認します。"done"false の場合は、5 ~ 15 秒待ってからこの手順を繰り返します。"done"true の場合、レポートの準備が完了しています。

      オペレーションが完了した場合のレスポンスの例を次に示します。

      {
        "name": "projects/PROJECT_ID/locations/global/operations/OPERATION_ID",
        "metadata": {
          "@type": "type.googleapis.com/google.cloud.appoptimize.v1beta.OperationMetadata"
        },
        "done": true,
        "response": {
          "@type": "type.googleapis.com/google.cloud.appoptimize.v1beta.Report",
          "name": "projects/PROJECT_ID/locations/global/reports/REPORT_ID",
          "scopes": [
            {
              "project": "projects/PROJECT_ID"
            }
          ],
          "dimensions": [
            "location",
            "product_display_name",
            "project",
            "sku"
          ],
          "metrics": [
            "cost"
          ],
          "filter": "hour >= now - duration(\"72h\")",
          "expireTime": "2026-02-04T22:05:05Z"
        }
      }
      

    レポートデータを読み取る

    レポートデータを取得するには、次の手順に沿って操作します。

    gcloud

    次の gcloud beta app-optimize reports read コマンドを使用して、レポートのデータを取得します。

    gcloud beta app-optimize reports read REPORT_ID \
      --project=PROJECT_ID \
      --location=global
    

    Python

    次の Python コードは、AppOptimizeClient.read_report() を使用してレポートのデータを取得します。

    from google.cloud import appoptimize_v1beta
    
    project_id = "PROJECT_ID"
    report_id = "REPORT_ID"
    name = f"projects/{project_id}/locations/global/reports/{report_id}"
    
    # Create the App Optimize client and read your report's data
    client = appoptimize_v1beta.AppOptimizeClient()
    request = appoptimize_v1beta.ReadReportRequest(
            name=name,
    )
    result = client.read_report(request=request)
    
    # Display the report's data
    print(result)
    

    REST

    LRO が完了したら、REST API の :read カスタム メソッドを使用します。

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      -d '{}' \
      "https://appoptimize.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/reports/REPORT_ID:read"
    

    API からのレスポンスには、レポートのデータ行と列の定義が含まれます。成功したレスポンスの例を次に示します。

    {
      "rows": [
        [
          "us-central1",
          "Compute Engine",
          "projects/PROJECT_ID",
          "6EC2-384A-47D9",
          {
            "currency_code": "USD",
            "units": "25",
            "nanos": 750000000
          }
        ],
        [
          "us-central1",
          "Cloud Storage",
          "projects/PROJECT_ID",
          "9ADA-9ADC-2FBE",
          {
            "currency_code": "USD",
            "units": "5",
            "nanos": 100000000
          }
        ],
        [
          "europe-west1",
          "Compute Engine",
          "projects/PROJECT_ID",
          "6EC2-384A-47D9",
          {
            "currency_code": "USD",
            "units": "18",
            "nanos": 500000000
          }
        ],
        [
          "us-central1",
          "Compute Engine",
          "projects/PROJECT_ID",
          "F61D-4D51-AAFC",
          {
            "currency_code": "USD",
            "units": "12",
            "nanos": 200000000
          }
        ]
      ],
      "columns": [
        {
          "name": "location",
          "type": "STRING",
          "mode": "NULLABLE"
        },
        {
          "name": "product_display_name",
          "type": "STRING",
          "mode": "NULLABLE"
        },
        {
          "name": "project",
          "type": "STRING",
          "mode": "NULLABLE"
        },
        {
          "name": "sku",
          "type": "STRING",
          "mode": "NULLABLE"
        },
        {
          "name": "cost",
          "type": "RECORD",
          "mode": "NULLABLE",
          "columns": [
            {
              "name": "currency_code",
              "type": "STRING",
              "mode": "NULLABLE"
            },
            {
              "name": "units",
              "type": "INT64",
              "mode": "NULLABLE"
            },
            {
              "name": "nanos",
              "type": "INT64",
              "mode": "NULLABLE"
            }
          ]
        }
      ],
      "next_page_token": ""
    }
    

    行数の多いレポートはページ分割されます。複数のページを処理するには、レポートのデータを読み取るをご覧ください。

    cost フィールドの値については、費用指標の解釈をご覧ください。データと制限事項の詳細については、データを理解するをご覧ください。

    クリーンアップ

    App Optimize API は、レポートの作成から 24 時間後にレポートを自動的に削除します。レポートをすぐに削除するには、ご希望の方法の手順に沿って操作します。

    gcloud

    gcloud beta app-optimize reports delete コマンドを使用して、レポートを削除します。

    gcloud beta app-optimize reports delete REPORT_ID \
      --project=PROJECT_ID \
      --location=global
    

    Python

    次のコードでは、AppOptimizeClient.delete_report() を使用してレポートを削除します。

    from google.cloud import appoptimize_v1beta
    
    project_id = "PROJECT_ID"
    report_id = "REPORT_ID"
    
    name = f"projects/{project_id}/locations/global/reports/{report_id}"
    client = appoptimize_v1beta.AppOptimizeClient()
    request = appoptimize_v1beta.DeleteReportRequest(name=name)
    client.delete_report(request=request)
    print(f"Deleted report: {name}")
    

    REST

    レポートのリソース エンドポイントに HTTP DELETE リクエストを送信します。

    curl -X DELETE \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://appoptimize.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/reports/REPORT_ID"
    

    次のステップ