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

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 はどのサービス アカウントを使用するかを知りません。

  • Pub/Sub トピック、Cloud Storage バケット、BigQuery テーブルが存在するプロジェクトとは異なるプロジェクトから gcloud CLI を使用する場合。つまり、アクティブなプロジェクトのデフォルトの 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 テーブルを管理する権限を持つサービス アカウント。

アセット メタデータをあるプロジェクトから別のプロジェクトにエクスポートする

あるプロジェクト(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 プロジェクト番号を確認する方法

    Console

    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.objectCreator ロールを付与します。

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
        --role=roles/storage.objectCreator
      
    • 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"