今天來跟大家介紹昨天撰寫程式的一些細節, 協助大家理解
先從 main.tf 看起
provider "google" {
  project = var.project_id
  region  = var.region
}
locals {
  db_name = "(default)"
}
# resource "google_firestore_database" "database" {
#   name = local.db_name
#   location_id = var.region
#   type        = "FIRESTORE_NATIVE"
# }
module "gcs" {
  source     = "./gcs"
  project_id = var.project_id
  location   = var.location
}
module "account" {
  source     = "./account"
  project_id = var.project_id
}
# 設置 IAM 後多等一下, 避免 bug
resource "null_resource" "delay" {
  provisioner "local-exec" {
    command = "sleep 60"
  }
  depends_on = [module.account]
}
module "workflow" {
  source     = "./workflow"
  project_id = var.project_id
  region     = var.region
  file       = "./flow"
  account    = module.account.self_link
  # depends_on = [google_firestore_database.database, module.gcs, module.account]
  depends_on = [module.gcs, null_resource.delay]
}
module "scheduler" {
  source     = "./scheduler"
  project_id = var.project_id
  email      = module.account.mail
  region     = var.region
  name       = module.workflow.name
  bucket     = module.gcs.path
  db         = local.db_name
  depends_on = [module.workflow]
}
可以看出我整體是依照昨天的順序圖來設置相依關係
flowchart LR
    GCS --> WorkFlow
    ServiceAccount --> WorkFlow --> Scheduler
GCS和SA是直接建置的,工作流程稍後才建置,而排程器需要等到工作流程完成建置才能啟動。
在這過程中,你注意到我已經將Firestore數據庫的部分隱藏起來,主要原因是我發現銷毀操作並不會清除數據庫,為了避免混淆,我假設數據庫已經存在。
之後,我完成 IAM 設置後,使用null_resource等待了60秒。這是因為雲資源在設置成功並返回後,仍需要一段時間進行初始化。在這段時間內,如果強制執行操作,可能會引發許多錯誤。因此,當我發現IAM存在某些問題時,我毅然決定添加了這個模組。
最後,我需要仔細思考每個模組的輸入和輸出,以實現理想的封裝效果。
此外如果要重複執行, SA 帳號要換, 我推測因為 SA 不是一刪除就會完全不在的資源, 所以一直用腳本刪除創建會導致 GCP 回傳 401 的錯誤。
未來我應該會考慮依序執行 iam set member 的模組, 可能也可以解決上面的 bug。