「Container RegistryからArtifact Registryへの移行が必要だけど、何が変わるのかわからない」——Google Cloud案件で多くのエンジニアが直面するこの疑問に、この記事で完全に答えます。
Google Cloud Artifact Registryは、Docker・npm・Maven・Python・Go など複数のパッケージ形式を統一管理できるフルマネージドリポジトリサービスで、Container Registryの後継として全てのGCP案件で標準となっています。この記事では、Google Cloudシリーズ第22弾として、Artifact Registryの実践的な使い方を解説します。
この記事を3秒でまとめると
- Artifact RegistryでDocker・npm・Maven・Pythonパッケージを一元管理し、開発チームの依存関係を統合
- Container Registryからの移行手順と、IAM・VPC Service Controls による本番環境向けセキュリティ設定
- Cloud Build・GitHub Actionsとの連携で、CI/CDパイプラインにシームレスに組み込む
Artifact Registryとは
Container Registryとの違い
Artifact Registryは、Container Registry(gcr.io)の後継サービスです。
| 比較項目 | Artifact Registry | Container Registry(非推奨) |
|---|---|---|
| サポート形式 | Docker, npm, Maven, Python, Go, Apt, Yum | Docker のみ |
| リポジトリ単位の管理 | ✅ プロジェクト内に複数リポジトリ | ❌ リージョン単位の1つ |
| IAM | ✅ リポジトリ単位で設定可能 | ❌ バケット単位 |
| VPC Service Controls | ✅ 完全対応 | 🔺 部分対応 |
| 脆弱性スキャン | ✅ オンデマンド + 自動スキャン | ✅ あり |
| ストリーミング | ✅ イメージストリーミング | ❌ なし |
| 料金体系 | ストレージ + ネットワーク | Cloud Storage料金 |
重要: Container Registryは2025年5月15日以降、新規プロジェクトで利用不可となり、既存プロジェクトも移行が推奨されています。
対応パッケージ形式
Artifact Registryがサポートするパッケージ形式は以下の通りです。
- Docker: コンテナイメージ
- npm: Node.jsパッケージ
- Maven: Java パッケージ
- Python (PyPI): Pythonパッケージ
- Go: Goモジュール
- Apt: Debianパッケージ
- Yum: RPMパッケージ
- KubeFlow Pipelines: MLパイプライン
基本セットアップ
リポジトリの作成
gcloud CLI:
# Docker リポジトリを作成
gcloud artifacts repositories create myapp-docker \
--repository-format=docker \
--location=asia-northeast1 \
--description="本番用Dockerイメージリポジトリ" \
--labels=env=production,team=backend
# npm リポジトリを作成
gcloud artifacts repositories create myapp-npm \
--repository-format=npm \
--location=asia-northeast1 \
--description="社内npmパッケージ"
# Python リポジトリを作成
gcloud artifacts repositories create myapp-python \
--repository-format=python \
--location=asia-northeast1 \
--description="社内Pythonパッケージ"
Terraform:
resource "google_artifact_registry_repository" "docker" {
location = "asia-northeast1"
repository_id = "myapp-docker"
format = "DOCKER"
description = "本番用Dockerイメージリポジトリ"
labels = {
env = "production"
team = "backend"
}
cleanup_policies {
id = "delete-old-images"
action = "DELETE"
condition {
older_than = "2592000s" # 30日
tag_state = "UNTAGGED"
}
}
cleanup_policies {
id = "keep-latest"
action = "KEEP"
most_recent_versions {
keep_count = 10
}
}
}
Docker認証の設定
# gcloud を使った認証ヘルパー設定(推奨)
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
# Docker設定ファイルが更新される
# ~/.docker/config.json に以下が追加される:
# "asia-northeast1-docker.pkg.dev": "gcloud"
イメージのプッシュとプル
# ビルド&タグ付け
docker build -t asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:v1.2.3 .
# プッシュ
docker push asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:v1.2.3
# プル
docker pull asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:v1.2.3

マルチフォーマット対応
npm パッケージの管理
社内共通ライブラリをArtifact RegistryのnpmリポジトリにPublishできます。
# npmの認証設定
npx google-artifactregistry-auth
# .npmrcの設定
cat > .npmrc << EOF
@mycompany:registry=https://asia-northeast1-npm.pkg.dev/my-project/myapp-npm/
//asia-northeast1-npm.pkg.dev/my-project/myapp-npm/:always-auth=true
EOF
# パッケージのPublish
npm publish --registry=https://asia-northeast1-npm.pkg.dev/my-project/myapp-npm/
# パッケージのInstall
npm install @mycompany/shared-utils
package.json の例:
{
"name": "@mycompany/shared-utils",
"version": "1.2.0",
"description": "社内共通ユーティリティライブラリ",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"publishConfig": {
"registry": "https://asia-northeast1-npm.pkg.dev/my-project/myapp-npm/"
}
}
Pythonパッケージの管理
# pip.confの設定
cat > pip.conf << EOF
[global]
extra-index-url = https://asia-northeast1-python.pkg.dev/my-project/myapp-python/simple/
EOF
# パッケージのアップロード(twine使用)
pip install twine keyrings.google-artifactregistry-auth
twine upload --repository-url https://asia-northeast1-python.pkg.dev/my-project/myapp-python/ dist/*
# パッケージのインストール
pip install mycompany-utils --extra-index-url https://asia-northeast1-python.pkg.dev/my-project/myapp-python/simple/
Maven パッケージの管理
<!-- pom.xml のリポジトリ設定 -->
<distributionManagement>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://asia-northeast1-maven.pkg.dev/my-project/myapp-maven</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://asia-northeast1-maven.pkg.dev/my-project/myapp-maven</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
CI/CDパイプラインとの連携
Cloud Buildとの連携
# cloudbuild.yaml
steps:
# ビルド
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:$SHORT_SHA'
- '-t'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:latest'
- '.'
# テスト
- name: 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:$SHORT_SHA'
entrypoint: 'npm'
args: ['test']
# プッシュ
- name: 'gcr.io/cloud-builders/docker'
args:
- 'push'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:$SHORT_SHA'
# 脆弱性スキャン待ち
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'artifacts'
- 'docker'
- 'images'
- 'describe'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:$SHORT_SHA'
- '--show-package-vulnerability'
images:
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:$SHORT_SHA'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/myapp-docker/api:latest'
GitHub Actionsとの連携
name: Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- id: auth
uses: google-github-actions/auth@v2
with:
workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/github/providers/github'
service_account: '[email protected]'
- uses: google-github-actions/setup-gcloud@v2
- name: Configure Docker
run: gcloud auth configure-docker asia-northeast1-docker.pkg.dev
- name: Build and Push
run: |
docker build -t asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:${{ github.sha }} .
docker push asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:${{ github.sha }}
Cloud Build CI/CDガイドで、パイプライン構築の詳細を解説しています。
セキュリティ設定
IAMによるアクセス制御
# 読み取り権限の付与(デプロイ用サービスアカウント)
gcloud artifacts repositories add-iam-policy-binding myapp-docker \
--location=asia-northeast1 \
--member="serviceAccount:[email protected]" \
--role="roles/artifactregistry.reader"
# 書き込み権限の付与(CI/CD用サービスアカウント)
gcloud artifacts repositories add-iam-policy-binding myapp-docker \
--location=asia-northeast1 \
--member="serviceAccount:[email protected]" \
--role="roles/artifactregistry.writer"
# 管理者権限(リポジトリ管理者のみ)
gcloud artifacts repositories add-iam-policy-binding myapp-docker \
--location=asia-northeast1 \
--member="group:[email protected]" \
--role="roles/artifactregistry.admin"
脆弱性スキャン
Artifact Registryは、Dockerイメージに対する自動脆弱性スキャンを提供しています。
# オンデマンドスキャン
gcloud artifacts docker images scan \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:latest
# スキャン結果の確認
gcloud artifacts docker images list-vulnerabilities \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:latest \
--format="table(vulnerability.shortDescription, vulnerability.effectiveSeverity, vulnerability.packageIssue.affectedPackage)"
Binary Authorization との連携
本番環境にデプロイするイメージを、署名されたものだけに制限できます。
# Binary Authorization ポリシー
defaultAdmissionRule:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/my-project/attestors/build-attestor
VPC Service Controls
組織外へのデータ流出を防止します。
# サービス境界の作成
gcloud access-context-manager perimeters create myapp-perimeter \
--title="MyApp Security Perimeter" \
--resources="projects/123456789012" \
--restricted-services="artifactregistry.googleapis.com" \
--policy=987654321
Container Registryからの移行
移行手順
Step 1: 既存イメージの一覧取得
# gcr.io 上のイメージを一覧表示
gcloud container images list --repository=gcr.io/my-project
gcloud container images list --repository=asia.gcr.io/my-project
Step 2: Artifact Registryリポジトリの作成
gcloud artifacts repositories create myapp-docker \
--repository-format=docker \
--location=asia-northeast1
Step 3: イメージのコピー
# gcr.io から Artifact Registry へコピー
gcloud artifacts docker images copy \
asia.gcr.io/my-project/api:latest \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:latest
# 複数イメージの一括コピー
for image in $(gcloud container images list --repository=asia.gcr.io/my-project --format='value(name)'); do
tags=$(gcloud container images list-tags $image --format='value(tags)' | tr ';' '\n')
for tag in $tags; do
gcloud artifacts docker images copy \
${image}:${tag} \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/$(basename $image):${tag}
done
done
Step 4: CI/CDパイプラインの更新
Step 5: Kubernetesマニフェストの更新
# Before
image: asia.gcr.io/my-project/api:v1.0.0
# After
image: asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:v1.0.0
GKEガイドで、Kubernetes連携の詳細を解説しています。
コスト最適化
料金体系
| 項目 | 料金(東京リージョン) |
|---|---|
| ストレージ | $0.10/GB/月 |
| ネットワーク(同一リージョン) | 無料 |
| ネットワーク(クロスリージョン) | $0.01/GB〜 |
| 脆弱性スキャン | Container Analysis API 料金 |
クリーンアップポリシー
不要なイメージを自動削除してストレージコストを削減します。
# 30日以上前のタグなしイメージを削除
gcloud artifacts docker images list-tags \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api \
--filter="NOT tags:* AND timestamp.datetime < -P30D" \
--format='get(digest)' | \
xargs -I{} gcloud artifacts docker images delete \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api@{} \
--quiet
SES現場での実践パターン
パターン1: マイクロサービスのイメージ管理
## リポジトリ構成例
myproject/
├── microservices-docker/ # マイクロサービス用Docker
│ ├── user-service
│ ├── order-service
│ ├── payment-service
│ └── notification-service
├── shared-npm/ # 社内共通npmパッケージ
│ ├── @myco/logger
│ ├── @myco/auth-middleware
│ └── @myco/api-client
└── ml-python/ # ML用Pythonパッケージ
├── myco-feature-store
└── myco-model-serving
パターン2: マルチ環境でのイメージ管理
# タグ戦略
# 開発: api:dev-abc1234
# ステージング: api:stg-v1.2.3-rc1
# 本番: api:v1.2.3
# イメージプロモーション(dev → stg → prod)
gcloud artifacts docker tags add \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:dev-abc1234 \
asia-northeast1-docker.pkg.dev/my-project/myapp-docker/api:stg-v1.2.3-rc1
パターン3: リモートリポジトリの活用
Docker Hubやnpmjs.orgのプロキシとして使用し、外部依存のキャッシュとセキュリティスキャンを実現します。
# リモートリポジトリの作成(Docker Hub のプロキシ)
gcloud artifacts repositories create dockerhub-proxy \
--repository-format=docker \
--location=asia-northeast1 \
--mode=remote-repository \
--remote-repo-config-desc="Docker Hub proxy" \
--remote-docker-repo=DOCKER-HUB
IAMセキュリティガイドで、GCPのアクセス制御を詳しく解説しています。
まとめ:Artifact RegistryでGCP案件のパッケージ管理を統一する
Google Cloud Artifact Registryを導入することで、Docker・npm・Maven・Pythonパッケージを一元管理し、セキュリティとCI/CDの効率を大幅に向上できます。
導入ステップ:
- Container Registryからの移行計画を立てる(既存イメージのコピー)
- リポジトリの命名規則とIAMポリシーを策定
- CI/CDパイプライン(Cloud Build / GitHub Actions)と連携
- 脆弱性スキャンとBinary Authorizationでセキュリティを強化
- クリーンアップポリシーでストレージコストを最適化
**GCPのコンテナ・パッケージ管理のスタンダードはArtifact Registryです。**SES案件でのGCPスキルを磨き、市場価値を高めましょう。
SES BASEでは、Google Cloud・コンテナ技術のSES案件を多数掲載しています。案件を検索するからチェックしてみてください。