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

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

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

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

プロジェクトのサービス アカウントは、Cloud 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 または Google Kubernetes Engine のリソースの管理、Cloud Storage バケットへのアクセスが該当します。

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

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

  1. Cloud Build 設定ページを開きます。

    Cloud Build 設定ページを開く

    [サービス アカウント権限] ページが表示されます。

    サービス アカウント権限ページのスクリーンショット

  2. 追加するロールのステータスを「有効」に設定します。

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

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

gsutil

サービス アカウントにこれらの権限を付与するには、シェルまたはターミナル ウィンドウで次のコマンドを実行します。

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

    gsutil ls
    

    Container Registry バケット URL は、gs://artifacts.[PROJECT_ID].appspot.com または gs://[STORAGE_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
    

ここで

  • [STORAGE_REGION] は、イメージをホストするレジストリのマルチリージョンasiaeu または us)です。
  • [PROJECT_NUMBER_A] は、プロジェクト A のプロジェクト番号です。
  • [PROJECT_ID_B] は、プロジェクト B のプロジェクト ID です。

Console

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

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

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

gsutil

サービス アカウントにこれらの権限を付与するには、シェルまたはターミナル ウィンドウで次のコマンドを実行します。

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

    gsutil ls
    

    Container Registry バケット URL は、gs://artifacts.[PROJECT_ID].appspot.com または gs://[STORAGE_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
    

ここで

  • [STORAGE_REGION] は、イメージをホストするレジストリのマルチリージョンasiaeu または us)です。
  • [PROJECT_NUMBER_A] は、プロジェクト A のプロジェクト番号です。
  • [PROJECT_ID_B] は、プロジェクト B のプロジェクト ID です。

Console

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

トラブルシューティング

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

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

次のステップ