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"
说明
用户身份信息配置仅在当前终端会话中有效,一旦关闭窗口,您将需要重新在环境变量中配置用户身份信息。
步骤二:配置使用云工作流的地域并初始化
创建一个Terraform工作目录(例如名为cloudflow的工作目录),并在该目录下创建一个名为main.tf的文件。
在main.tf中,添加如下内容,指定需要使用云工作流的地域。
provider "alicloud" { region = "cn-hangzhou" }
打开终端,跳转到您所创建的工作目录cloudflow下,执行如下命令,初始化Terraform工作目录。
terraform init
步骤三:创建RAM策略和角色
在main.tf中,添加如下内容,用于初始化EventBridge调用云工作流时所使用的Role,并赋予其发起执行的权限。配置示例如下。完整参数说明,请参见alicloud_ram_policy、alicloud_ram_role和alicloud_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
}
步骤四:配置云工作流及定时调度
在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" }
在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 } } }
创建资源。
执行如下命令:
terraform apply
输入 yes,如果返回结果中提示Apply complete!则表示资源创建完成。
文档内容是否对您有帮助?