Container RegistryからArtifact Registryに移行する方法

# はじめに
本記事はContainer RegistryからArtifact Registryに移行する方法について記載しています。

リリースノートの[May 15, 2023](https://cloud.google.com/container-registry/docs/release-notes?hl=ja#May_15_2023)よりContainer Registryは非推奨になり、Artifact Registryに置き換わります。

Artifact Registryの移行に関する概要及び機能の比較については、[Container Registry からの移行](https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr?hl=ja)より確認できます。

## Artifact Registry
Artifact Registryは、Dockerイメージに限らず、ビルド アーティファクトを保存、管理、保護します。

次のアーティファクト形式のリポジトリを作成できます。

- コンテナ イメージ: Docker、Helm
- 言語パッケージ: Java、Node.js、Python
- OS パッケージ: Debian、RPM

https://cloud.google.com/artifact-registry?hl=ja

料金は[Artifact Registry の料金](https://cloud.google.com/artifact-registry/pricing?hl=ja)から確認できます。

::: note
脆弱性スキャンを使用してコンテナイメージに対するスキャンを行うことができます。
料金については有効にしている場合、課金されます。
:::

## 移行手順
標準リポジトリの移行手順は、公式ドキュメントの[標準リポジトリへの移行](https://cloud.google.com/artifact-registry/docs/transition/setup-repo?hl=ja)より確認できます。

所感として移行作業自体は問題なく、簡単に終えることができました。
イメージをコピーするツールが用意されているため、Container RegistryからArtifact Registryにイメージをコピーできます。既存のイメージをArtifact Registryにプッシュする作業は不要です。

また、公式ドキュメントでは権限設定の記載がありますが、既に権限を持っている場合は不要です。

### API有効化
Artifact Registry を使用するためには、Google CloudコンソールからArtifact Registry APIを有効にします。

![スクリーンショット 2023-06-28 13.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ed467061-2962-adb5-70c3-b646bb2805a8.png)

### リポジトリ作成
Artifact Registryを開き「リポジトリを作成」を押します。

![スクリーンショット 2023-06-28 13.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/24e54623-7fc8-ee3f-bb80-0e942ffa9fac.png)

「作成」を押します。

![スクリーンショット 2023-06-28 13.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/874e8a57-ef13-c147-5e04-50d43ca9d5d5.png)

### イメージのコピー
[Container Registry からのイメージをコピーする](https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=ja)を参考にしながら、移行ツールとして[gcrane](https://github.com/google/go-containerregistry/blob/main/cmd/gcrane/)を利用します。

gcraneのダウンロード後、以下のようなコマンドを実行します。
※`PROJECT_ID`のみ任意の値に変更

- asia.gcr.ioの例
```console
gcrane cp -r asia.gcr.io/PROJECT_ID asia-docker.pkg.dev/PROJECT_ID/asia.gcr.io
```

コマンドを実行後、イメージのコピーが完了するのを待ちます。

### 確認
イメージのコピーが完了すると、以下のような4つのリポジトリについて作成されたことが確認できます。

![スクリーンショット 2023-06-28 13.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/37879b7d-2b2b-7cf5-b64f-d9ef01de87e9.png)

エクスクラメーションマークのアイコンを押すと、以下のようなメッセージが確認できます。

![スクリーンショット 2023-06-28 14.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/39daa861-31c8-0423-258e-c6fbd6f12b8d.png)

既知のイメージについて、全てコピーできたことが確認できます。

![スクリーンショット 2023-06-28 14.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b0ac0b8d-f125-012c-c13c-afb72f38e2af.png)

::: note
Container Registryを使用していた場合は、Cloud Storageにイメージが保存されます。
従ってArtifact Registryに移行完了後、無駄な課金を発生させないたためには、Cloud Storageに残っているイメージは削除しましょう。
（※削除する場合は、Container Registryのイメージが参照されていないことを確認すること）

公式のツールではありませんが、[gcr-cleaner](https://github.com/GoogleCloudPlatform/gcr-cleaner)というツールが存在します。
:::

### ルーティング
Container RegistryからArtifact Registryにアクセスを切り替えるために、ルーティングを有効にします。

#### 権限確認
以下のような画面が表示される場合は、権限が不足しています。

![スクリーンショット 2023-06-28 14.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/22b2de50-fef9-6253-057a-055b2dfb424b.png)

「Artifact Registryにルーティング」を押すと以下のようなメッセージが表示されるため、不足している権限が確認できます。

![スクリーンショット 2023-06-28 14.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ce334c91-adc3-12f7-fb82-98bdad77c6ec.png)

#### 権限追加
コンソールから権限を追加する場合は、IAMを開いて対象のプリシンパルにアクセス権を付与します。

![スクリーンショット 2023-06-28 15.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/015627fa-ef86-0199-1bbc-edaa5b9334e7.png)

再度、Artifact Registryの設定画面にアクセスすると、「Artifact Registryのルーティング」のボタンが確認できます。
「Artifact Registryにルーティング」を押します。

![スクリーンショット 2023-06-28 16.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ab649d2a-1003-14b8-3812-78528a59136b.png)

Artifact Registryに対するルーティングが有効になりました。

![スクリーンショット 2023-06-28 16.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7b87d439-0245-d5bd-84c1-de96e3d8bb8a.png)

::: note
コンソールからContainer Registryにアクセスすると、Artifact Registryにリダイレクトされます。
:::

### 検証
Artifact Registryが使用できる状態になったため、イメージのプッシュができることも確認します。

#### イメージのプッシュ
テストとしてイメージのプッシュを行うために、nginxのイメージを取得します。

`$ docker pull nginx`

タグ付けを行います。

`$ docker tag nginx asia.gcr.io/<Project ID>/test-image`

イメージをプッシュします。

`$ docker push asia.gcr.io/pj-ccoe-prd/test-image`

イメージがプッシュされて、アップロードされたことを確認します。

![スクリーンショット 2023-06-28 16.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5d4699a4-8e5a-20f4-696c-a4ae7f32662d.png)

#### 動作確認
Cloud Runの場合は、影響を受けるジョブの「コンテナ イメージの URL」を編集して、Artifact RegistryのURLに更新するだけです。

設定変更後、問題なくジョブを実行できることを確認します。

# おわりに
Dockerイメージ以外も扱うことができるようなので、CI/CDツールと統合するなどパイプラインの構築に使えると思います。