使用 Terraform 创建工作流

本快速入门介绍了如何使用 Terraform 创建、部署和执行第一个工作流。Terraform 是一种基础架构即代码工具,可让您使用代码以可预测的方式创建、更改和改进云基础架构。了解如何使用 Terraform 在 Google Cloud 上预配基础架构。

在本快速入门中,示例工作流会向公共 API 发送请求,然后返回该 API 的响应。

您将完成以下操作:

  1. 使用 Terraform 启用 Workflows API。
  2. 使用 Terraform 为工作流创建服务帐号。
  3. 使用 Terraform 定义和部署工作流。
  4. 使用 Google Cloud CLI 执行工作流。

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

请注意,Cloud Shell 已集成 Terraform。如果您需要安装 Terraform,请参阅 HashiCorp Terraform 文档

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  7. 安装 Google Cloud CLI。
  8. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  9. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  10. 确保您的 Google Cloud 项目已启用结算功能

  11. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com

创建 Terraform 配置文件

创建一个名为 main.tf 的 Terraform 配置文件,并添加本快速入门中使用的适用于 Terraform 的 Google 提供方资源。

请注意,您可以使用插值替代引用变量、资源属性和调用函数等替代变量。

  1. 创建目录:

    mkdir terraform
  2. 转到 terraform 目录:

    cd terraform
  3. 将新文件 main.tf 添加到以下目录中:

    nano main.tf
  4. 将以下资源添加到 main.tf 文件:

    1. 分配项目 ID:

      provider "google" {
      project = "PROJECT_ID"
      }

      PROJECT_ID 替换为您的项目 ID。

    2. 启用 Workflows API:

      # Enable Workflows API
      resource "google_project_service" "default" {
        service            = "workflows.googleapis.com"
        disable_on_destroy = false
      }

    3. 为工作流创建服务账号:

      # Create a dedicated service account
      resource "google_service_account" "default" {
        account_id   = "sample-workflows-sa"
        display_name = "Sample Workflows Service Account"
      }

    4. 使用 google_workflows_workflow 资源定义工作流:

      # Create a workflow
      resource "google_workflows_workflow" "default" {
        name            = "sample-workflow"
        region          = "us-central1"
        description     = "A sample workflow"
        service_account = google_service_account.default.id
        labels = {
          env = "test"
        }
        user_env_vars = {
          url = "https://timeapi.io/api/Time/current/zone?timeZone=Europe/Amsterdam"
        }
        source_contents = <<-EOF
        # This is a sample workflow that you can replace with your source code
        #
        # The workflow does the following:
        # - Retrieves the current date from a public API and stores the
        #   response in `currentDate`
        # - Retrieves a list of Wikipedia articles from a public API related
        #   to the day of the week stored in `currentDate`
        # - Returns the list of articles in the workflow output
        #
        # Note that when you define workflows in Terraform, variables must be
        # escaped with two dollar signs ($$) and not a single sign ($)
      
        - getCurrentDate:
            call: http.get
            args:
                url: $${sys.get_env("url")}
            result: currentDate
        - readWikipedia:
            call: http.get
            args:
                url: https://en.wikipedia.org/w/api.php
                query:
                    action: opensearch
                    search: $${currentDate.body.dayOfWeek}
            result: wikiResult
        - returnOutput:
            return: $${wikiResult.body[1]}
      EOF
      
        depends_on = [google_project_service.default]
      }

      示例工作流中会使用以下参数:

      • name:工作流的名称。
      • region:工作流的位置
      • description:工作流说明。
      • service_account:与最新工作流版本关联的服务帐号的电子邮件地址或唯一 ID。此服务帐号代表工作流的身份并确定工作流具有哪些权限。如果您在创建工作流的过程中未指定服务帐号,则工作流将使用默认 Compute Engine 服务帐号作为其身份。如需了解详情,请参阅授予工作流访问 Google Cloud 资源的权限
      • labels:要分配给此工作流的键值对标签对列表,可帮助您整理 Google Cloud 实例。如需了解详情,请参阅什么是标签?
      • user_env_vars:与此工作流修订版本关联的用户定义的环境变量。如需了解详情,请参阅使用环境变量
      • source_contents:要执行的 Workflows 代码。如需了解文件大小限制,请参阅资源限制

      其他可选参数包括:

      • crypto_key_name:Cloud Key Management Service 密钥的资源 ID,格式如下:

        projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME

        如需了解详情,请参阅使用客户管理的加密密钥

      • call_log_level:在工作流执行期间应用于调用和呼叫响应的日志记录级别。可能的值包括:

        • CALL_LOG_LEVEL_UNSPECIFIED
        • LOG_ALL_CALLS
        • LOG_ERRORS_ONLY
        • LOG_NONE

        如需了解详情,请参阅通话记录

      • project:资源所属项目的 ID。如果未提供,系统会使用提供方项目。

      • name_prefix:创建以指定前缀开头的唯一名称。如果未指定此属性和 name,则系统会为名称选择一个随机值。

创建和执行工作流

部署 Terraform 资源以创建工作流,然后执行工作流。

  1. 在目录中初始化 Terraform:

    terraform init
    
  2. 检查您使用 Terraform 建议的更改是否符合预期计划:

    terraform plan
    

    您可以忽略有关不使用 -out 选项的备注。

  3. 创建工作流:

    terraform apply
    
  4. Enter a value 提示符处,输入 yes 以继续创建资源。

  5. 确认已创建工作流:

    gcloud workflows list --location us-central1
    

    输出应类似如下所示:

    NAME                                                                    STATE   REVISION_ID  UPDATE_TIME
    projects/project-name/locations/us-central1/workflows/sample-workflow   ACTIVE  000001-f9a   2024-02-24T13:38:58.353765906Z
    
  6. 您可以选择执行此工作流:

    gcloud workflows execute sample-workflow
    

清理

为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

  1. 删除您使用 Terraform 创建的所有资源:
    terraform destroy
  2. 删除您创建的工作流:
    gcloud workflows delete sample-workflow
    当系统询问您是否要继续时,请输入 y
  3. 或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。

      删除 Google Cloud 项目:

      gcloud projects delete PROJECT_ID

后续步骤