Docker リポジトリへの変更に関する通知は、Pub/Sub から受信できます。通知は、OCI 形式でパッケージ化された Helm 3 グラフを含む、リポジトリに保存されているすべてのコンテナ イメージに適用されます。
Pub/Sub は、リポジトリに関するメッセージをトピックという名前付きリソースに公開します。Pub/Sub トピックをサブスクライブするアプリケーションは、これらのメッセージを受信し、リポジトリの状態が変更されたときに通知を受け取ります。
Artifact Registry では、次の変更に対するメッセージが公開されます。
- イメージのアップロード
- 新しいタグがイメージに追加された
- イメージの削除
また、通知を公開またはサブスクライブするためのロールと権限を構成することもできます。
新しい脆弱性スキャンの結果など、アクティビティの Artifact Analysis 通知の構成については、Artifact Analysis のドキュメントをご覧ください。
概要
Artifact Registry は、gcr
というトピックにリポジトリの変更に関するメッセージを公開します。
通知を受け取るには次を行う必要があります。
- Artifact Registry を使用して、プロジェクトで
gcr
という名前のトピックを作成します。 - トピックのサブスクリプションを作成します。
- リポジトリの変更に関するメッセージを受信するようにサブスクライバー アプリケーションを設定します
- 必要に応じて、権限を構成してトピックとサブスクリプションへのアクセスを制御します。
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
Google Cloud コンソールで Pub/Sub トピックページに移動します。
[トピックを作成] をクリックします。
トピック ID
gcr
を入力します。[トピックを作成] をクリックします。
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
Google Cloud コンソールで Pub/Sub トピックページに移動します。
プロジェクトのトピックをクリックします。
[サブスクリプションを作成] をクリックします。
サブスクリプション名を入力します。
projects/PROJECT/subscriptions/[SUBSCRIPTION-NAME]
[配信タイプ] は [Pull] に設定されたままにします。
[作成] をクリックします。
gcloud
次のコマンドを実行します。
gcloud pubsub subscriptions create SUBSCRIPTION-NAME --topic=gcr
SUBSCRIPTION-NAME はサブスクリプションの名前に置き換えます。
gcloud pubsub subscriptions
コマンドについて詳しくは、subscriptions
ドキュメントをご覧ください。
gcr
トピックへのサブスクリプションが作成されました。次のステップでは、リポジトリ内の変更をトリガーする ID の権限を構成します。
サブスクライバー アプリケーションの構成
トピックとそのトピックへのサブスクリプションを作成したら、サブスクライバー アプリケーション、リポジトリの変更に関するメッセージを受信アプリケーションを設定できます。サブスクライバー アプリケーションは、イベント通知、システム ロギング、アプリケーション間の通信などのタスクを遂行します。
リポジトリ ユーザーがイメージを push または削除するときに、次の手順を行います。
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
権限が必要です。Pub/Sub は、トピックからサブスクリプションにメッセージを転送します。
サブスクライバー アプリケーションがメッセージをリクエストすると、サブスクリプションから新しいメッセージが 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
が含まれている場合があります。
次のステップ
- Pub/Sub のドキュメントを読む。
- Pub/Sub の詳細について Pub/Sub とはを確認する。
- Pub/Sub アクセス制御の役割の詳細を確認する。