作者:王川(弗丁)

导言

EventBridge 作为构建 EDA 架构的基础设施,经过一些中心概念和特性供给了灵敏丰厚的事情搜集、处理和路由的才能。对于不少用户来说,经过操控台里的快捷的引导来运用 EventBridge 应该是最快的上手方法。此外,也有很多用户面临着大量的云产品的办理,运用操控台办理每一个资源的方法变成了沉重的手工操作担负。

为了处理这个问题,现在现已能够经过 OpenAPI、terraform 等方法将 EventBridge 的才能方便快捷的带给用户。本文将要点介绍 EventBridge 和 IaC 的要点概念和特性,然后演示怎么运用 IaC 理念主动化布置 EventBridge 来运用这些概念和特性。

EventBridge 概述

事情驱动架构

事情驱动架构是一种松耦合、分布式的驱动架构,搜集到某运用发生的事情后实时对事情采取必要的处理,紧接着路由至下流体系,无需等候体系呼应。运用事情总线 EventBridge 能够构建各种简略或复杂的事情驱动架构,以标准化的 CloudEvents 1.0 协议连接云产品和运用、运用和运用等。

事情驱动架构体系架构具有以下三个才能: • 事情搜集:担任搜集各种运用发生的事情,如新建订单,退换货订单等其他状况改变; • 事情处理:对事情进行脱敏处理,并对事情进行开始的过滤和挑选; • 事情路由:剖析事情内容并将事情路由分发至下流产品。

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

事情驱动架构具有以下优势:

• 降低耦合:降低事情生产者和订阅者的耦合性。事情生产者只需重视事情的发生,无需重视事情怎么处理以及被分发给哪些订阅者;任何一个环节呈现毛病,都不会影响其他事务正常运转; • 异步执行:事情驱动架构适用于异步场景,即便是需求高峰期,搜集各种来历的事情后保留在事情总线中,然后逐渐分发传递事情,不会形成体系拥塞或资源过剩的状况; • 可扩展性: 事情驱动架构中路由和过滤才能支撑区分服务,便于扩展和路由分发; • 灵敏性: 事情驱动架构支撑与各种阿里云产品和运用集成,支撑事情路由至任何体系服务,供给各种灵敏高效的布置计划。

运用 EventBridge 构建 EDA 架构

事情总线 EventBridge 是阿里云供给的一款无服务器事情总线服务。EventBridge 供给的几个中心概念,能够满意构建 EDA 架构的需求。

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

事情总线 EventBridge 支撑以下事情源:

• 阿里云官方事情源 • 自定义事情源

事情总线 EventBridge 的事情总线包括以下类型:

云服务专用事情总线:一个无需创立且不可修正的内置事情总线,用于接纳您的阿里云官方事情源的事情;阿里云官方事情源的事情只能发布到云服务专用总线; • 自定义事情总线:需求您自行创立并办理的事情总线,用于接纳自定义运用或存量消息数据的事情;自定义运用或存量消息数据的事情只能发布到自定义总线。

在 EventBridge 中,一个事情规矩包括以下内容: • 事情形式:用于过滤事情并将事情路由到事情方针; • 事情方针:包括事情的转换和处理,担任消费事情。

EventBridge 供给了简练的事情形式匹配语法,一起具有灵敏的事情转换才能,后面将会经过演示来展现一些具体的比方。

此外,EventBridge 还供给了一些增强才能,这些才能使得 EDA 架构中流经的事情愈加通明,具有了开箱即用的观测和剖析才能:

• 事情追寻:能够检查发布到事情总线 EventBridge 的事情内容和处理轨道; • 事情剖析:对发布到事情总线的各种事情进行查询剖析处理和可视化图表展现,以便发现事情内涵价值。

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

IaC 简介

在介绍完事情总线 EventBridge 的相关基础内容后,接下来一起了解下 IaC。在 DevOps 的实践中,IaC 是非常重要的部分,经过将基础设施代码化,版别化,便能够轻松的凭借版别操控东西来供给 single source of truth、协调多人协作的改变、实施严格的 review、凭借一些 CI/CD pipeline 东西(乃至 GitOps)来主动触发布置。软件体系的开发者仅支付很小的尽力去描绘需求,就能够在几分钟后得到所需的虚拟机、网络等云上的服务,极大的缩短了布置时刻,一起还能够保证多个环境的装备一致性,经过削减人为操作也降低了引入过错的概率。

IaC的代码实践中一般有两种方法,指令式和声明式。

• 指令式:望文生义,需求清晰宣布每一个动作的指令,描绘的是 How,比方“创立一台 xx 规格的 ECS”。代码需求对每一步动作的次序仔细编列,处理各种或许的过错,特别要注意处理好每次改变对现已存在的资源的影响,不然稍有不小心就或许形成服务中止。举例来说,作为开发者能够经过自己了解的编程言语调用阿里云的 OpenAPI 来办理资源,因为这些 API 是类似 Create、Describe、Delete 等操作,这便是一种指令式的 IaC 实践。

• 声明式: 意味着开发者仅描绘自己的需求终态是什么姿态,即描绘 What,比方“一台 xx 规格的 ECS”。了解 Kubernetes 的同学应该对这个概念很了解了。IaC 东西能够经过描绘资源之间的依靠联系主动编列次序,假如有现已存在的资源,则比对希望的状况和实际状况的差异,并依据差异做出更新;假如不存在,需求进行创立。能够看出,声明式对开发者非常友好,极大的降低了开发者的心智担负。

IaC 带来的优势: • 降低成本: 有效办理资源,并削减为此投入的人力; • 提升功率:加快资源交给和软件布置的速度; • 风险操控: • 削减过错; • 进步基础架构一致性; • 消除装备偏移

terraform 作为 IaC 范畴的佼佼者,供给了强壮的主动化办理基础设施的才能。生态丰厚,很多云厂商都供给了官方插件,阿里云的大多数产品(包括 EventBridge)都对 terraform 做了很全面的支撑,使得跨多云布置基础设施变得极端简略。既然是 IaC,terraform 供给了自己的言语 HCL(hashicorp configuration language),HCL 具有类似 json 的简练的语法,经过声明式的资源描绘,能够让开发者快速上手。

着手实践

预备工作

• 安装 terraform cli 东西,能够参见 www.terraform.io/cli 的内容。 • 创立一个 tf 文件 terraform.tf,内容如下(需求替换<>内的值)

provider "alicloud" {
  access_key = "<your access key>"
  secret_key = "<your secret key>"
  region = "<region id>"
}

事例1:经过钉钉监控云上资源改变

假定一个用户运用了很多云上的资源作为生产环境,需求感知线上资源的改变操作,一个可行的计划是运用 EventBridge 将来自于 ActionTrail 的审计事情投递到用户的钉钉。 首先依据钉钉官方文档创立一个机器人,记下 webhook url 和加签的秘钥,接下来会用到。 创立一个 tf 文件 1_actiontrail2dingding.tf,内容如下(需求替换<>内的值)

# 事例1:经过钉钉监控云上资源改变
# 方针:
# - 了解布置运用EventBridge的default总线
# - 了解EventBridge的事情形式匹配
# - 了解EventBridge的事情转换装备
# 声明一个default总线上的规矩
resource "alicloud_event_bridge_rule" "audit_notify" {
  # default总线默认存在,所以这儿能够直接运用
  event_bus_name = "default"
  rule_name      = "audit_notify"
  description    = "demo"
  # 经过后缀匹配的方法过滤来自一切云产品事情源的ActionTrail:ApiCall事情
  # 其他更多形式匹配的介绍能够查阅文档:https://help.aliyun.com/document_detail/181432.html
  filter_pattern = jsonencode(
    {
      "type" : [
        {
          "suffix" : ":ActionTrail:ApiCall"
        }
      ]
    }
  )
  targets {
    target_id = "test-target"
    endpoint  = "<your dingtalk bot webhook url>"
    # type的取值能够查阅文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/event_bridge_rule#type
    type      = "acs.dingtalk"
    # 每个事情方针都有一组对应的param_list,具体能够查阅文档:https://help.aliyun.com/document_detail/185887.html
    # 每一个param的form联系到事情转换的装备,能够查阅文档:https://help.aliyun.com/document_detail/181429.html
    param_list {
      resource_key = "URL"
      form         = "CONSTANT"
      value        = "<your dingtalk bot webhook url>"
    }
    param_list {
      resource_key = "SecretKey"
      form         = "CONSTANT"
      value        = "<your dingtalk bot secret key>"
    }
    # 这儿展现了TEMPLATE类型的事情转换描绘
    # value是运用jsonpath引用事情内容的字典,template则是模板内容,EventBridge最终会依据这两者结合事情本身烘托出这个参数的值
    param_list {
      resource_key = "Body"
      form         = "TEMPLATE"
      value        = jsonencode(
        {
          "source": "$.source",
          "type": "$.type"
          "region": "$.data.acsRegion",
          "accountId" : "$.data.userIdentity.accountId",
          "eventName" : "$.data.eventName",
        }
      )
      template = jsonencode(
        {
          "msgtype" : "text",
          "text" : {
            "content": "来自 $${source} 的 $${type} 审计事情:$${accountId} 在 $${region} 执行了 $${eventName} 操作"
          }
        }
      )
    }
  }
}

在指令行窗口顺次执行指令:

• 初始化 terraform init • 预览改变 terraform plan • 运用改变 terraform apply

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

在云产品操控台进行操作,这儿以 KMS 为例

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

钉钉上收到消息通知

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

在 EventBridge 操控台检查事情轨道

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

事例 2:自定义总线触发 FunctionCompute

假定一个用户的运用会发生一些事情,其中一个链路是经过 FunctionCompute 对这些事情进行弹性的处理。那么就能够经过 EventBridge 的自定义事情源和函数核算事情方针来完成这个计划。

创立一个模仿对事情进行处理的 python 脚本文件 src/index.py,内容如下:

# -*- coding: utf-8 -*-
import logging
def handler(event, context):
  logger = logging.getLogger()
  logger.info('evt: ' + str(event))
  return str(event)

创立一个 tf 文件 2_trigger_function.tf,内容如下(需求替换<>内的值)

# 事例2:自定义总线触发FunctionCompute
# 方针:
# - 了解布置运用EventBridge的自定义总线
# - 了解"自定义运用"事情源装备
# - 了解“FunctionCompute”事情方针装备
# 因为用户自己发生的事情需求投递到自定义总线,这儿声明一个叫demo_event_bus的自定义总线
resource "alicloud_event_bridge_event_bus" "demo_event_bus" {
  event_bus_name = "demo_event_bus"
  description    = "demo"
}
# 声明一个在demo_event_bus总线上的自定义事情源,用于经过sdk或许操控台向EventBridge投递事情
resource "alicloud_event_bridge_event_source" "demo_event_source" {
  event_bus_name         = alicloud_event_bridge_event_bus.demo_event_bus.event_bus_name
  event_source_name      = "demo_event_source"
  description            = "demo"
  linked_external_source = false
}
# 声明一个叫fc_service的函数核算服务,publish=true意味着会当即布置上传的函数代码。
resource "alicloud_fc_service" "fc_service" {
  name        = "eb-fc-service"
  description = "demo"
  publish     = true
}
# 将前面预备的python脚本文件打包成zip用于布置到函数核算
data "archive_file" "code" {
  type        = "zip"
  source_file = "${path.module}/src/index.py"
  output_path = "${path.module}/code.zip"
}
# 声明一个fc_service服务中的函数,其中filename引用了上面描绘的zip包,会将这个代码包上传。
resource "alicloud_fc_function" "fc_function" {
  service     = alicloud_fc_service.fc_service.name
  name        = "eb-fc-function"
  description = "demo"
  filename    = data.archive_file.code.output_path
  memory_size = "128"
  runtime     = "python3"
  handler     = "index.handler"
}
# 声明一个在demo_event_bus总线上的规矩
resource "alicloud_event_bridge_rule" "demo_rule" {
  event_bus_name = alicloud_event_bridge_event_bus.demo_event_bus.event_bus_name
  rule_name      = "demo_rule"
  description    = "demo"
  # 经过匹配source过滤来自于前面创立的自定义事情源的事情
  filter_pattern = jsonencode(
    {
      "source" : ["${alicloud_event_bridge_event_source.demo_event_source.id}"]
    }
  )
  targets {
    target_id = "demo-fc-target"
    # type的取值能够查阅文档:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/event_bridge_rule#type
    type      = "acs.fc.function"
    endpoint  = "acs:fc:<region id>:<your account id>:services/${alicloud_fc_service.fc_service.name}.LATEST/functions/${alicloud_fc_function.fc_function.name}"
    param_list {
      resource_key = "serviceName"
      form         = "CONSTANT"
      value        = alicloud_fc_service.fc_service.name
    }
    param_list {
      resource_key = "functionName"
      form         = "CONSTANT"
      value        = alicloud_fc_function.fc_function.name
    }
    param_list {
      resource_key = "Qualifier"
      form         = "CONSTANT"
      value        = "LATEST"
    }
    # 注意form=ORIGINAL意味着每次投递事情都会将事情的原始内容作为这个参数的值
    param_list {
      resource_key = "Body"
      form         = "ORIGINAL"
    }
  }
}

在指令行窗口顺次执行指令

• 初始化 terraform init • 预览改变 terraform plan • 运用改变 terraform apply

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

在操控台模仿自定义事情源发布事情

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

在 FunctionCompute 的操控台页面检查函数调用日志

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

在 EventBridge 操控台检查事情轨道

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

总结

EventBridge 作为构建 EDA 架构的基础设施,经过一些中心概念和特性供给了灵敏丰厚的事情搜集、处理和路由的才能,并支撑经过 OpenAPI、terraform 等方法将这些才能方便快捷的带给用户。本文介绍了 EventBridge 和 IaC 的要点概念和特性,然后演示了怎么运用 IaC 理念主动化布置 EventBridge 来运用这些概念和特性。

等待大家能够开掘更多运用 EventBridge 快速建立 EDA 架构的 idea,并运用 terraform 快捷的将这些 idea 变为实际。

相关链接

[1] 阿里云 terraform 文档 help.aliyun.com/product/958…

[2] terraform registry 文档 registry.terraform.io/providers/a…

[3] 钉钉官方文档 open.dingtalk.com/document/gr…

想要了解更多 EventBridge 相关信息,扫描下方二维码参加钉钉群~

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

点击此处,即可观看文章对应的视频~ 发布云原生技能最新资讯、聚集云原生技能最全内容,定期举办云原生活动、直播,阿里产品及用户最佳实践发布。与你并肩探索云原生技能点滴,分享你需求的云原生内容。

重视【阿里巴巴云原生】大众号,获取更多云原生实时资讯!