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

Cloud Asset API を操作するときに発生する可能性のある一般的な問題と、その対処方法を以下に示します。

リクエストに無効な認証情報が含まれているのはなぜですか?

OAuth ヘッダーを正しく設定しない場合、呼び出しで次のエラーが返されます。

{
  "error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected
               OAuth 2 access token, login cookie or other valid
               authentication credential. See
               https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "Authentication error: 2"
      }
    ]
  }
}

この問題に対処するには、初期設定を確認する手順を繰り返します。

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

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

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

gcurl -d '{"outputConfig":{"gcsDestination": \
{"uri":gs://YOUR_BUCKET/NEW_FILE}}}' \
https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER: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 Storage コマンドへのエクスポートが失敗する理由は何ですか?

エクスポートしたデータを保存する Cloud Storage バケットが、エクスポート実行元の Cloud Asset API 対応プロジェクトの中にない場合、リクエストを実行すると次のアクセス拒否エラーが発生します。

    {
     "error": {
      "code": 7,
      "message": "Failed to write to: YOUR_BUCKET/FILE",
     }
    }
    

この問題を解決するには、エクスポート元の Cloud Asset API 対応プロジェクトに属する Cloud Storage バケットを使用するか、service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com サービス アカウントに roles/storage.admin のロールを付与します。ここで PROJECT_NUMBER は、エクスポート実行元の Cloud Asset API 対応プロジェクトのプロジェクト番号です。

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

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

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

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

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

BatchGetAssetsHistory のリクエスト URL が長すぎる場合はどうなりますか?

BatchGetAssetsHistory メソッドは、長さ制限のある URL ですべてのリクエスト データを送信する HTTP GET アクションです。そのため、リクエストが長すぎるとエラーが発生します。

これを回避するには、クライアント コードで Content-Typeapplication/x-www-form-urlencoded に設定して X-HTTP-Method-Override: GET HTTP ヘッダーとともにリクエストを送信する必要があります。詳細については、長いリクエスト URL をご覧ください。

HTTP POST を使用した BatchGetAssetsHistory のリクエストの例を次に示します。

curl -X POST -H "X-HTTP-Method-Override: GET" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -H "Authorization: Bearer " \
     -d 'assetNames=&contentType=1&readTimeWindow.startTime=2018-09-01T09:00:00Z' \
     https://cloudasset.googleapis.com/v1/projects/:batchGetAssetsHistory

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

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

Your application has authenticated using end user credentials from the
Cloud SDK 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 ツールを使用する場合は、gcloud asset コマンドとともにフラグ --billing-project <var>PROJECT_ID</var> を指定するか、次のコマンドを使用します。

gcloud config set billing/quota_project PROJECT_ID

現在のプロジェクトに属さない BigQuery テーブルにアセットをエクスポートするにはどうすればよいですか?

Cloud Asset API 対応プロジェクト(A)から ExportAssets API を呼び出す場合、service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com サービス アカウントを使用して、宛先の BigQuery テーブルに書き込みます。別のプロジェクト(B)の BigQuery テーブルに出力するには、以下の手順に従います。

プロジェクト B の Identity and Access Management(IAM)ポリシーで、サービス アカウント(service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com)に roles/bigquery.userroles/bigquery.dataEditor のロールを付与します。

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

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")。