↓メインコンテンツへスキップ
  1. Blogs/

TerraformでArtifact RegistryのDocker Repositoryを作成してみた

2 分
Terraform GoogleCloud Docker
0222-nnn
著者
0222-nnn
猫が好き
目次
Terraform-GoogleCloud - この記事は連載の一部です
パート 12: この記事

概要
#

Container Imageの置き場所をコンソールで作ると、RegionやFormatの選択を都度確認することになります。CI/CDから使う場合、環境ごとに設定がずれていても把握できません。

Terraformで管理すれば、Repositoryの設定を環境間で揃えられる構成です。ここでは東京RegionにDocker Repositoryを作成し、Docker認証してImageをPushします。

Terraformの基本操作とDockerコマンドは前提としています。Artifact Registryが初めての方向けです。

基本サンプルの管理対象はRepositoryまでで、Image自体はTerraform Stateへ含めません。Cleanup Policyや脆弱性スキャンの設定も扱いません。

検証すること
#

  • Artifact RegistryにDocker Repositoryを作成できること
  • Docker認証を設定してImageをPushできること
  • Google Cloud CLIでRepositoryとImageを確認できること

前提環境
#

  • Google Cloud CLI、Terraform、Docker
  • Billingが有効な検証用Google Cloud Project
  • Artifact Registryを操作できるGoogleアカウント
  • 検証時のバージョン:Terraform 1.14.3、google 7.43.0

今回の構成
#

RepositoryはRegionに属します。VPCの中ではなく、Google管理のレジストリ基盤上にあります。

flowchart TB
    Docker["手元のDocker Client"]

    subgraph GCP["Google Cloud"]
        subgraph Project["Project"]
            IAM["IAM
artifactregistry.reader / writer"] subgraph Region["asia-northeast1"] subgraph AR["Artifact Registry"] Repo["Repository: tf-example-docker
format: DOCKER"] end end end end Docker -->|"push / pull
asia-northeast1-docker.pkg.dev"| Repo IAM -.->|"アクセスを制御"| Repo

エンドポイントはREGION-docker.pkg.devの形式です。Region名がホスト名に入るため、作成したRegionと合っていないとPushできません。

Pushまでの流れは次のとおりです。

sequenceDiagram
    actor User as 手元の端末
    participant GC as gcloud
    participant Docker as Docker Client
    participant AR as Artifact Registry

    User->>GC: gcloud auth configure-docker REGION-docker.pkg.dev
    GC-->>Docker: 認証ヘルパーを登録
    User->>Docker: docker push REGION-docker.pkg.dev/...
    Docker->>AR: 認証情報つきでアップロード
    AR-->>Docker: 完了

使用するTerraformコード
#

Docker Repository
#

resource "google_artifact_registry_repository" "example" {
  location      = var.region
  repository_id = var.repository_id
  description   = var.description
  format        = "DOCKER"

  labels = {
    env        = "test"
    managed_by = "terraform"
    example    = "11-artifact-registry"
  }

  depends_on = [google_project_service.artifactregistry]
}

format = "DOCKER"でDocker Image用Repositoryを作成します。RepositoryのLocationは利用するCloud RunやGKEに近いRegionを選ぶと、LatencyやNetwork転送を抑えやすくなります。

設定と実行
#

cd Basic-Examples/11-artifact-registry
cp terraform.tfvars.example terraform.tfvars
project_id    = "your-project-id"
region        = "asia-northeast1"
repository_id = "tf-example-docker"
terraform init
terraform fmt -check
terraform validate
terraform plan
terraform apply
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

docker_repository_url = "asia-northeast1-docker.pkg.dev/YOUR_PROJECT_ID/tf-example-docker"
repository_id = "tf-example-docker"
repository_name = "tf-example-docker"

GCP側で確認する
#

REGION="asia-northeast1" # terraform.tfvarsのregionと合わせる
gcloud artifacts repositories describe \
  "$(terraform output -raw repository_id)" \
  --location="${REGION}" \
  --project=YOUR_PROJECT_ID

Docker Clientから利用する場合、対象Hostの認証を設定します。

gcloud auth configure-docker asia-northeast1-docker.pkg.dev

Image名は次の形式です。

asia-northeast1-docker.pkg.dev/PROJECT_ID/tf-example-docker/IMAGE:TAG

Docker ImageをPushするには、実行IdentityへArtifact Registry Writer相当の権限が必要です。

後片付けと注意点
#

terraform destroy

Repository内にImageが存在すると削除できない、または保存したArtifactも失われる可能性があります。必要なImageがないことを確認します。

保存容量やNetwork転送などは課金対象です。古いImageの削除方針やCleanup Policyは実運用時に別途設計します。

まとめ
#

  • Docker形式のArtifact Registry Repositoryを作成できる
  • RegionをWorkloadに合わせて選択できる
  • RepositoryとImageのLifecycleを分けて管理できる
  • PushするIdentityにはWriter権限が必要

参考資料
#

次回
#

次はBigQuery DatasetとTableをTerraformで作成します。

Terraform-GoogleCloud - この記事は連載の一部です
パート 12: この記事

関連記事

Terraform StateをCloud Storage Remote Backendへ移行してみた
2 分
Terraform GoogleCloud CloudStorage
TerraformからGoogle Cloudへ接続してProject情報を取得してみた
3 分
Terraform GoogleCloud
TerraformでArtifact RegistryのコンテナをCloud Runへデプロイしてみた
2 分
Terraform GoogleCloud CloudRun ArtifactRegistry
TerraformでBigQuery DatasetとTableを作成してみた
2 分
Terraform GoogleCloud
TerraformでCloud KMSのKeyRingとCryptoKeyを作成してみた
2 分
Terraform GoogleCloud
TerraformでCloud MonitoringのAlert Policyを作成してみた
2 分
Terraform GoogleCloud