如果您部署了許多工作流程、HTTP API,需要自動化調度管理,那 Google Cloud 的 Workflows 將會是一套很適合的工具。這項全代管服務,能協助自動化執行工作流程,並內建錯誤處理機制。您可以在 YAML 或 JSON 文件中定義工作流程,並使用 gcloud 或 Google Cloud Console 進行部署。除此之外,還有另一個具有宣告性又非常簡單好用的方法,就是使用 Terraform。
本文教您使用 Terraform 定義和部署工作流,並探索如何讓 Terraform 的配置文件更易於管理。
單一 Terraform 文件
Terraform 有一個 google_workflows_workflow 資源可以用來定義和部署工作流。詳細的步驟說明,請參閱基本 Terraform 範例,其中示範了如何在 main.tf 中定義工作流以及如何使用 Terraform 部署它。
(延伸閱讀:簡介 Google Cloud Workflows )
讓我們來看看工作流資源是如何在 Terraform 中被定義:
resource "google_workflows_workflow" "workflows_example" {
name = "sample-workflow"
region = var.region
description = "A sample workflow"
service_account = google_service_account.workflows_service_account.id
source_contents = <<-EOF
# This is a sample workflow, feel free to replace it with your source code
#
# This workflow does the following:
# - reads current time and date information from an external API and stores
# the response in CurrentDateTime variable
# - retrieves a list of Wikipedia articles related to the day of the week
# from CurrentDateTime
# - returns the list of articles as an output of the workflow
# FYI, In terraform you need to escape the $$ or it will cause errors.
- getCurrentTime:
call: http.get
args:
url: https://us-central1-workflowsample.cloudfunctions.net/datetime
result: CurrentDateTime
- readWikipedia:
call: http.get
args:
url: https://en.wikipedia.org/w/api.php
query:
action: opensearch
search: $${CurrentDateTime.body.dayOfTheWeek}
result: WikiResult
- returnOutput:
return: $${WikiResult.body[1]}
EOF
}
您可以看到有關工作流的所有內容,例如名稱、區域、服務帳戶,甚至工作流定義 (workflow definition) 本身都在此文件中定義。雖然這對於簡單的工作流定義是可行的,但如果碰到更大型的工作流,就會難以維護。
導入工作流定義 (workflow definition) 文件
更好的方法是將工作流定義保存在單獨的 YAML 文件中,然後將其導入 Terraform。Terraform的 模板文件功能讓我們得以實現——而且非常簡單。
在 Terraform 導入 YAML 的範例中,您可以看到如何將外部 workflows.yaml 文件導入到您的 Terraform 定義中:
resource "google_workflows_workflow" "workflows_example" {
name = "sample-workflow"
region = var.region
description = "A sample workflow"
service_account = google_service_account.workflows_service_account.id
# Imported main workflow YAML file
source_contents = templatefile("${path.module}/workflow.yaml",{})
}
導入多個工作流定義文件
導入工作流 YAML 文件是朝著正確方向邁出的一步,但在大型工作流定義中,您通常有一個主工作流調用多個子工作流 (subworkflows)。Workflows 目前尚未支援導入或合併工作流和子工作流定義。您最終會得到一個包含主工作流和所有子工作流的工作流定義文件。這是不可維護的。
理想情況下,您需將每個子工作流都放在自己的文件中,並且讓主工作流簡單地引用它們。這件事在 Terraform 中很容易做到。
在 Terraform 具有多個外部 YAML 工作流的這個範例中,您可以看到如何將主工作流的 workflow.yaml 文件和子工作流的 subworkflow.yaml 文件導入您的 Terraform 定義:
resource "google_workflows_workflow" "workflows_example" {
name = "sample-workflow"
region = var.region
description = "A sample workflow"
service_account = google_service_account.workflows_service_account.id
# Imported main workflow with its subworkflow YAML files.
source_contents = join(", [
templatefile(
"${path.module}/workflow.yaml",{}
),
templatefile(
"${path.module}/subworkflow.yaml",{}
)])
}
這肯定會更易於維護!唯一一個小問題是,所有 YAML 最終都會合併並以單一 YAM 部署到工作流,在您偵錯工作流和子工作流時,可能會對子工作流的程式碼行號感到困惑。閱讀完以上的介紹,如果想更了解上述應用情境或針對 Google Cloud Workflows 有任何問題,歡迎聯繫 iKala Cloud!
(本文翻譯改編自 Google Cloud。)