サービス アカウント権限の設定

このページでは、Cloud Build サービス アカウントの動作と、サービス アカウントに他のプロジェクトへのアクセス権を付与する方法について説明します。

Cloud Build サービス アカウントとは

Cloud Build は、ユーザーの代わりにビルドを実行する特別な Google アカウントであるサービス アカウントを使用してビルドを実行します。Cloud Build サービス アカウントのメールアドレスは [PROJECT_NUMBER]@cloudbuild.gserviceaccount.com です。

プロジェクトのサービス アカウントは GCP Console の [IAM] メニューから表示できます。

Cloud Build API を有効にすると、サービス アカウントが自動的に作成され、プロジェクトに対する Cloud Build Service Account の役割が付与されます。この役割は、次のようなタスクには十分です。

  • プロジェクトの Cloud Source Repositories のリポジトリからコードをフェッチする
  • プロジェクトが所有する任意の Cloud Storage バケットからファイルをダウンロードする
  • Cloud Logging にビルドログを保存する
  • Container Registry に Docker イメージを push する
  • Container Registry からベースイメージを pull する

サービス アカウントは、ビルドを実行するために必要な場合にのみこれらのアクションを実行します。たとえば、サービス アカウントでは、コードをフェッチするように指定しない限り、Cloud Source Repositories リポジトリからコードをフェッチすることはありません。

追加のアクセス権を付与する

サービス アカウントのデフォルトの権限だけでは、アカウントに実行を許可できない特定のアクションがあります。たとえば、App Engine または Cloud Functions へのデプロイ、Compute Engine または Kubernetes Engine のリソースの管理、Cloud Storage バケットへのアクセスなどです。

アカウントに追加の IAM の役割を付与することで、サービス アカウントでこれらのアクションを実行可能にできます。

IAM の役割を Cloud Build サービス アカウントに付与するには:

  1. GCP Console で [IAM] ページを開きます。

    [IAM] ページを開く

  2. プロジェクトを選択し、[続行] をクリックします。

  3. メンバーリストで、[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com という名前の Cloud Build サービス アカウントを探します。[PROJECT_NUMBER] は GCP プロジェクトのプロジェクト番号です。

  4. その行の鉛筆アイコンをクリックします。

  5. [別の役割を追加] をクリックし、プルダウンから役割を選択して [保存] をクリックします。

別の Google Cloud Platform プロジェクトから非公開イメージを pull する

別の Cloud Platform プロジェクトから非公開イメージを pull する権限を付与できます。これは、サービス アカウントにそのプロジェクトへのアクセス権がある場合に可能です。たとえば、プロジェクト B からイメージを pull できるプロジェクト A でビルドを実行する必要があることがあります。

gsutil

これらの権限をサービス アカウントに付与するには、shell またはターミナル ウィンドウで次のコマンドを実行します。[PROJECT_NUMBER_A] はプロジェクト A のプロジェクト番号、[PROJECT_ID_B] はプロジェクト B のプロジェクト ID です。

  1. レジストリの Cloud Storage バケットの名前を調べます。これを行うには、バケットを一覧表示します。

    gsutil ls
    

    Container Registry バケットの URL として、gs://artifacts.[PROJECT-ID].appspot.com or gs://[REGION].artifacts.[PROJECT-ID].appspot.com が表示されます。

  2. プロジェクト B のオブジェクトを読むため、プロジェクト A のサービス アカウントのためのアクセス許可を付与します。

    gsutil acl ch -r -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  3. プロジェクト B のバケットを読むため、プロジェクト A のサービス アカウントに読み取り権限を付与します。

    gsutil acl ch    -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  4. プロジェクト B のデフォルトの ACL を更新して、上記の手順 1 と 2 を実行した後に作成されるオブジェクトの読み取り権限が、プロジェクト A のサービス アカウントに付与されるようにします。

    gsutil defacl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    

Console

GCP Console を使用して権限を付与する手順については、アクセス制御リストの作成と管理をご覧ください。

非公開イメージを別の Google Cloud Platform プロジェクトに push する

別の Cloud Platform プロジェクトに非公開イメージを push する権限を付与できます。これは、サービス アカウントにそのプロジェクトへのアクセス権がある場合に可能です。たとえば、プロジェクト B にイメージを push できるプロジェクト A でビルドを実行する必要があることがあります。

gsutil

これらの権限をサービス アカウントに付与するには、shell またはターミナル ウィンドウで次のコマンドを実行します。[PROJECT_NUMBER_A] はプロジェクト A のプロジェクト番号、[PROJECT_ID_B] はプロジェクト B のプロジェクト ID です。

  1. レジストリの Cloud Storage バケットの名前を調べます。これを行うには、バケットを一覧表示します。

    gsutil ls
    

    Container Registry バケットの URL として、gs://artifacts.[PROJECT-ID].appspot.com or gs://[REGION].artifacts.[PROJECT-ID].appspot.com が表示されます。

  2. プロジェクト B のオブジェクトを更新するため、プロジェクト A のサービス アカウントのためのアクセス許可を付与します。

    gsutil acl ch -r -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  3. プロジェクト B のバケットに書き込むため、プロジェクト A のサービス アカウントのための書き込み権限を付与します。

    gsutil acl ch    -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  4. プロジェクト B のデフォルトの ACL を更新し、上記の手順 1 と 2 を実行した後に作成されるオブジェクトの書き込み権限が、プロジェクト A のサービス アカウントに付与されるようにします。

    gsutil defacl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    

Console

GCP Console を使用して権限を付与する手順については、アクセス制御リストの作成と管理をご覧ください。

トラブルシューティング

ビルドログに 403(アクセス拒否)エラーがある場合は、次の手順をお試しください。

  • Cloud Build API を無効にしてから、再度有効にします。これにより、サービス アカウントが再度プロジェクトにアクセスできるようにします。
  • 上記のコマンドをもう一度実行します。

次のステップ

フィードバックを送信...