コンテナイメージやライブラリパッケージの管理は、モダンな開発フローにおいて欠かせない要素です。適切なレジストリ管理は、セキュリティの確保とデプロイの安定性に直結します。
GCP Artifact Registryは、Container Registry(GCR)の後継として登場した統合型のアーティファクト管理サービスです。この記事では、Dockerコンテナイメージの管理を中心に、npm・Python・Maven等の言語パッケージ管理、脆弱性スキャン、CI/CDパイプラインとの連携まで、実務で必要な設定手順を詳しく解説します。
Artifact Registryとは?Container Registryとの違い
Artifact Registryは、GCPが提供するフルマネージドなアーティファクト管理サービスです。2020年に発表され、旧Container Registry(gcr.io)の後継として位置づけられています。
Container Registry(GCR)からの主な改善点
Artifact Registryが従来のContainer Registryより優れている点は以下の通りです。
- マルチフォーマット対応:Dockerイメージだけでなく、npm、Python、Maven、Go、Aptなどの言語パッケージも管理可能
- リポジトリ単位の権限管理:IAMをリポジトリ単位で設定でき、チームごとにアクセスを制御できる
- リージョン指定:データの保存先リージョンを明示的に選択できる
- 脆弱性スキャン:On-Demand ScanningやAutomatic Scanningでイメージの脆弱性を自動検知
- クリーンアップポリシー:古いイメージを自動削除するルールを設定可能
GCPは既にContainer Registryの新規利用を非推奨としています。新規プロジェクトでは必ずArtifact Registryを使用してください。
料金体系
Artifact Registryの料金は主に2つの要素で構成されます。
- ストレージ:0.10ドル/GB/月(最初の0.5GBまで無料)
- ネットワーク:同リージョン内のダウンロードは無料。リージョン間・インターネットへの転送は課金対象
小〜中規模のプロジェクトであれば、月額数百円程度で運用できます。コスト管理の観点から、不要なイメージの定期的な削除も重要です。
リポジトリの作成と初期設定
Artifact Registryでは、まずリポジトリを作成し、その中にアーティファクトを格納します。
Dockerリポジトリの作成
# APIの有効化
gcloud services enable artifactregistry.googleapis.com
# Dockerリポジトリの作成
gcloud artifacts repositories create my-docker-repo \
--repository-format=docker \
--location=asia-northeast1 \
--description="本番用Dockerイメージリポジトリ" \
--immutable-tags
--immutable-tagsオプションを指定すると、既存のタグを上書きできなくなります。本番環境では、同じタグで異なるイメージがデプロイされる事故を防ぐために、このオプションの利用を推奨します。
npmリポジトリの作成
# npmリポジトリの作成
gcloud artifacts repositories create my-npm-repo \
--repository-format=npm \
--location=asia-northeast1 \
--description="社内npmパッケージリポジトリ"
Pythonリポジトリの作成
# Pythonリポジトリの作成
gcloud artifacts repositories create my-python-repo \
--repository-format=python \
--location=asia-northeast1 \
--description="社内Pythonパッケージリポジトリ"
リポジトリの一覧確認
# リポジトリ一覧の表示
gcloud artifacts repositories list --location=asia-northeast1
Dockerイメージのプッシュとプル
Artifact RegistryへDockerイメージをプッシュ・プルする手順を解説します。
認証の設定
まず、Dockerクライアントの認証を設定します。
# gcloud認証ヘルパーの設定
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
# 設定の確認(~/.docker/config.jsonに追記される)
cat ~/.docker/config.json
この設定により、asia-northeast1-docker.pkg.devへのアクセス時に自動的にgcloudの認証情報が使用されます。
イメージのビルドとプッシュ
# Artifact Registryのパス形式でタグ付け
# 形式: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG
docker build -t asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0 .
# イメージのプッシュ
docker push asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0
# latestタグも付与してプッシュ
docker tag asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0 \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:latest
docker push asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:latest
イメージのプルとデプロイ
# イメージのプル
docker pull asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0
# Cloud Runへのデプロイ時に直接指定
gcloud run deploy my-service \
--image=asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0 \
--region=asia-northeast1
Cloud Runへのデプロイでは、Artifact Registryのイメージパスをそのまま指定するだけで利用できます。
イメージ一覧の確認と管理
# リポジトリ内のイメージ一覧
gcloud artifacts docker images list \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo
# 特定イメージのタグ一覧
gcloud artifacts docker tags list \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app
# 古いイメージの削除
gcloud artifacts docker images delete \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v0.9.0 \
--quiet
言語パッケージの管理(npm・Python)
Artifact Registryはコンテナイメージだけでなく、各言語のパッケージリポジトリとしても利用できます。社内ライブラリの配布やプライベートパッケージの管理に最適です。
npmパッケージの公開と利用
# npmの認証設定
npx google-artifactregistry-auth
# .npmrcファイルの設定
cat << EOF > .npmrc
@my-scope:registry=https://asia-northeast1-npm.pkg.dev/my-project/my-npm-repo/
//asia-northeast1-npm.pkg.dev/my-project/my-npm-repo/:always-auth=true
EOF
# パッケージの公開
npm publish
# パッケージのインストール
npm install @my-scope/my-package
Pythonパッケージの公開と利用
# pip用の認証設定
gcloud artifacts print-settings python \
--project=my-project \
--repository=my-python-repo \
--location=asia-northeast1
# twineでパッケージをアップロード
pip install twine keyrings.google-artifactregistry-auth
python -m twine upload \
--repository-url https://asia-northeast1-python.pkg.dev/my-project/my-python-repo/ \
dist/*
# パッケージのインストール
pip install my-package \
--index-url https://asia-northeast1-python.pkg.dev/my-project/my-python-repo/simple/
リモートリポジトリとバーチャルリポジトリ
Artifact Registryには、外部レジストリのキャッシュやプロキシとして機能するリモートリポジトリと、複数のリポジトリを1つにまとめるバーチャルリポジトリがあります。
# Docker Hubのリモートリポジトリを作成(キャッシュ用)
gcloud artifacts repositories create dockerhub-cache \
--repository-format=docker \
--location=asia-northeast1 \
--mode=remote-repository \
--remote-repo-config-desc="Docker Hub cache" \
--remote-docker-repo=DOCKER-HUB
# バーチャルリポジトリの作成
gcloud artifacts repositories create virtual-docker \
--repository-format=docker \
--location=asia-northeast1 \
--mode=virtual-repository
リモートリポジトリを使えば、Docker Hubのレート制限に引っかかるリスクを軽減でき、ビルド時間の短縮にも繋がります。
脆弱性スキャンの設定と活用
コンテナイメージに含まれるOSパッケージやライブラリの脆弱性を自動検知する機能は、セキュリティ運用の要です。
自動スキャンの有効化
# Container Analysis APIの有効化
gcloud services enable containeranalysis.googleapis.com
gcloud services enable containerscanning.googleapis.com
# 自動スキャンの有効化(プロジェクトレベル)
gcloud artifacts settings update \
--project=my-project \
--vulnerability-scanning=AUTOMATIC
自動スキャンを有効化すると、イメージがプッシュされるたびに脆弱性スキャンが実行されます。
スキャン結果の確認
# イメージの脆弱性スキャン結果を表示
gcloud artifacts docker images describe \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0 \
--show-package-vulnerability
# 重大度がCRITICALまたはHIGHの脆弱性のみ表示
gcloud artifacts vulnerabilities list \
asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:v1.0.0 \
--occurrence-filter='kind="VULNERABILITY" AND vulnerability.severity="CRITICAL" OR vulnerability.severity="HIGH"'
Binary Authorizationとの連携
脆弱性スキャンの結果をBinary Authorizationと連携させると、脆弱性が検出されたイメージのデプロイを自動的にブロックできます。IAMによるアクセス制御と組み合わせることで、多層的なセキュリティを構築できます。
# Binary Authorization APIの有効化
gcloud services enable binaryauthorization.googleapis.com
# ポリシーの設定例(脆弱性スキャンをパスしたイメージのみデプロイ許可)
# ポリシーはYAMLまたはCloud Consoleで設定
クリーンアップポリシーによるストレージ管理
イメージが蓄積するとストレージコストが増加するため、不要なイメージを自動的に削除するクリーンアップポリシーを設定しましょう。
クリーンアップポリシーの作成
# クリーンアップポリシーをJSONで定義
cat << 'EOF' > cleanup-policy.json
[
{
"name": "delete-old-images",
"action": {"type": "Delete"},
"condition": {
"olderThan": "2592000s",
"tagState": "UNTAGGED"
}
},
{
"name": "keep-recent-tagged",
"action": {"type": "Keep"},
"condition": {
"tagPrefixes": ["v"],
"newerThan": "7776000s"
},
"mostRecentVersions": {
"keepCount": 10
}
}
]
EOF
# ポリシーの適用
gcloud artifacts repositories set-cleanup-policies my-docker-repo \
--location=asia-northeast1 \
--policy=cleanup-policy.json
上記のポリシーでは、以下のルールを設定しています。
- タグなしイメージは30日後に自動削除
- 「v」で始まるタグのイメージは最新10個を保持し、90日以上古いものは削除
ドライランで影響を確認する
# ドライランで削除対象を確認(実際には削除しない)
gcloud artifacts repositories set-cleanup-policies my-docker-repo \
--location=asia-northeast1 \
--policy=cleanup-policy.json \
--dry-run
CI/CDパイプラインとの連携
Artifact Registryは、Cloud BuildをはじめとするCI/CDツールとシームレスに連携できます。
Cloud Buildからのイメージプッシュ
Cloud Buildでは、ビルドしたイメージをArtifact Registryに自動プッシュする設定が簡単にできます。
# cloudbuild.yaml
steps:
# Dockerイメージのビルド
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-docker-repo/my-app:$SHORT_SHA'
- '-t'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-docker-repo/my-app:latest'
- '.'
# テストの実行
- name: 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-docker-repo/my-app:$SHORT_SHA'
entrypoint: 'npm'
args: ['test']
# イメージのプッシュ
images:
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-docker-repo/my-app:$SHORT_SHA'
- 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-docker-repo/my-app:latest'
Cloud Buildのサービスアカウントには、Artifact Registryへの書き込み権限が必要です。
# Cloud Buildサービスアカウントに権限を付与
gcloud artifacts repositories add-iam-policy-binding my-docker-repo \
--location=asia-northeast1 \
--member="serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
--role="roles/artifactregistry.writer"
GitHub Actionsからの利用
# .github/workflows/build.yml
name: Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: google-github-actions/auth@v2
with:
workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/providers/github-provider'
service_account: 'github-actions@my-project.iam.gserviceaccount.com'
- 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/my-docker-repo/my-app:${{ github.sha }} .
docker push asia-northeast1-docker.pkg.dev/my-project/my-docker-repo/my-app:${{ github.sha }}
まとめ:Artifact Registryでアーティファクト管理を効率化する
GCP Artifact Registryを活用したコンテナイメージとパッケージの管理方法を解説しました。重要なポイントをまとめます。
- Container Registryからの移行:新規プロジェクトでは必ずArtifact Registryを使用する
- リポジトリ設計:用途と環境ごとにリポジトリを分離し、IAMで権限管理する
- 脆弱性スキャン:自動スキャンを有効化し、CRITICALな脆弱性にはアラートを設定する
- クリーンアップポリシー:不要なイメージを自動削除してストレージコストを最適化する
- CI/CD連携:Cloud BuildやGitHub Actionsと連携して、ビルドからプッシュまでを自動化する
まずはDockerリポジトリを作成し、手動でイメージのプッシュとプルを試してみてください。その後、Cloud BuildによるCI/CDパイプラインと連携させ、ビルドからデプロイまでを自動化しましょう。Cloud RunやCloud Functionsへのデプロイと組み合わせることで、コンテナベースの開発ワークフローが完成します。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践