Container Registry が非推奨になったので Artifact Registry へ移行する

## はじめに

Container Registry が非推奨となり、Artifact Registry への移行が必要になりました。
移行のタイムライン、移行手順について記載します。

## 移行が必要

Google Cloud は、コンテナイメージの管理サービスを Container Registry から Artifact Registry へと移行することを決定しました。次のタイムラインで移行されるので、 Container Registry を使用しているプロジェクトは移行が必要です。

## 重要なタイムライン

- **2024年5月15日以降**: Container Registry の使用歴がないプロジェクトでは、gcr.io ドメインのイメージが Artifact Registry でホストされるようになります。
- **2025年3月18日**: Container Registry の提供が終了します。
- **2025年4月22日以降**: Container Registry からの既存イメージの読み取りができなくなります。

## Artifact Registry の利点

1. コンテナイメージとコンテナ以外のアーティファクトの両方をサポート
2. Cloud IAM を通じたリポジトリレベルのアクセス制御
3. リージョンリポジトリのサポートによる可用性とスピードの向上
4. セキュリティ、スケーラビリティ、コントロールの大幅な改善

## 移行オプション

1. **gcr.io リポジトリ**: Container Registry の gcr.io ホスト名にマッピングされたリポジトリ
2. **pkg.dev リポジトリ**: Artifact Registry の全機能をサポートする独立したリポジトリ

## 自動移行ツールの利用

Google Cloud は自動移行ツールを提供しており、以下の利点があります：

- ダウンタイムやサービス停止なしで移行可能
- Artifact Registry に gcr.io リポジトリを自動作成
- IAM ポリシーの提案と適用
- トラフィックのリダイレクト設定
- コンテナイメージの自動コピー

# Container Registry から Artifact Registry への移行手順

Google Cloud は Container Registry の提供を終了し、Artifact Registry への移行を推奨しています。以下では、自動移行ツールを使用して、Container Registry から Artifact Registry に移行する手順をステップバイステップで解説します。

---

## **前提条件**

1. **Google Cloud CLI のインストールと更新**
   - 以下のコマンドで Google Cloud CLI をインストールまたは最新バージョンに更新します。
     ```bash
     gcloud components update
     ```

2. **Artifact Registry API の有効化**
   - Artifact Registry API を有効にします。
     ```bash
     gcloud services enable artifactregistry.googleapis.com
     ```

3. **必要な IAM ロールの確認**
   - サービスアカウントに以下のロールが付与されていることを確認してください：
     - `roles/storage.objectViewer`（Container Registry のイメージ閲覧権限）
   - ユーザーには以下のロールが必要です：
     - `roles/artifactregistry.containerRegistryMigrationAdmin`（Artifact Registry 移行管理者）

---

## **移行手順**

### **1. 自動移行コマンドの実行**

以下のコマンドを実行して、Container Registry から Artifact Registry に移行します：

```bash
gcloud artifacts docker upgrade migrate \
    --projects=PROJECT_ID
```

- `PROJECT_ID` は移行対象の Google Cloud プロジェクト ID を指定します。
- 複数プロジェクトを同時に移行する場合は、カンマ区切りで複数のプロジェクト ID を指定できます。

このコマンドにより、以下の操作が自動的に実行されます：
- 各リージョンに対応する gcr.io リポジトリを Artifact Registry に作成。
- IAM ポリシーの提案と適用（またはスキップ）。
- Container Registry の gcr.io エンドポイントから Artifact Registry へのトラフィックリダイレクト。
- Container Registry に保存されているすべてのコンテナイメージを Artifact Registry にコピー。

---

### **2. 特定条件でのイメージコピー**

特定条件でのみイメージをコピーしたい場合、以下のオプションを使用できます：

#### **過去一定期間内に pull されたイメージのみコピー**
```bash
gcloud artifacts docker upgrade migrate \
    --projects=PROJECT_ID \
    --recent-images=DAYS
```
- `DAYS` は過去の日数（30～180日）を指定します。

#### **各イメージの最新バージョンのみコピー**
```bash
gcloud artifacts docker upgrade migrate \
    --projects=PROJECT_ID \
    --last-uploaded-versions=VERSIONS
```
- `VERSIONS` はコピーする最新バージョン数を指定します。

**注意**: `--recent-images` と `--last-uploaded-versions` は併用できません。

---

### **3. イメージのみコピー**

他の移行手順をスキップし、コンテナイメージだけを Artifact Registry にコピーしたい場合は、以下のコマンドを使用します：

```bash
gcloud artifacts docker upgrade migrate \
    --projects=PROJECT_ID \
    --copy-only
```

---

## **移行後の確認**

1. **リポジトリとイメージの確認**
   - 移行後、Artifact Registry 上でリポジトリとイメージが正しく作成されているか確認します。
     ```bash
     gcloud artifacts repositories list
     gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME
     ```

2. **CI/CD パイプラインの更新**
   - Container Registry を参照している設定やスクリプト（例: CI/CD パイプライン）を Artifact Registry に変更します。

3. **Docker 認証情報の更新**
   - Docker クライアントで Artifact Registry を使用する場合、認証情報を設定します。
     ```bash
     gcloud auth configure-docker LOCATION-docker.pkg.dev
     ```

## **まとめ**

Container Registry から Artifact Registry への移行は、自動移行ツールを使用することで簡単かつ安全に実施できます。期限が迫っているため、早めに対応しましょう。