使用Terraform操作云工作流定时调度

Terraform是一种开源工具,用于安全高效地预览,配置和管理云基础架构和资源。云工作流调度使用EventBridge实现,该功能目前仅限控制台使用,未开放API,无法使用Terraform直接操作云工作流调度。如果您需要使用Terraform调度云工作流,可以通过使用Terraform创建EventBridge资源实现。

前提条件

步骤一:配置身份信息

在终端中输入操作指令配置用户身份信息,将访问凭证保存在环境变量中。环境变量的设置方式如下:

# macOS/Linux系统
export ALIBABA_CLOUD_ACCESS_KEY_ID="TF****KL"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="zi****MO"
# Windows系统
set ALIBABA_CLOUD_ACCESS_KEY_ID="TF****KL"
set ALIBABA_CLOUD_ACCESS_KEY_SECRET="zi****MO"
说明

用户身份信息配置仅在当前终端会话中有效,一旦关闭窗口,您将需要重新在环境变量中配置用户身份信息。

步骤二:配置使用云工作流的地域并初始化

  1. 创建一个Terraform工作目录(例如名为cloudflow的工作目录),并在该目录下创建一个名为main.tf的文件。

  2. 在main.tf中,添加如下内容,指定需要使用云工作流的地域。

    provider "alicloud" {
      region = "cn-hangzhou"
    }
  3. 打开终端,跳转到您所创建的工作目录cloudflow下,执行如下命令,初始化Terraform工作目录。

    terraform init

步骤三:创建RAM策略和角色

在main.tf中,添加如下内容,用于初始化EventBridge调用云工作流时所使用的Role,并赋予其发起执行的权限。配置示例如下。完整参数说明,请参见alicloud_ram_policyalicloud_ram_rolealicloud_ram_role_policy_attachment

# 变量定义。
variable "policy_name" {
  type = string
  description = "The name of the policy."
  default = "test-policy"
}

variable "role_name" {
  type = string
  description = "The role for eb to start execution of flow."
  default = "eb-to-fnf-role"
}

# 创建一个RAM策略来定义权限。
resource "alicloud_ram_policy" "policy_exmaple" {
  policy_name     = var.policy_name
  policy_document = <<EOF
  {
    "Statement": [
      {
        "Action": [
          "fnf:DescribeFlow",
          "fnf:StartExecution",
          "fnf:StartSyncExecution"
        ],
        "Effect": "Allow",
        "Resource": [
          "*"
        ]
      }
    ],
      "Version": "1"
  }
  EOF
}

# 创建一个RAM角色。
resource "alicloud_ram_role" "role_example" {
  name     = var.role_name
  document = <<EOF
  {
    "Statement": [
      {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
          "Service": [
            "eventbridge.aliyuncs.com"
          ]
        }
      }
    ],
    "Version": "1"
  }
  EOF
}

# 将创建的RAM策略附加到RAM角色上,以授予该角色相应的权限。
resource "alicloud_ram_role_policy_attachment" "attach_example" {
  policy_name = alicloud_ram_policy.policy_exmaple.policy_name
  policy_type = alicloud_ram_policy.policy_exmaple.type
  role_name   = alicloud_ram_role.role_example.name
}

步骤四:配置云工作流及定时调度

  1. 在main.tf中,添加如下内容,创建流程。如果流程中需要调用外部服务,需要传入role_arn参数。参数说明,请参见alicloud_fnf_flow

    # 变量定义
    variable "flow_name" {
      type = string
      description = "The name of the flow."
      default = "test-flow"
    }
    
    # 创建一个云工作流资源
    resource "alicloud_fnf_flow" "flow_example" {
      definition  = <<EOF
      Type: StateMachine
      Name: ${var.flow_name}
      SpecVersion: v1
      StartAt: Hello World
      States:
      - Type: Pass
        Name: Hello World
        End: true
      EOF
      description = "Test for terraform fnf_flow."
      name        = var.flow_name
      type        = "FDL"
    }
  2. 在main.tf中添加如下内容,创建事件总线、事件源和事件规则。EventBridge资源数量限制,请参见使用限制

    # 变量定义。
    variable "event_bus_name" {
      type = string
      description = "The name of the event bus."
      default = "test-eventbus1"
    }
    
    variable "event_source_name" {
      type = string
      description = "The name of the event source."
      default = "test-eventsource1"
    }
    
    variable "event_rule_name" {
        type = string
        description = "The name of the event rule."
        default = "test-eventrule1"
    }
    
    variable "target_id" {
        type = string
        description = "The ID of the target."
        default = "test-target1"
    }
    
    # 创建一个事件总线来接收和路由事件。
    resource "alicloud_event_bridge_event_bus" "eventbus_example" {
      event_bus_name = var.event_bus_name
    }
    
    # 创建一个事件源,用于生成定时事件。
    resource "alicloud_event_bridge_event_source" "eventsource_example" {
      event_bus_name         = alicloud_event_bridge_event_bus.eventbus_example.event_bus_name
      event_source_name      = var.event_source_name
      linked_external_source = true
      external_source_type   = "ScheduledEvent"
      external_source_config = {
        Schedule = "0 */1 * * * ?",
        TimeZone = "GMT+8:00",
        UserData = jsonencode({
          "key": "value"
        })
      }
    }
    
    # 定义一个本地变量,用于存储云工作流的ARN。
    locals {
        flow_arn = format("acs:fnf:::flow/%s", var.flow_name)
    }
    
    # 创建一个事件规则,用于匹配事件源生成的事件,并将这些事件路由到指定的云工作流。
    resource "alicloud_event_bridge_rule" "eventrule_example" {
      event_bus_name = alicloud_event_bridge_event_bus.eventbus_example.event_bus_name
      rule_name      = var.event_rule_name
      filter_pattern = format("{\"source\":[\"%s\"]}", var.event_source_name)
      targets {
        target_id = var.target_id
        endpoint  = local.flow_arn
        type      = "acs.fnf"
        param_list {
          resource_key = "Input"
          form         = "ORIGINAL"
        }
        param_list {
          form         = "CONSTANT"
          resource_key = "FlowName"
          value        = var.flow_name
        }
        param_list {
          form         = "CONSTANT"
          resource_key = "RoleName"
          value        = var.role_name
        }
      }
    }
  3. 创建资源。

    1. 执行如下命令:

      terraform apply
    2. 输入 yes,如果返回结果中提示Apply complete!则表示资源创建完成。

      image