ビルドエラーのトラブルシューティング

このページでは、ビルドの実行時に発生する可能性のある一般的なエラー メッセージに対するトラブルシューティングの方法と解決策を説明します。

ビルドログを確認しましたか?

Logging または Cloud Storage のビルドログを使用して、ビルドエラーの詳細情報を取得します。stdout または stderr に書き込まれたログは、Google Cloud コンソールに自動的に表示されます。

ユーザーにビルドログへのアクセス権が付与されていないため、手動ビルドが失敗する

手動でビルドを実行しようとすると、次のエラーが表示されます。

AccessDeniedAccess denied. [EMAIL_ADDRESS] does not have storage.objects.get access to the Google Cloud Storage object.

このエラーが表示される理由は、Cloud Build では、手動ビルドを実行し、デフォルトの Cloud Storage ログバケットを使用しているユーザーに、Cloud Build 編集者のロールとプロジェクト閲覧者の IAM ロールが付与されている必要があるためです。このエラーを解決するには、次のいずれかを行います。

iam.serviceAccounts.actAs 権限がないためビルドが失敗する

Cloud Run や App Engine などのマネージド サービスを使用してビルドをデプロイしようとすると、次のエラーが表示されます。

Missing necessary permission iam.serviceAccounts.actAs for [USER] on the service account [SERVICE ACCOUNT]

このエラーに対処するには、ビルドに使用しているマネージド サービスのサービス アカウントを偽装するように、指定された Cloud Build サービス アカウントまたはデフォルトの Cloud Build サービス アカウントを構成します。このタスクの詳細については、マネージド サービスの Cloud Build サービス アカウントの権限借用を構成するをご覧ください。

サービス アカウントと権限の詳細については、次のトピックをご覧ください。

Cloud Run Functions でデプロする際に権限が拒否されたエラーが発生する

Cloud Run functions を使用しようとすると、次のエラーが表示されます。

ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.get' denied]

このエラーに対処するには、ビルド サービス アカウントに Cloud Run Functions デベロッパーのロールを付与します

cloudbuild.builds.create 権限がないため、ビルドトリガーが失敗する

ビルドトリガーの実行時に、次のようなエラーが表示されます。

Failed to trigger build: Permission 'cloudbuild.builds.create' denied on resource 'projects/xxxxxxxx' (or it may not exist)

ビルドトリガーは、サービス アカウントを使用してビルドを作成します。このエラーは、サービス アカウントに cloudbuild.builds.create IAM 権限がないことを示しています。この権限は、サービス アカウントがビルドトリガーを実行するために必要です。このエラーを解決するには、ユーザー指定のサービス アカウントまたはデフォルトのサービス アカウントCloud Build Service Account IAM ロールを付与します。

サービス エージェントの権限がないため、ビルドの送信が失敗する

Cloud Build サービス エージェントが削除された場合や、権限が不足している場合は、ビルドの送信時に次のエラーが発生することがあります。

Caller does not have required permission to use project $PROJECT_ID. Grant the caller the roles/serviceusage.serviceUsageConsumer role, or a custom role with the serviceusage.services.use permission, by visiting https://console.developers.google.com/iam-admin/iam/project?project=$PROJECT_ID and then retry. Propagation of the new permission may take a few minutes.

このシナリオの呼び出し元は、Cloud Build サービス エージェントです。この権限に関する問題を解決するには、次の手順に従います。

  1. Cloud Build サービス エージェントが存在することを確認します。プロジェクトのサービス エージェントを表示するには、 Google Cloud コンソールの [IAM] ページに移動し、[Google マネージド サービス アカウントを表示する] チェックボックスをオンにします。存在しない場合は、次の gcloud CLI コマンドを実行して作成できます。

    gcloud beta services identity create --service=cloudbuild.googleapis.com \
        --project=PROJECT_ID
    
  2. 次に、Cloud Build サービス エージェントに roles/cloudbuild.serviceAgent IAM ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com" \
        --role="roles/cloudbuild.serviceAgent"
    

サービス エージェントの権限の問題の原因となった可能性がある IAM ID を確認するには、次の操作を行います。

  1. Google Cloud コンソールでログ エクスプローラを開きます。

    [ログ エクスプローラ] に移動

  2. クエリ フィールドに次のテキストを入力します。

    resource.type="project"
    log_name="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity"
    "service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    
  3. このクエリを使用した後にログエントリが表示された場合は、サービス エージェント(service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com)から権限が削除されているかどうかを確認します。削除されている場合は、そのログの protoPayload.authenticationInfo.principalEmail を見て、権限またはエラー メッセージに記載されている権限を含む roles/cloudbuild.serviceAgent ロールの削除に関連する IAM ID を確認します。

Couldn't read commit エラーでトリガーが失敗する

ビルドトリガーの実行時に次のエラーが表示されます。

  Failed to trigger build: Couldn't read commit

存在しないブランチを使用してビルドをトリガーしようとすると、Cloud Build はこのメッセージを返します。ディレクトリ名で、スペルと整合性を確認してください。トリガーの設定手順については、ビルドトリガーを作成して管理するをご覧ください。

Pub/Sub トリガーを作成できない

Pub/Sub トリガーを作成する際に、次のエラーが表示されます。

  Failed to create trigger: Request is prohibited by organization's policy

このエラーは、プロジェクトで Pub/Sub API が制限されていることを示します。Pub/Sub API を制限するプロジェクトでは、push サブスクリプションを作成する機能が制限されます。境界内の制限付きサービスから Pub/Sub を一時的に削除し、トリガーを作成して Pub/Sub API を再度制限すると、エラーを解決できます。

エラー fatal: could not read Username が発生したため、非公開リポジトリからブランチを pull または fetch できません。

非公開リポジトリからリモート ブランチで git pull または git fetch を実行しようとすると、次のエラーが表示されます。

fatal: could not read Username for '<REMOTE_URL>': No such device or address

このエラーは、リポジトリの初回クローニング後に git 認証情報ヘルパーが意図的に削除されるため、非公開リポジトリで発生することがあります。非公開リポジトリからリモート ブランチを取得するには、認証情報(API トークン、SSH 認証鍵)をビルドステップとして手動で設定します。限定公開 GitHub リポジトリへのアクセスについて

無効な SSH 承認が原因でビルドが失敗する

ビルドの実行時に次のエラーが表示されます。

Could not parse ssh: [default]: invalid empty ssh-agent socket, make sure SSH_AUTH_SOCK is set

このエラーは、SSH 認証に問題があることを示しています。よくある例は、Cloud Build を使用して限定公開 GitHub リポジトリにアクセスすると発生する SSH 承認エラーです。GitHub の SSH の設定手順については、限定公開 GitHub リポジトリへのアクセスをご覧ください。

No route to host エラーが原因でビルドが失敗する

プライベート プールでビルドを実行すると、次のエラーまたは同様のエラーが表示されます。

Unable to connect to the server: dial tcp 192.168.10.XX:<port>: connect: no route to host

Cloud Build は、Docker コンテナを使用して、Google マネージド プロジェクトの仮想マシンで Cloud ビルダーを実行します。Docker ブリッジ インターフェース(および、その結果このインターフェースに接続されたコンテナ)には 192.168.10.0/24 の IP 範囲が割り当てられるため、同じサブネット内にある外部ホストとの通信ができなくなります。プライベート プールの構成中にプロジェクトにあるリソースの IP 範囲を割り当てる場合は、192.168.10.0/24 以外の範囲を選択することをおすすめします。手順については、プライベート プールの環境を設定するをご覧ください。

外部 IP が有効化されていないために外部リソースへの接続が失敗する

プライベート プールから外部リソースに接続すると、次のエラーが表示されます。

 Failed to connect to <external_domain>: Connection timed out

プライベート プールは、外部 IP を使用して公共のインターネットにあるリソース(外部リポジトリなど)にアクセスします。プライベート プールを作成または更新するときに、このチェックボックスをオンにして、プライベート プールに外部 IP を割り当てます。プライベート プール内のフィールドの作成または更新に関する手順については、プライベート プールの作成と管理をご覧ください。

I/O タイムアウト エラー

ビルドの実行時に次のエラーが表示されます。

Timeout - last error: dial tcp IP_ADDRESS: i/o timeout

このエラーは、ビルドを使用してプライベート ネットワーク内のリソースにアクセスしようとしたものの、失敗した場合に発生することがあります。デフォルトでは、Cloud Build を介して実行されるビルドは、公共のインターネットのプライベート リソース(リポジトリやレジストリ内のリソースなど)にアクセスできます。ただし、ビルドを使用してプライベート ネットワーク内のリソースにアクセスするには、プライベート プールを使用し、プライベート ネットワークにアクセスするようプライベート プールを構成する必要があります。プライベート ネットワークで Cloud Build を使用するをご覧ください。

4xx クライアント エラー

このエラーのグループは、リクエストの送信ユーザーが失敗したことによってビルド リクエストが正常に完了しなかったことを示します。4xx クライアント エラーの例を以下に示します。

  • **Error**: 404 : Requested entity was not found
  • **Error**: 404 : Trigger not found
  • **Error**: 400 : Failed Precondition
  • **Error**: 403 : Permission denied

4xx クライアント エラーが表示される場合は、ビルドログを確認し、エラーの理由に関する詳細情報が記載されているかどうかを確認します。クライアント エラーのよくある原因には、次のようなものがあります。

  • 指定したソースの場所には commit することが必要な新しい情報が存在せず、作業用ツリーがクリーンである。この場合はソースコードの場所を確認して、もう一度ビルドをお試しください。
  • リポジトリにビルド構成ファイルが含まれていない。これに該当する場合は、ビルド構成ファイルをリポジトリにアップロードし、ビルドを再度実行します。
  • 誤ったトリガー ID を指定した。
  • GitHub アプリのインストール後に新しいリポジトリを最近追加しており、Cloud Build に新しいリポジトリにアクセスする権限が付与されていない。これに該当する場合は、新しいリポジトリを Cloud Build に接続します。
  • ビルド サービス アカウントに別の権限を付与する必要があります。

割り当て制限が原因でビルドが失敗する

次のエラーが表示されます。これは、特定のリージョンの割り当て制限によりビルドが失敗していることを示しています。

Failed to trigger build: generic::failed_precondition: due to quota restrictions, cannot run builds in this region. Please contact support.

この特定のリージョンの割り当てを増やすには、Cloud カスタマーケアにお問い合わせください。

Docker レジストリからイメージを pull する際のタイムアウトの問題

実行後に Cloud Build ログに次のタイムアウト エラーが表示されます。

Step #0: Pulling image: python:3.8.16-alpine3.17
Step #0: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Step 1/7 : FROM python:3.8.16-alpine3.17
Get "https://registry-1.docker.io/v2/": dial tcp 34.205.13.154:443: i/o timeout

このエラーを解決するには、crane を使用して Docker イメージをダウンロードし、そのイメージを Cloud Build Docker イメージに読み込みます。

cloudbuild.yaml ファイルに次のスニペットを追加します。

...
  # Crane runs as a regular user so we need to allow it to access the directory where it saves the image.
  - name: gcr.io/cloud-builders/docker
    args:
    - a+w
    - /workspace
    entrypoint: chmod
  # Use crane to download the image through the proxy
  - name: gcr.io/go-containerregistry/crane
    env: - 'HTTPS_PROXY=HTTPS_PROXY'
    args:
    - pull
    - 'python:3.8.16-alpine3.17'
    - /workspace/image.tar
  # Use docker load to add the image into the local Cloud Build registry
  - name: gcr.io/cloud-builders/docker
    args: [load, --input, "/workspace/image.tar"]
      - .
  • HTTPS_PROXY: HTTP プロキシのアドレス(例: https://proxy.example.com:8888/)。

イメージが読み込まれると、既存の cloudbuid.yaml ステップは通常どおり動作します。

...
  - name: python:3.8.16-alpine3.17
    args:
    - echo
    - hello
    entrypoint: bash
  # Or use it internally on a Dockerfile
  - name: gcr.io/cloud-builders/docker
    args:
    - build

長時間実行 Docker ステップの Unauthenticated エラー

1 時間以上実行される Docker コマンド(大きなイメージを Artifact Registry に push するなど)を含むビルドステップは、認証エラーで失敗することがあります。Cloud Build は認証トークンを 1 時間ごとに更新しますが、Docker がこれらの新しいトークンの取得に失敗し、認証の問題が発生する可能性があります。独自の存続期間を持つ独自のトークンを作成し、Docker コマンド用にファイル化して参照できます。

VPC ネットワークにピアリングされたプライベート プール内のキューに登録されたビルド

サービス プロデューサー ネットワークが独自の VPC ネットワークにピアリングされているプライベート プールでビルドを実行する場合は、これら 2 つのネットワーク間のプライベート接続が維持されていることが重要です。プライベート プールが依存しているプライベート接続を削除すると、プライベート プールが切断される可能性があります。この場合、ビルドはキューに登録されたまま、最終的にタイムアウトします。したがって、プライベート接続を削除する場合は、このプライベート接続を使用してサービス プロデューサー ネットワークが独自の VPC ネットワークに接続されていたプライベート プールも削除してください。

2 か月以上前の保留中のビルドを承認または拒否しようとしている

2 か月を超える期間にわたり保留中のビルドを承認または却下することはできません。この操作を行うと、次のようなエラー メッセージが表示されることがあります。

 404, "message": "Requested entity was not
found.", "status": "NOT_FOUND" } }

この場合は、新しいビルドを送信してみてください。

次のステップ