今天來跟大家介紹昨天撰寫程式的一些細節, 協助大家理解
先從 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。