概要 #
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で作成します。