2023/10/11

ラインボット作ろうかなと思い、いろいろ使ってみる。

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