GCP Artifact Registryの使い方|コンテナイメージとパッケージの管理実践

kento_morota 19分で読めます

コンテナイメージやライブラリパッケージの管理は、モダンな開発フローにおいて欠かせない要素です。適切なレジストリ管理は、セキュリティの確保とデプロイの安定性に直結します。

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 RunCloud Functionsへのデプロイと組み合わせることで、コンテナベースの開発ワークフローが完成します。

#GCP#Artifact Registry#コンテナ
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

AI活用のヒントをお探しですか?お気軽にご相談ください。

まずは話だけ聞いてもらう