📦

Container Registry 廃止に備えて公式の移行ツールを紹介します

2024/03/25に公開

こんにちは。クラウドエース SRE 部の阿部です。
このブログ記事では、 Container Registry を Artifact Registry に自動移行するツールを紹介したいと思います。

はじめに

以前、下記の記事で Container Registry の廃止について説明しました。これは 2023 年 5 月の記事で、かなり前に執筆した記事です。

https://zenn.dev/cloud_ace/articles/6c401ce3b3bccc

その後、2024 年 3 月 18 日のリリースノートで正式に Container Registry の停止が告知されました。
2025 年 4 月 22 日以降、既存イメージの読み取りができなくなるため、それまでには前述の記事で紹介した方法等で Artifact Registry に移行する必要があります。

ただ、当時記事を書いていたときも思いましたが、移行は gcrane のような外部ツールを使う必要もあり、4 つのリポジトリに対して操作するため手順が煩雑でした。
そういった事情もあってか、2024 年 3 月 12 日に Google Cloud から公式に自動移行ツールが提供されましたので、今回はこのツールについて紹介します。

ツール紹介

下記の図は Container Registry 移行作業と自動化される部分を示しています。

chart
自動移行ツールの作業内容

自動移行ツールは gcloud CLI のサブコマンド、 gcloud artifacts docker upgrade migrate として提供されています。
このサブコマンドは gcloud CLI 468.0.0 以降で提供されています。

以下のように実行します。

gcloud artifacts docker upgrade migrate --projects PROJECT_ID

PROJECT_ID は移行したい CR があるプロジェクト ID。PROJECT_ID の部分はカンマ区切りで複数のプロジェクトを指定可能です。
※注意: --project オプションではなく --projects オプションです。(複数系の s がつく)

ツール実行前の作業

ツール実行には以下のロール付与が必要です。

プロジェクトに対するツール実行者のストレージ管理者ロールを付与

gcloud projects add-iam-policy-binding {PROJECT_ID} --member="user:{EMAIL}" --role='roles/storage.admin'

{EMAIL} は自動移行ツールを実行する Google アカウントのメールアドレス

Artifact Registry サービスエージェントにストレージオブジェクト参照者ロールを付与

gcloud projects add-iam-policy-binding {PROJECT_ID} --member='serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-artifactregistry.iam.gserviceaccount.com' --role='roles/storage.objectViewer'

{PROJECT_NUMBER} は移行先の Artifact Registry のプロジェクト番号。 gcloud projects describe {PROJECT_ID} --format="value(projectNumber)" を実行することで確認できます。

これらを事前に実施しておかないと、自動移行ツールによるイメージコピー時にエラーが発生する場合がありますのでご注意ください。

ツール実行

下記を実行します。

gcloud artifacts docker upgrade migrate --projects PROJECT_ID

事前に Artifact Registry を作成していない場合、以下のようなプロンプトが表示されます。

Container Registry Host  Location  Artifact Registry Repository
gcr.io                   us        None Found. Can create repo named "gcr.io"
us.gcr.io                us        None Found. Can create repo named "us.gcr.io"
asia.gcr.io              asia      None Found. Can create repo named "asia.gcr.io"
eu.gcr.io                europe    None Found. Can create repo named "eu.gcr.io"


gcloud can automatically create the 4 missing repos in Artifact Registry.
If you would like to setup CMEK for these repos, exit now and create them manually instead.

Create missing repos (recommended) (Y/n)?

ここは Y を入力して Enter を押します。下記のようなメッセージが出力され、 Container Registry 移行用 Artifact Registry が作成されます。なお、リポジトリに CMEK を設定したい場合は、自動移行ツールでは対応できないため、あらかじめ作成しておく必要があります。

Waiting for repo creation to complete......done.
Waiting for repo creation to complete......done.
Waiting for repo creation to complete......done.
Waiting for repo creation to complete......done.

上記メッセージの裏で、 gcr.ious.gcr.ioasia.gcr.ioeu.gcr.ioの 4 つの AR リポジトリが作成されます。
次に、リポジトリ毎に以下のようなプロンプトが表示され、AR リポジトリ毎に IAM ロールを付与するか確認されます。

Potential IAM change for gcr.io repository in project {PROJECT_ID}:

bindings:
- members:
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-clouddeploy.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-datamigration.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-gkenode.iam.gserviceaccount.com
  role: roles/artifactregistry.reader
- members:
  - serviceAccount:firebase-adminsdk-xxxxx@{PROJECT_ID}.iam.gserviceaccount.com
  - serviceAccount:example-custom-sa@{PROJECT_ID}.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@cloud-ml.google.com.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@cloudcomposer-accounts.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@dataflow-service-producer-prod.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@dataproc-accounts.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@dlp-api.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@firebase-rules.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gae-api-prod.google.com.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-automl.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-cloudasset.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-config.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-datafusion.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-discoveryengine.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-firebasestorage.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-firestore.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@trifacta-gcloud-prod.iam.gserviceaccount.com
  role: roles/artifactregistry.repoAdmin
- members:
  - serviceAccount:service-{PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com
  - serviceAccount:service-{PROJECT_NUMBER}@gcp-sa-dialogflow.iam.gserviceaccount.com
  role: roles/artifactregistry.writer

This IAM policy will grant users the ability to perform all actions in Artifact Registry that they can currently perform
 in Container Registry. This policy may allow access that was previously prevented by deny policies or IAM conditions.

Warning: Generated bindings may be insufficient because you do not have access to analyze IAM for the
following resources: ['organizations/xxxx', 'folders/xxxx', 'folders/xxxx']
See https://cloud.google.com/policy-intelligence/docs/analyze-iam-policies#required-permissions

 [1] Apply above policy to the {PROJECT_ID}/gcr.io Artifact Registry repository
 [2] Edit policy
 [3] Do not change permissions for this repo (users may lose access to gcr.io/{PPROJECT_ID})
 [4] Skip permission updates for all remaining repos (users may lose access to all remaining repos)
 [5] Exit
Please enter your numeric choice (2):

※プロジェクト ID やプロジェクト番号等はマスクしています。

どうやら、既存のサービスエージェント系のサービスアカウントや、カスタムサービスアカウントを自動収集して、リポジトリ毎に合うアクセス権限を付与しているようです。場合にもよりますが、自分は過剰な付与かなと思いました。現時点で明確に必要なロールがあれば別ですが、そうでなければ 4 を入力して Enter を押すことでリポジトリ毎のロール付与はスキップできます。

もし、この時点でロール付与したい場合は、 2 を選択することでエディタが起動して付与ポリシーを修正することが可能です。
その後、 1 を選択して適用できます。また、 13 を入力した場合は、*.gcr.io リポジトリ毎に IAM ロール付与の確認プロンプトが表示されます。 4 はまとめて設定をスキップします。

4 を選択、もしくは全てのリポジトリで IAM 付与の設定を完了すると、イメージコピーが実行され、最後に gcr.io ドメインのリダイレクト設定を有効化するかを確認するプロンプトが表示されます。

Copying initial images (additional images will be copied later)...

Copying images for {PROJECT_ID}... done.

{PROJECT_ID}: Successfully copied 0 additional tags and 0 additional manifests. There were 0 failures.

The next step will redirect all *gcr.io traffic to Artifact Registry. Remaining Container Registry images will be copied. During migration, Artifact Registry will serve *gcr.io requests for images it doesn't have yet by copying them from Container Registry at request time. Deleting images from *gcr.io repos in the middle of migration might not be effective.

IMPORTANT: Make sure to update any relevant VPC-SC policies before migrating. Once *gcr.io is redirected to Artifact Registry, the artifactregistry.googleapis.com service will be checked for VPC-SC instead of containerregistry.googleapis.com.

Projects to redirect: ['{PROJECT_ID}']

Do you want to continue (Y/n)?

Y を選択するとリダイレクト設定含め移行完了です。 n を選択した場合、リダイレクトのみ未設定状態でツールが終了します。
実際にコピーされたかを確認してから移行したい場合は n を、そうでない場合は Y でよいと思います。

移行を検証した際に確認したエラー

App Engine のデプロイで利用する一時ファイル(app-engine-tmp)が Container Registry に残存している場合、イメージコピー後に以下のようなエラーが出力されるようです。

{PROJECT_ID}: Successfully copied 40 additional tags and 79 additional manifests. There were 5 failures.

Example images that failed to copy:
app-engine-tmp/app/ttl-2h@sha256:d0ef4e253ef6b8d4a85027d93636231df3fa4f36842046a9030d3eff262501c9
app-engine-tmp/app/ttl-2h@sha256:e3ea0d28077b6cad75f9b6d1bcbf14e76ae8e6df552e0a337319c3cc52b26042
app-engine-tmp/app/ttl-2h@sha256:0d2473e06993ef09c020b891cf3a5dca740e4861e352abffdf9e5f0c07b81b14
app-engine-tmp/app/ttl-2h@sha256:ebc0998d4605588f2da7e1e8c0138ddc75dc70804c6fcaa4e4141f5c41464dee
app-engine-tmp/app/ttl-2h@sha256:c9001507794e44d25db1e5bcf307e0aefe0c7c8e2b3304635419c3d0bda32e29

All projects had image copy failures. Continuing will disable further copying and images will be missing.

Continue anyway? (y/N)?

おそらく、上記一時ファイルが標準的なコンテナ形式ではないことで発生しているのではないかと推測していますが、確たる情報はありませんでした。
ただ、上記を無視して続行しても App Engine の動作に影響はなかったため、おそらく大丈夫だと考えています。(確証はありません)

その他

自動移行ツールは、 gcr.io の移行だけでなく、標準の AR リポジトリに移行する手順も用意しています。詳しくは下記のドキュメントを参照してください。

https://cloud.google.com/artifact-registry/docs/transition/auto-migrate-gcr-ar?hl=ja#migrate-standard-ar

まとめ

以前紹介した移行手順よりも非常に簡単に Container Registry を移行できることがわかりました。
明確に廃止予定が決まったため、現時点でまだ Container Registry を利用している方は、上記のツールによる移行を計画してはいかがでしょうか。
この記事が誰かのお役に立てましたら幸いです。

Discussion