ロールと権限を構成する

このページでは、Artifact Registry リポジトリへの権限の付与について説明します。

始める前に

  1. API の有効化や Google Cloud CLI のインストールなど、Artifact Registry を有効にします
  2. リポジトリに固有の権限を適用する場合は、パッケージのリポジトリを作成します。

概要

Artifact Registry は Google Cloud サービスと完全に統合され、CI/CD パイプラインを実装し、セットアップ作業を最小限に抑えるデフォルトの権限を備えています。Artifact Registry をサードパーティの CI/CD ツールと統合し、リポジトリへのアクセスに必要な権限と認証を構成することもできます。

Artifact Analysis を使用してコンテナ メタデータ(イメージで見つかった脆弱性など)を処理する場合は、Artifact Analysis のドキュメントで、メタデータの表示や管理権限を付与する方法をご確認ください。

Google Cloud との統合

デフォルトでは、次の権限が Artifact Registry と同じプロジェクト内の Google Cloud CI/CD サービスに適用されます。

すべてのサービスが同じ Google Cloud プロジェクト内にあり、デフォルトの権限がニーズを満たしている場合は、権限を構成する必要はありません。

次の場合は、これらのサービスに対して Artifact Registry の権限を構成する必要があります。

  • これらのサービスを使用して、別のプロジェクトの Artifact Registry にアクセスする必要がある。Artifact Registry を使用するプロジェクトで、各サービスのサービス アカウントに必要なロールを付与します。 Cloud Run に接続する場合は、Cloud Run サービス エージェントに必要なロールを付与します。
  • Artifact Registry からイメージを pull するためのサポートが組み込まれていない GKE バージョンを使用している。構成手順については、GKE セクションをご覧ください。
  • デフォルトのサービス アカウントにリポジトリへの読み取りと書き込みのアクセス権を付与する必要がある。詳しくは以下をご覧ください。
  • ランタイム環境で、デフォルトのサービス アカウントではなく、ユーザー指定のサービス アカウントを使用している。Artifact Registry を使用するプロジェクトで、必要なロールを付与します。

サードパーティとの統合

サードパーティのクライアントの場合は、権限と認証の両方を構成する必要があります。

  1. アプリケーションに代わって動作するサービス アカウントを作成するか、CI/CD の自動化に使用する既存のサービス アカウントを選択します。
  2. 適切な Artifact Registry のロールをサービス アカウントに付与して、リポジトリへのアクセスを許可します。
  3. Artifact Registry で認証するようにサードパーティ クライアントを構成します。

ロールと権限

権限を含むロールを付与することで、Identity and Access Management(IAM)権限を付与します。プロジェクト レベルまたはリポジトリ レベルで権限を付与できます。

Artifact Registry の事前定義ロール

IAM には事前定義ロールが用意されています。こうしたロールを使用すると、特定の Google Cloud リソースに対するアクセス権を付与し、それ以外のリソースへの無認可のアクセスを防止できます。

pkg.dev ドメインの標準リポジトリ、仮想リポジトリ、リモート リポジトリには、次の事前定義ロールを使用します。

ロール 説明
Artifact Registry 読み取り
roles/artifactregistry.reader
アーティファクトの表示と取得、リポジトリのメタデータの表示。
Artifact Registry 書き込み
roles/artifactregistry.writer
アーティファクトを読み書きします。
Artifact Registry リポジトリ管理者
roles/artifactregistry.repoAdmin
アーティファクトの読み取り、書き込み、削除。
Artifact Registry 管理者
roles/artifactregistry.admin
リポジトリとアーティファクトの作成および管理。

次の追加の事前定義ロールには、gcr.io ドメインのイメージをホストする gcr.io リポジトリを作成する権限が含まれています。ロールには、pkg.dev ドメインの Artifact Registry で他のリポジトリを作成する権限は含まれていません。これらのロールは Container Registry との下位互換性をサポートします。これは、Container Registry がコンテナ イメージの最初の push を使用して各マルチリージョン レジストリを作成するためです。

ロール 説明
Artifact Registry の Create-on-push Writer(roles/artifactregistry.createOnPushWriter アーティファクトを読み書きします。 gcr.io リポジトリの作成
Artifact Registry の Create-on-push リポジトリ管理者(roles/artifactregistry.createOnPushRepoAdmin アーティファクトの読み取り、書き込み、削除。 gcr.io リポジトリの作成

各ロールの個別の権限の完全なリストについては、Artifact Registry のロールをご覧ください。gcloud iam roles describe コマンドを使用して、各ロールの権限のリストを表示することもできます。

IAM の基本ロール

IAM の基本ロールは、すべての Google Cloud リソースへのグローバルなプロジェクト レベルのアクセス権をユーザーに付与します。ユーザーとサービス アカウントに必要な権限のみが含まれるように、可能な限り事前定義ロールを使用してリポジトリにアクセスできるようにします。

次の表に、IAM のリリース前に存在していた基本ロールと、基本ロールに含まれる Artifact Registry の IAM ロールの一覧を示します。

役割 役割のタイトル 含まれるロール
roles/viewer 閲覧者 roles/artifactregistry.reader
roles/editor 編集者
  • roles/artifactregistry.writer
  • roles/artifactregistry.repoAdmin
roles/owner Owner roles/artifactregistry.admin

権限の付与

同じ権限がプロジェクト内のすべてのリポジトリに適用される場合は、プロジェクト レベルで権限を付与します。いくつかのアカウントに異なるレベルのアクセス権が必要な場合は、リポジトリ レベルでロールを付与します。

gcloud コマンドを使用してロールを付与する場合は、プリンシパルに対して 1 つのロール バインディングを指定するか、ポリシー ファイルを使用して複数のバインディングを定義します。

このページの例では、次の参照ポリシー テンプレートを使用しています。参照ポリシー ファイルの名前は policy.yaml です。テンプレートには、ユーザー名とサービス アカウント名の例が含まれています。以下のサンプルのユーザーとサービス アカウントをプロジェクトに合わせて置き換えてください。

ポリシーの形式の詳細については、IAM ポリシーのドキュメントをご覧ください。

bindings:

- members:
  - user: user@gmail.com
  role: roles/owner

- members:
  - serviceAccount: repo-readonly@iam.gserviceaccount.com
  - user: user2@gmail.com
  role: roles/artifactregistry.reader

- members:
  - serviceAccount: repo-write@iam.gserviceaccount.com
  role: roles/artifactregistry.writer

- members:
  - serviceAccount: repo-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.repoAdmin

- members:
  - serviceAccount: ar-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.admin

プロジェクト全体の権限の付与

同じ権限がプロジェクト内のすべてのリポジトリに適用される場合は、プロジェクト レベルでロールを付与します。

チームメンバーをプロジェクトに追加し、Artifact Registry のロールを付与するには:

コンソール

  1. Google Cloud コンソールで [IAM] ページを開きます。

    [IAM] ページを開く

  2. [プロジェクトを選択] をクリックし、Artifact Registry を実行しているプロジェクトを選択して [開く] をクリックします。

  3. [追加] をクリックします。

  4. メールアドレスを入力します。個人、サービス アカウント、Google グループをプリンシパルとして追加できます。

  5. プリンシパルのロールを選択します。最小権限のセキュリティ原則に従って、他のリソースへの不要なアクセスを防止するために最小限の権限を付与することを検討してください。

  6. [保存] をクリックします。

gcloud

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. 単一のプリンシパルにロールを付与するには、次のコマンドを実行します。

    gcloud projects add-iam-policy-binding PROJECT \
       --member=PRINCPAL \
       --role=ROLE
    

    ここで

    • PROJECT は、Artifact Registry が実行されているプロジェクトの ID です。
    • PRINCIPAL は、バインディングを追加するプリンシパルです。user|group|serviceAccount:email または domain:domain の形式を使用します。

      例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

    • ROLE は、付与するロールです。

    詳細については、add-iam-policy-binding のドキュメントをご覧ください。

    ポリシー ファイルを使用してロールを付与するには、次のコマンドを実行します。

    gcloud projects set-iam-policy PROJECT /PATH/TO/policy.yaml

    ここで

    • PROJECT は、Artifact Registry が実行されているプロジェクトの ID または完全修飾識別子です。
    • /PATH/TO/policy.yaml は、ポリシー ファイルのパスとファイル名です。

    現在構成されているポリシーを取得するには、次のコマンドを実行します。

    gcloud projects get-iam-policy PROJECT

    PROJECT はプロジェクトの ID またはプロジェクトの完全修飾識別子です。

    詳細については、set-iam-policy のドキュメントをご覧ください。

リポジトリに固有の権限の付与

プロジェクト内の各ユーザーに対し、ユーザーまたはサービス アカウントに異なるレベルのアクセス権を付与する場合は、リポジトリ レベルの権限を付与します。

コンソール

特定のリポジトリへのアクセス権を付与するには:

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

  2. 適切なリポジトリを選択します。

  3. 情報パネルが表示されない場合は、メニューバーの [情報パネルを表示] をクリックします。

  4. [権限] タブで、[プリンシパルを追加] をクリックします。

  5. メールアドレスを入力します。個人、サービス アカウント、Google グループをプリンシパルとして追加できます。

  6. プリンシパルのロールを選択します。プリンシパルに付与する権限は最小限の権限に留めることを推奨します。

  7. [保存] をクリックします。

gcloud

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. 個別のポリシー バインディングの IAM セットを設定する、またはポリシー ファイルを使用することができます。

    単一のプリンシパルにロールを付与するには、次のコマンドを実行します。

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
       --location LOCATION \
       --member=PRINCIPAL \
       --role=ROLE
    

    ここで

    • REPOSITORY はリポジトリの ID です。
    • PRINCIPAL は、バインディングを追加するプリンシパルです。user|group|serviceAccount:email または domain:domain の形式を使用します。

      例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

    • ROLE は、付与するロールです。

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。

    たとえば、ユーザー write@gmail.com のロール roles/artifactregistry.writer に、ロケーション --us-central1 のリポジトリ my-repo を持つ IAM ポリシー バインディングを追加するには、次のコマンドを実行します。

    gcloud artifacts repositories add-iam-policy-binding my-repo \
    --location=us-central1 --member=user:write@gmail.com --role=roles/artifactregistry.writer
    

    ポリシー ファイルを使用してロールを付与するには、次のコマンドを実行します。

    gcloud artifacts repositories set-iam-policy REPOSITORY /PATH/TO/policy.yaml --location=LOCATION

    ここで

    • REPOSITORY はリポジトリの ID です。
    • /PATH/TO/policy.yaml は、ポリシー ファイルのパスとファイル名です。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。

    たとえば、policy.yaml で定義されたポリシーを使用して、ロケーション --us-central1 のリポジトリ my-repo の IAM ポリシーを設定するには、次のコマンドを実行します。

    gcloud artifacts repositories set-iam-policy my-repo policy.yaml --location=us-central1
    

Terraform

google_artifact_registry_repository_iam リソースを使用して IAM ポリシーを構成します。次の例では、リソース名が repo-account のサービス アカウントを定義し、リソース名が my-repo のリポジトリへの読み取りアクセス権を付与します。

Google Cloud で Terraform を初めて使用する場合は、HashiCorp ウェブサイトの Google Cloud スタートガイド ページをご覧ください。

provider "google" {
    project = "PROJECT-ID"
}

resource "google_artifact_registry_repository" "my-repo"     {
  provider = google-beta

  location = "LOCATION"
  repository_id = "REPOSITORY"
  description = "DESCRIPTION"
  format = "FORMAT"
}

resource "google_service_account" "repo-account" {
  provider = google-beta

  account_id   = "ACCOUNT-ID"
  display_name = "Repository Service Account"
}

resource "google_artifact_registry_repository_iam_member" "repo-iam" {
  provider = google-beta

  location = google_artifact_registry_repository.my-repo.location
  repository = google_artifact_registry_repository.my-repo.name
  role   = "roles/artifactregistry.reader"
  member = "serviceAccount:${google_service_account.repo-account.email}"
}

ACCOUNT-ID はサービス アカウントの ID です。これは、サービス アカウントのメールアドレスの @ 記号の前の部分です。

その他の例については、google_artifact_registry_repository_iam リソースのドキュメントをご覧ください。

リポジトリへの公開アクセスの構成

認証なしでインターネット上のすべてのユーザーが利用できるようすることが必要なアーティファクトがある場合は、一般公開するリポジトリに保存します。

公開読み取り専用アクセス権用のリポジトリを構成するには、プリンシパル allUsers に Artifact Registry 読み取りロールを付与します。1 人のユーザーがプロジェクト全体の割り当てを使い切ることがないように、ユーザー リクエストの割り当ての上限を設定することをおすすめします。

コンソール

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

  2. 適切なリポジトリを選択します。

  3. 情報パネルが表示されない場合は、メニューバーの [情報パネルを表示] をクリックします。

  4. [権限] タブで、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに「allUsers」と入力します。

  6. [Artifact Registry 読み取り] ロールを選択します。

  7. 未認証のユーザーによる誤使用を防ぐために、Artifact Registry API リクエストにユーザーごとの制限を設定します。手順については、使用量の上限を設定するをご覧ください。

gcloud

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. 次のコマンドを実行します。

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
    --location=LOCATION --member=allUsers --role=ROLE
    

    ここで

    • REPOSITORY はリポジトリの ID です。

    • ROLE は、付与するロールです。

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。

    たとえば、ロケーション --us-central1 のリポジトリ my-repo を一般公開として構成するには、次のコマンドを実行します。

    gcloud artifacts repositories add-iam-policy-binding my-repo \
     --location=us-central1 --member=allUsers --role=roles/artifactregistry.reader
    
  3. 未認証のユーザーによる誤使用を防ぐために、Artifact Registry API リクエストにユーザーごとの制限を設定します。手順については、使用量の上限を設定するをご覧ください。

権限の取り消し

リポジトリへのアクセス権を取り消すには、承認済みプリンシパルのリストからプリンシパルを削除します。

リポジトリから公開アクセスを削除するには、allUsers プリンシパルを削除します。

コンソール

権限を取り消すには:

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

  2. 適切なリポジトリを選択します。

  3. 情報パネルが表示されない場合は、メニューバーの [情報パネルを表示] をクリックします。

  4. [権限] タブで、該当するプリンシパルを展開します。公開リポジトリを非公開にする場合は、allUsers プリンシパルを展開します。

  5. [プリンシパルを削除] をクリックしてアクセス権を取り消します。

gcloud

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. プロジェクト レベルでロールを取り消すには、次のコマンドを実行します。

    gcloud projects remove-iam-policy-binding PROJECT \
       --member=PRINCIPAL \
       --role=ROLE
    
    • PROJECT は、プロジェクト ID です。
    • PRINCIPAL は、バインディングを削除するプリンシパルです。user|group|serviceAccount:email または domain:domain の形式を使用します。

      例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

    • ROLE は、取り消すロールです。

    リポジトリのロールを取り消すには、次のコマンドを実行します。

    gcloud artifacts repositories remove-iam-policy-binding REPOSITORY
       --member=PRINCIPAL \
       --role=ROLE
    

    ここで

    • REPOSITORY はリポジトリの ID です。
    • PRINCIPAL は、バインディングを削除するプリンシパルです。user|group|serviceAccount:email または domain:domain の形式を使用します。

      例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com

      リポジトリへの公開アクセスを取り消すには、プリンシパル allUsers を指定します。

    • ROLE は、取り消すロールです。

    たとえば、--us-central1 ロケーションのリポジトリ my-repo を持つユーザー write@gmail.com のロール roles/artifactregistry.writer のポリシー バインディングを削除するには、次のコマンドを実行します。

    gcloud artifacts repositories remove-policy-binding my-repo \
       --location=us-central1 \
       --member=user:write@gmail.com \
       --role=roles/artifactregistry.writer

    ロケーション --us-central1 にある my-repo への公開アクセスを取り消すには、次のコマンドを実行します。

    gcloud artifacts repositories remove-policy-binding my-repo \
       --location=us-central1 \
       --member=allUsers \
       --role=roles/artifactregistry.reader
    

タグを使用した条件付きのアクセス権の付与

この機能はプレビュー版です。

プロジェクト管理者は、Google Cloud のリソースにタグを作成し、Resource Manager で管理できます。タグを Artifact Registry リポジトリに添付すると、管理者が IAM 条件でタグを使用してリポジトリへの条件付きアクセスを許可できます。

個々のアーティファクトにタグを添付することはできません。

詳細については、以下のドキュメントをご覧ください。

Google Cloud サービスとの統合

ほとんどの Google Cloud サービス アカウントでは、レジストリへのアクセスを構成するには、適切な IAM 権限を付与することのみ必要です。

Google Cloud サービスのデフォルトの権限

Cloud Build や Google Kubernetes Engine などの Google Cloud サービスでは、デフォルトまたは Google が管理するサービス アカウントを使用して、同じプロジェクト内のリソースを操作します。

次の場合は、権限をご自分で構成または変更する必要があります。

  • Google Cloud サービスが Artifact Registry とは異なるプロジェクトにある。
  • デフォルトの権限ではニーズが満たされない。たとえば、デフォルトの Compute Engine サービス アカウントには、同じプロジェクトのストレージに対する読み取り専用アクセス権が付与されます。VM から Artifact Registry にイメージを push する場合は、VM サービス アカウントの権限を変更するか、必要な権限を持つ別のアカウントを使用します。
  • Artifact Registry の操作には、デフォルトのサービス アカウントではなく、ユーザー指定のサービス アカウントを使用しています。

通常、次のサービス アカウントは Artifact Registry にアクセスします。サービス アカウントのメールアドレスには、サービスが実行されているプロジェクトの Google Cloud プロジェクト ID またはプロジェクト番号が含まれます。

サービス サービス アカウント メールアドレス 権限
App Engine フレキシブル環境 App Engine サービス アカウント PROJECT-ID@appspot.gserviceaccount.com 編集者ロール(リポジトリへの読み取りと書き込みが可能)
Compute Engine Compute Engine のデフォルトのサービス アカウント PROJECT-NUMBER-compute@developer.gserviceaccount.com 編集者ロール(リポジトリの読み取り専用アクセスに限定)
Cloud Build Cloud Build サービス アカウント PROJECT-NUMBER@cloudbuild.gserviceaccount.com デフォルトの権限には、リポジトリに対する読み取り / 書き込みアクセス権と、gcr.io リポジトリの作成機能が含まれます。
Cloud Run Cloud Run サービス エージェント
run.googleapis.com のサービス エージェント。
service-PROJECT-NUMBER@serverless-robot-prod.iam.gserviceaccount.com 読み取り権限(リポジトリへの読み取り専用アクセスに限定)
GKE Compute Engine のデフォルトのサービス アカウント
ノードのデフォルトのサービス アカウント。
PROJECT-NUMBER-compute@developer.gserviceaccount.com 編集者ロール(リポジトリの読み取り専用アクセスに限定)

Compute Engine インスタンスへのアクセス権の付与

リポジトリにアクセスする VM インスタンスには、Artifact Registry 権限とストレージ アクセス スコープの両方が構成されている必要があります。

サービス アカウントのアクセスレベルはサービス アカウントに付与された IAM ロールによって決定されますが、VM インスタンスのアクセス スコープによって、インスタンスの gcloud CLI とクライアント ライブラリを使用して行われるリクエストのデフォルトの OAuth スコープが決定されます。そのため、アクセス スコープでは、アプリケーションのデフォルト認証情報で認証する際に API メソッドへのアクセスをさらに制限できます。

Compute Engine では、次のデフォルトを使用します。

  • Compute Engine のデフォルトのサービス アカウントは、VM インスタンスの ID です。サービス アカウントのメールアドレスには、@developer.gserviceaccount.com というサフィックスが付加されています。
  • この動作を無効にしていない場合、デフォルトのサービス アカウントには IAM 基本編集者のロールがあります。
  • デフォルトのサービス アカウントで作成したインスタンスには、Compute Engine のデフォルトのアクセス スコープがあります。これには、ストレージに対する読み取り専用アクセスが含まれます。編集者のロールは一般に書き込みアクセスを許可しますが、read-only ストレージ アクセス スコープは、インスタンスのサービス アカウントに対し、アーティファクトのダウンロードについて、同じプロジェクトのリポジトリからのみとする制限を課します。

次の場合に、サービス アカウントのアクセス範囲を構成する必要があります。

  • VM サービス アカウントが、別のプロジェクト内のリポジトリにアクセスする必要がある。
  • VM サービス アカウントは、リポジトリからアーティファクトを読み取る以外のアクションを実行する必要がある。これは通常、イメージを push するか Artifact Registry の gcloud コマンドを実行する必要がある VM にサードパーティ ツールを適用することによって実現します。

権限を構成してアクセス スコープを設定するには:

  1. VM インスタンスを含むプロジェクトで、Compute Engine のデフォルト サービス アカウントの名前を取得します。サービス アカウントのメールアドレスには、@developer.gserviceaccount.com というサフィックスが付加されています。

  2. リポジトリが含まれるプロジェクトで、サービス アカウントでリポジトリにアクセスできるように権限を付与します。

  3. -scopes オプションを使用してアクセス スコープを設定します。

    1. VM インスタンスを停止します。インスタンスの停止をご覧ください。

    2. 次のコマンドでアクセス スコープを設定します。

      gcloud compute instances set-service-account INSTANCE --scopes=SCOPE
      

      SCOPE は、適切な値に置き換えます。

      • Docker では、次のオプションがサポートされます。

        • storage-ro - イメージの pull のみを許可する読み取り権限を付与します。
        • storage-rw - イメージを push または pull するための読み取りと書き込みの権限を付与します。
        • cloud-platform - メタデータを含む Google Cloud サービス全体のデータを表示して管理します。
      • 他の形式の場合、cloud-platform スコープを使用する必要があります。

    3. VM インスタンスを再起動します。停止されたインスタンスの起動をご覧ください。

Google Kubernetes Engine クラスタへのアクセス権の付与

GKE クラスタとノードプールは、次の要件がすべて満たされていれば、追加の構成なしでコンテナを pull できます。

GKE 環境がこれらの要件を満たしていない場合は、Compute Engine のデフォルト サービス アカウントを使用しているか、ユーザーから提供されたアカウントをノードの ID として使用しているかによって、アクセス権を付与する手順が異なります。

デフォルトのサービス アカウント

次の構成要件は、Compute Engine のデフォルト サービス アカウントに適用されます。

  1. GKE が Artifact Registry とは異なるプロジェクトにある場合、サービス アカウントに必要な権限を付与します。

  2. イメージを push するには、コンテナ以外の形式のリポジトリを操作するか、クラスタから gcloud コマンドを実行して、クラスタまたはノードプールを作成する際にサービス アカウントのアクセス スコープを設定する必要があります。

  3. サポートされているバージョンの GKE を使用していない場合は、imagePullSecret を構成します。

ユーザー指定のサービス アカウント

ユーザー指定のサービス アカウントをクラスタの ID として使用する場合は、次のことを行う必要があります。

  1. Artifact Registry が実行されている Google Cloud プロジェクトからサービス アカウントに必要な権限を付与します。

  2. デフォルトでは、ユーザー指定のサービス アカウントでクラスタまたはノードプールを作成すると、cloud-platform アクセス スコープが付与されます。

    gcloud container clusters create コマンドまたは gcloud container node-pools create コマンドで --scopes フラグを使用する場合は、以下を含める必要があります。Artifact Registry で使用する適切なアクセス スコープ

アクセス スコープの設定

アクセス スコープは、Compute Engine VM の承認を指定するレガシーな方法です。Artifact Registry リポジトリからイメージを pull するには、GKE ノードにストレージの読み取り専用アクセス スコープまたはストレージ読み取りアクセスを含む別のストレージ アクセス スコープが必要です。

アクセス スコープを設定できるのはクラスタまたはノードプールを作成するときのみです。既存のノードのアクセス スコープを変更することはできません。

クラスタの作成時にアクセス スコープを指定するには、次のコマンドを実行します。

gcloud container clusters create NAME --scopes=SCOPES

ノードプールの作成時にアクセス スコープを指定するには、次のコマンドを実行します。

gcloud container node-pools create NAME --scopes=SCOPES

次の値を置き換えます。

  • NAME は、クラスタまたはノードプールの名前です。
  • SCOPES は、付与するアクセス スコープのカンマ区切りのリストです。

    • Docker リポジトリにアクセスするには、次のいずれかのスコープを使用します。

    • storage-ro - イメージを pull するための読み取り専用権限を付与します。

    • storage-rw - イメージを push または pull するための読み取りと書き込みの権限を付与します。

    • cloud-platform - メタデータを含む Google Cloud サービス全体のデータを表示して管理します。

    • 他のリポジトリにアクセスするには、cloud-platform スコープを使用する必要があります。

    スコープの完全なリストについては、gcloud container clusters create または gcloud container node-pools create のドキュメントをご覧ください。

新しいクラスタの作成時に設定できるスコープの詳細については、gcloud container clusters create コマンドのドキュメントをご覧ください。

imagePullSecret の構成

imagePullSecret を構成するには、次の手順を実行します。

  1. GKE を使用するプロジェクトで、Compute Engine のデフォルトのサービス アカウントを探します。アカウントのメールアドレスには、@developer.gserviceaccount.com というサフィックスが付加されています。

  2. サービス アカウントのサービス アカウント キーをダウンロードします。

  3. リポジトリを含むプロジェクトで、リポジトリに権限を付与済みであることを確認します。

  4. クラスタを含むプロジェクトで、サービス アカウント キーを使用して artifact-registry という名前の imagePullSecret Secret を作成します。

    kubectl create secret docker-registry artifact-registry \
    --docker-server=https://LOCATION-docker.pkg.dev \
    --docker-email=SERVICE-ACCOUNT-EMAIL \
    --docker-username=_json_key \
    --docker-password="$(cat KEY-FILE)"
    

    ここで

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
    • SERVICE-ACCOUNT-EMAIL は Compute Engine サービス アカウントのメールアドレスです。
    • KEY-FILE はサービス アカウント キー ファイルの名前です。例: key.json
  5. デフォルトのサービス アカウントを開きます。

    kubectl edit serviceaccount default --namespace default

    Kubernetes クラスタ内のすべての名前空間には、default というデフォルトのサービス アカウントがあります。このデフォルト サービス アカウントは、コンテナ イメージを pull するために使用されます。

  6. 新しく作成した imagePullSecret シークレットをデフォルトのサービス アカウントに追加します。

    imagePullSecrets:
    - name: artifact-registry
    

    サービス アカウントは次のようになります。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      namespace: default
      ...
    secrets:
    - name: default-token-zd84v
    # The secret you created:
    imagePullSecrets:
    - name: artifact-registry
    

これで、現在の default 名前空間に作成された新しいポッドには、imagePullSecret シークレットが定義されます。

Artifact Registry サービス アカウント

Artifact Registry サービス エージェントは、Google Cloud サービスを操作するときに Artifact Registry の代理として動作する Google マネージド サービス アカウントです。アカウントとその権限の詳細については、Artifact Registry サービス アカウントをご覧ください。

次のステップ

権限の設定後に、アーティファクトの操作に関する詳細を確認する。