使用 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. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

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

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  6. 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。

  7. 验证是否已为您的 Google Cloud 项目启用结算功能

  8. 启用 Cloud Resource Manager、Identity and Access Management (IAM) 和 Service Usage API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com serviceusage.googleapis.com
  9. 安装 Google Cloud CLI。

  10. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  11. 如需初始化 gcloud CLI,请运行以下命令:

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

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  13. 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。

  14. 验证是否已为您的 Google Cloud 项目启用结算功能

  15. 启用 Cloud Resource Manager、Identity and Access Management (IAM) 和 Service Usage API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

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

所需的角色

如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建 Terraform 配置文件

创建一个名为 main.tf 的 Terraform 配置文件,并包含此快速入门中使用的 Google Terraform 提供方资源。

请注意,您可以使用插值进行替换,例如引用变量、资源属性和调用函数。

  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
      
        deletion_protection = false # set to "true" in production
      
        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. 输入值提示符处,输入 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

后续步骤