よくある質問とトラブルシューティング

Cloud Asset Inventory はグローバル サービスですか?

はい。Cloud Asset API はロケーションに依存しません。グローバル エンドポイントがあり、Cloud Asset Inventory でサポートされているすべてのリージョン アセットとグローバル アセットのメタデータが提供されます。Cloud Asset API には任意のゾーンでアクセスできます。

Cloud Asset Inventory では、どのような種類のデータの整合性を確保できますか?

Cloud Asset Inventory は、現在のデータに対する結果整合性と、履歴データに対するベスト エフォート型の整合性を提供します。実際には可能性は低いものの、Cloud Asset Inventory が過去のアセットの更新を見逃す可能性があります。

Cloud Asset API を使用する権限がないのはなぜですか?

アセットをエクスポートする権限や、組織、プロジェクト、フォルダの履歴を取得する権限がない場合はエラーが返されます。

たとえば、権限がない状態で次のコマンドを実行したとします。

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
          "outputConfig": {
            "gcsDestination": {
              "uri": "gs://BUCKET_NAME/FILENAME"
            }
          }
         }' \
         https://cloudasset.googleapis.com/v1/projects/PROJECT_ID:exportAssets

次のエラーを返します。

{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "[ORIGINAL ERROR] generic::permission_denied: Request
        denied by Cloud IAM."
      }
    ]
  }
}

この問題に対処するには、プロジェクトまたは組織の管理者にアクセス権限を要請してください。エクスポートまたは履歴取得の対象とするアセットに応じて、次のいずれかのロール、または規定の Cloud Asset API 権限を含む他のロールが必要です。

  • cloudasset.viewer

  • cloudasset.owner

役割と権限の詳細については、役割についてをご覧ください。

Cloud Asset API のアクセス制御オプションの詳細については、アクセス制御をご覧ください。

エクスポートでアクセス拒否エラーが返されるのはなぜですか?

特に指定しない限り、Cloud Asset Inventory は、アクティブなプロジェクトのデフォルトの Cloud Asset Inventory サービス アカウントを使用して、Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルなどのリソースを管理します。このサービス アカウントは、プロジェクトから Cloud Asset Inventory API を初めて呼び出すときに作成され、同じプロジェクト内にある限り、これらのリソースを管理する権限がデフォルトで付与されます。

次の場合、権限拒否エラーが返されることがあります。

  • REST API を使用すると、アクティブなプロジェクトが設定されないため、Cloud Asset Inventory は使用するサービス アカウントを認識しません。

  • gcloud CLI を Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルがあるプロジェクトとは別のプロジェクトで使用する場合。つまり、アクティブなプロジェクトのデフォルトの Cloud Asset Inventory サービス アカウントは、タスクを実行するために使用され、他のプロジェクトのリソースへの書き込み権限がないこともあります。

Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルへのエクスポートをリクエストする際に正しいサービス アカウントが使用されるようにするには、正しいデフォルトの Cloud Asset インベントリ サービス アカウントを含むプロジェクト ID を指定します。プロジェクト間でエクスポートする場合は、特定のロールをサービス アカウントに付与する必要もあります。

gcloud

gcloud CLI の場合は、コマンドに --billing-project フラグを追加して、正しいサービス アカウントを含むプロジェクト ID を指定します。

--billing-project=BILLING_PROJECT_ID

また、gcloud CLI でコマンドを実行する前に、課金プロジェクトを設定することもできます。まず、課金プロジェクトがコア プロジェクトと異なるかどうかを確認します。

gcloud config list

必要に応じて、課金プロジェクトを設定します。

gcloud config set billing/quota_project BILLING_PROJECT_ID

次の値を指定します。

  • BILLING_PROJECT_ID: Cloud Asset Inventory API が有効なプロジェクト ID と、ターゲット Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルを管理する権限を持つサービス アカウント。

REST

REST API の場合は、X-Goog-User-Project ヘッダーを追加して、正しいサービス アカウントを含むプロジェクト ID を指定します。curl を使用する場合は、-H フラグでヘッダーを設定します。

-H "X-Goog-User-Project: BILLING_PROJECT_ID"

次の値を指定します。

  • BILLING_PROJECT_ID: Cloud Asset Inventory API が有効なプロジェクト ID と、ターゲット Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルを管理する権限を持つサービス アカウント。

プロジェクト間でアセット メタデータをエクスポートする

1 つのプロジェクト PROJECT_A から別のプロジェクト PROJECT_B にアセット メタデータをエクスポートするには、PROJECT_A のデフォルトの Cloud Asset Inventory サービス アカウントに、 PROJECT_B これにより、次の 2 つのことが可能になります。

  • アセット メタデータを、PROJECT_A から PROJECT_B にある Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルにエクスポートできます。

  • PROJECT_A を使用して、アセット メタデータを PROJECT_B から PROJECT_B にある Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルにエクスポートできます。

プロジェクト間でアセット メタデータをエクスポートするには、次の手順を行います。

  1. リクエストを実行するプロジェクトで PROJECT_A という Cloud Asset Inventory API が有効になっていることを確認します。

  2. PROJECT_A で Cloud Asset Inventory API を 1 回以上呼び出し、デフォルトの Cloud Asset Inventory サービス アカウントを作成します。また、手動で作成することもできます。

    gcloud beta services identity create \
        --service=cloudasset.googleapis.com \
        --project=PROJECT_A_ID
    gcloud projects add-iam-policy-binding PROJECT_A_ID \
        --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
        --role=roles/cloudasset.serviceAgent
    

    Google Cloud プロジェクト番号を見つける方法

    コンソール

    Google Cloud プロジェクト番号を確認するには、次の手順を行います。

    1. Google Cloud コンソールの [ダッシュボード] ページに移動します。

      ダッシュボードに移動

    2. メニューバーの切り替えボックスをクリックします。
    3. [選択元] ボックスで組織を選択し、プロジェクト名を検索します。
    4. プロジェクト名をクリックして、そのプロジェクトに切り替えます。プロジェクト番号が [プロジェクト情報] カードに表示されます。

    gcloud CLI

    Google Cloud プロジェクト番号を取得するには、次のコマンドを使用します。

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"

  3. サービス アカウントに正しい権限を付与します。

    • Pub/Sub を介してフィードに公開するには、roles/pubsub.publisher ロールをトピックのサービス アカウントに付与します。

      gcloud pubsub topics add-iam-policy-binding projects/PROJECT_B_ID/topics/TOPIC_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/pubsub.publisher
      
    • Cloud Storage バケットに書き込むには、バケットのサービス アカウントに roles/storage.admin ロールを付与します。

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • BigQuery テーブルに書き込むには、プロジェクトのサービス アカウントに roles/bigquery.dataEditor ロールと roles/bigquery.user ロールを付与します。

      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.user
      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.dataEditor
      

Cloud Asset Inventory リクエストを行う場合は、使用するプロジェクトとして PROJECT_A を指定してください。gcloud CLI で使用するには、--billing-project フラグを PROJECT_A_ID に設定します。REST の場合、X-Goog-User-Project ヘッダーを PROJECT_A_ID に設定します。

Cloud Asset API の結果が最新ではないのはなぜですか?

Cloud Asset API のデータ更新頻度はベスト エフォートに基づきます。ほぼすべてのアセットの更新は数分でクライアントに送信されますが、まれに、Cloud Asset API メソッドの結果に最新のアセット更新が含まれない場合があります。

ExportAssets を実行したあとで一時ファイルが出力されるのはなぜですか?

ExportAssets オペレーションによって一時ファイルが出力フォルダに作成されることがあります。これらの一時ファイルをオペレーションの進行中に削除しないでください。 オペレーションが完了すると、一時ファイルは自動的に削除されます。

一時ファイルが残っている場合は、ExportAssets オペレーションが完了した後で安全に削除できます。

Google Cloud CLI または Cloud Shell 認証情報が拒否されるのはなぜですか?

リクエストのユーザー プロジェクトが Google Cloud CLI または Cloud Shell から cloudasset.googleapis.com に送信されると、次のようなエラー メッセージが表示されます。

Your application has authenticated using end user credentials from the
Google Cloud CLI or Cloud Shell which are not supported by the
cloudasset.googleapis.com. We recommend that most server applications
use service accounts instead. For more information about service accounts
and how to use them in your application, see
https://cloud.google.com/docs/authentication/.

この問題を解決するには、ユーザー プロジェクトを Cloud Asset API 対応のユーザーのプロジェクト ID に設定します。これを行うには、HTTP リクエストで HTTP ヘッダー X-Goog-User-Project を指定します。

curl を使用する場合は、次のパラメータを追加します。

-H "X-Goog-User-Project: PROJECT_ID"

gcloud CLI を使用する場合は、gcloud asset コマンドとともにフラグ --billing-project PROJECT_ID を指定するか、次のコマンドを使用します。

gcloud config set billing/quota_project PROJECT_ID

同じアセットで異なる祖先が表示されるのはなぜですか?

Cloud Asset API を呼び出して、同じアセットに対し RESOURCE メタデータと IAM POLICY メタデータなど複数のメタデータ タイプを取得する場合、ancestors フィールドがコンテンツ タイプ間で整合しない可能性があります。これは、コンテンツ タイプごとにデータ取り込みのスケジュールが異なるためです。取り込みが完了するまで、不整合が起こる可能性があります。update_time フィールドを確認して、アセットに最新の情報が指定されているかを確かめてください。

24 時間以上経過しても不整合が続く場合は、Google までお問い合わせください

ExportAssets API はどのくらいの頻度で呼び出す必要がありますか?

同じプロジェクト、フォルダ、または組織の ExportAssets API を連続で呼び出すことをおすすめします。たとえば、前の呼び出しが完了した後に 2 番目の呼び出しを発行します。アセットの更新をリアルタイムでキャプチャするには、リアルタイム通知の使用を検討してください。

重複するアセットの更新を受け取る

リアルタイム通知を設定すると、Pub/Sub トピックでアセットの更新通知を受け取ることができます。これは、Pub/Sub が 1 回以上の配信を保証しないため、配信を自動的に再試行することで発生します。

プロジェクト削除に関する通知が届かないのはなぜですか?

プロジェクトをシャットダウンした後、その操作を元に戻すための猶予が30 日間与えられます。通知の deleted フィールドは、プロジェクトが完全に削除されるまで設定されません。削除保留中のプロジェクトをモニタリングするには、プロジェクトの lifecycleState条件付きでフィードを設定します(例: temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED")。

SearchAllResources API を使用してリソースの JSON 表現を取得するにはどうすればよいですか?

デフォルトでは、read_mask が指定されていない場合、SearchAllResources は次の標準フィールドを返します。

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

上のフィールドに加えて、リソース メタデータのすべてのフィールドを取得する場合は、検索リクエストで read_mask フラグ(gcloud--read-mask)を指定できます。

read_mask は、結果で返すフィールドのカンマ区切りのリストです。versionedResourcesattachedResources などの一部のフィールドは大きすぎるため、デフォルトでは結果に含まれません。これらのフィールドを含めるには、read_mask で指定します。または、"*" を使用して、使用可能なすべてのフィールドに含めます。read_mask の値の例には、"name,location""name,versionedResources""*" があります。

gcloud の例を次に示します。

gcloud asset search-all-resources \
    --scope=organizations/123456 \
    --query="state=RUNNING" \
    --asset-types=compute.googleapis.com/Instance \
    --read-mask="name,versionedResources"