Pub/Sub 通知の構成

Docker リポジトリへの変更に関する通知は、Pub/Sub から受信できます。通知は、OCI 形式でパッケージ化された Helm 3 グラフを含む、リポジトリに保存されているすべてのコンテナ イメージに適用されます。

Pub/Sub は、リポジトリに関するメッセージをトピックという名前付きリソースに公開します。Pub/Sub トピックをサブスクライブするアプリケーションは、これらのメッセージを受信し、リポジトリの状態が変更されたときに通知を受け取ります。

Artifact Registry では、次の変更に対するメッセージが公開されます。

  • イメージのアップロード
  • 新しいタグがイメージに追加された
  • イメージの削除

また、通知を公開またはサブスクライブするためのロールと権限を構成することもできます。

新しい脆弱性スキャンの結果など、アクティビティの Artifact Analysis 通知の構成については、Artifact Analysis のドキュメントをご覧ください。

概要

Artifact Registry は、gcr というトピックにリポジトリの変更に関するメッセージを公開します。

通知を受け取るには次を行う必要があります。

  1. Artifact Registry を使用して、プロジェクトで gcr という名前のトピックを作成します。
  2. トピックのサブスクリプションを作成します。
  3. リポジトリの変更に関するメッセージを受信するようにサブスクライバー アプリケーションを設定します
  4. 必要に応じて、権限を構成してトピックとサブスクリプションへのアクセスを制御します。

Artifact Registry トピックの作成

Google Cloud プロジェクトで Artifact Registry API を有効にすると、Artifact Registry は、トピック ID が gcr である Pub/Sub トピックを自動的に作成します。同じ Google Cloud プロジェクトで Container Registry が有効になっている場合、両方のレジストリ サービスが同じトピックを使用してメッセージをパブリッシュするため、このトピックがすでに存在している可能性があります。

gcr トピックが誤って削除された場合、または存在しない場合は、ユーザーが追加できます。たとえば、Google Cloud 組織に、顧客管理の暗号鍵(CMEK)による暗号化が必要な組織のポリシーの制約がある場合、トピックが存在しない可能性があります。Pub/Sub API がこの制約の拒否リストに含まれている場合、サービスは、Google が管理する暗号鍵を使用してトピックを自動的に作成することはできません。

既存のトピックのリストを表示するには、Google Cloud コンソールの [Pub/Sub トピック] ページを確認するか、次のコマンドを実行します。

gcloud pubsub topics list

Google が所有し、管理する鍵を使用して gcr トピックを作成するには:

Console

  1. Google Cloud コンソールで Pub/Sub トピックページに移動します。

    Pub/Sub トピックページに移動

  2. [トピックを作成] をクリックします。

  3. トピック ID gcr を入力します。

  4. [トピックを作成] をクリックします。

gcloud

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

gcloud pubsub topics create gcr --project=PROJECT-ID

PROJECT-ID は、実際の Google Cloud プロジェクト ID に置き換えます。--project フラグを省略した場合、このコマンドでは、現在のプロジェクトが使用されます。

gcloud pubsub topics コマンドについて詳しくは、topics ドキュメントをご覧ください。

CMEK 暗号化を使用して gcr トピックを作成するには、Pub/Sub のトピックを暗号化する手順をご覧ください。

gcr トピックを作成した、またはこのトピックが存在することを確認したら、トピックに対するサブスクリプションを作成できます。

サブスクリプションの作成

リポジトリの変更に対してトピックを作成した後、push 配信または pull 配信のいずれかを使用するサブスクリプションを構成できます。CI/CD システムでは保存されたアーティファクトに多数の変更が発生する可能性があり、pull 配信は大量のメッセージに対してより効果的であるため、pull 配信をおすすめします。

pull 配信でサブスクリプションを作成するには、次のようにします。

Console

  1. Google Cloud コンソールで Pub/Sub トピックページに移動します。

    Pub/Sub トピックページに移動

  2. プロジェクトのトピックをクリックします。

  3. [サブスクリプションを作成] をクリックします。

  4. サブスクリプション名を入力します。

    projects/PROJECT/subscriptions/[SUBSCRIPTION-NAME]
    

    [配信タイプ] は [Pull] に設定されたままにします。

  5. [作成] をクリックします。

gcloud

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

gcloud pubsub subscriptions create SUBSCRIPTION-NAME --topic=gcr

SUBSCRIPTION-NAME はサブスクリプションの名前に置き換えます。

gcloud pubsub subscriptions コマンドについて詳しくは、subscriptions ドキュメントをご覧ください。

gcr トピックへのサブスクリプションが作成されました。次のステップでは、リポジトリ内の変更をトリガーする ID の権限を構成します。

サブスクライバー アプリケーションの構成

トピックとそのトピックへのサブスクリプションを作成したら、サブスクライバー アプリケーション、リポジトリの変更に関するメッセージを受信アプリケーションを設定できます。サブスクライバー アプリケーションは、イベント通知、システム ロギング、アプリケーション間の通信などのタスクを遂行します。

リポジトリ ユーザーがイメージを push または削除するときに、次の手順を行います。

  1. Artifact Registry サービス アカウントは、gcr トピックに変更を公開します。サービス アカウントは service-PROJECT-NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com です。ここで、PROJECT-NUMBER は Google Cloud のプロジェクト番号です。Artifact Registry サービス アカウントには、トピックへの変更を公開するための pubsub.topics.publish 権限がデフォルトで付与されています。

    管理者が Artifact Registry サービス アカウントに対する pubsub.topics.publish 権限を取り消すと、Artifact Registry はリポジトリ ユーザーとしてメッセージを公開しようとします。この場合、メッセージを正常に公開するには、リポジトリ ユーザーのアカウントに pubsub.topics.publish 権限が必要です。

  2. Pub/Sub は、トピックからサブスクリプションにメッセージを転送します。

  3. サブスクライバー アプリケーションがメッセージをリクエストすると、サブスクリプションから新しいメッセージが pull されます。

    サブスクライバーに代わってメッセージを pull する ID には、サブスクリプションにアクセスするための権限が付与されている必要があります。Pub/Sub サブスクライバーのロールを使用して、この権限を付与できます。

pull 配信でサブスクリプションからメッセージを受信するようにサブスクライバーを設定することについて詳しくは、pull を使用してメッセージを受信するをご覧ください。

権限の構成

Pub/Sub 権限を使用して、トピックとサブスクリプションへのアクセスを制御できます。

Pub/Sub 権限、トピックとサブスクリプションへのアクセス権の付与について詳しくは、Pub/Sub のアクセス制御ドキュメントをご覧ください。

通知の例

Pub/Sub は、通知を JSON 形式の文字列として送信します。以下の例を確認して、Pub/Sub から Artifact Registry 通知を受信するときに期待される内容を学習してください。

イメージが Container Registry に push された際の通知ペイロードの例を次に示します。

{
  "action":"INSERT",
  "digest":"us-east1-docker.pkg.dev/my-project/my-repo/hello-world@sha256:6ec128e26cd5..."
}

新しいイメージタグが Artifact Registry に push された際の通知ペイロードの例を次に示します。

{
  "action":"INSERT",
  "digest":"us-east1-docker.pkg.dev/my-project/my-repo/hello-world@sha256:6ec128e26cd5...",
  "tag":"us-east1-docker.pkg.dev/my-project/my-repo/hello-world:1.1"
}

メッセージは、digest または tag キーを使用して関連イメージを識別します。

Artifact Registry からイメージタグが削除された際の通知ペイロードの例を次に示します。

{
  "action":"DELETE",
  "tag":"us-east1-docker.pkg.dev/my-project/my-repo/hello-world:1.1"
}

メッセージには、action キーの値として DELETE または INSERT が含まれている場合があります。

次のステップ