2023/10/11
Categories:
ラインボット作ろうかなと思い、いろいろ使ってみる。
ko + Cloud Runやってみ
ko
を使ってみる。
Goのビルドからイメージの作成、レジストリへのpushまで一貫してやってくれるすごいヤツ。
go install github.com/google/ko@latest
Cloud Runをたてるので、sampleベースに作る。
Artifact Registryにリポジトリを作成して、ko
でDockerイメージをビルドしてリポジトリにパブリッシュする。
KO_DOCKER_REPO=XXX ko build ./cmd/api
Cloud Runをデプロイするで。
実際はさっきpublishしたイメージのIDを直接指定した。
gcloud run deploy api --image $(ko build ./cmd/api)
とっても簡単。
Terraform
Terraformやるぞ。
まずはCLIのインストールだ。
Install Terraform | Terraform | HashiCorp Developer
Google CloudのドキュメントにTerraformを使ったベストプラクティスとかインフラ構成とかのってた。
とりあえずディレクトリ構成はざっくり下記みたいな感じでやってく。enviroments
配下がエントリーポイントで、各モジュールはservices
配下とresources
配下においていく。
> tree
.
|____resources
|____enviroments
| |____dev
| | |____backend.tf
| | |____main.tf
| | |____versions.tf
| | |____variables.tf
| | |____.terraform.lock.hcl
|____services
| |____api
| | |____main.tf
| | |____variables.tf
tfstateの管理をgcsでする。backendの設定にvariablesは使えないので注意。
terraform {
backend "gcs" {
bucket = "${PROJECT_ID}-tfstate"
prefix = "env/dev"
}
}
koでアップロードしたイメージをCloud Runでデプロイするためにservices/api
配下にこんな感じのterraform用意した。
イメージはvariables経由で渡す。そうしないとイメージを変更しても差分検知されずにデプロイできない・・・。
(これが参考 ⇢ Terraformで行うGCPのCI/CD運用 | Sqripts)
resource "google_cloud_run_v2_service" "api" {
name = "api"
location = var.region
ingress = "INGRESS_TRAFFIC_ALL"
template {
max_instance_request_concurrency = 100
timeout = "30s"
scaling {
min_instance_count = 0
max_instance_count = 2
}
containers {
image = var.api_image
startup_probe {
failure_threshold = 1
period_seconds = 240
timeout_seconds = 240
tcp_socket {
port = 8080
}
}
resources {
cpu_idle = true
limits = { "memory" : "512Mi", "cpu" : "1" }
startup_cpu_boost = true
}
}
}
}