使用 Terraform 部署 multi-YAML 的工作流定義

如果您部署了許多工作流程、HTTP API,需要自動化調度管理,那 Google Cloud 的 Workflows 將會是一套很適合的工具。這項全代管服務,能協助自動化執行工作流程,並內建錯誤處理機制。您可以在 YAML 或 JSON 文件中定義工作流程,並使用 gcloudGoogle 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。)


連絡「GCP 專門家」