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
      }
    }
  }
}