乐趣区

关于云原生:EventBridge-特性介绍|以-IaC-的方式使用-EventBridge

作者:王川(弗丁)

引言

EventBridge 作为构建 EDA 架构的基础设施,通过一些外围概念和个性提供了灵便丰盛的事件收集、解决和路由的能力。对于不少用户来说,通过控制台里的便捷的疏导来应用 EventBridge 应该是最快的上手形式。此外,也有很多用户面临着大量的云产品的治理,应用控制台治理每一个资源的形式变成了惨重的手工操作累赘。

为了解决这个问题,当初曾经可能通过 OpenAPI、terraform 等形式将 EventBridge 的能力方便快捷的带给用户。本文将重点介绍 EventBridge 和 IaC 的重点概念和个性,而后演示如何利用 IaC 理念自动化部署 EventBridge 来应用这些概念和个性。

EventBridge 概述

事件驱动架构

事件驱动架构是一种松耦合、分布式的驱动架构,收集到某利用产生的事件后实时对事件采取必要的解决,紧接着路由至上游零碎,无需期待零碎响应。应用事件总线 EventBridge 能够构建各种简略或简单的事件驱动架构,以标准化的 CloudEvents 1.0 协定连贯云产品和利用、利用和利用等。

事件驱动架构体系架构具备以下三个能力:
事件收集 :负责收集各种利用产生的事件,如新建订单,退换货订单等其余状态变更;
事件处理 :对事件进行脱敏解决,并对事件进行初步的过滤和筛选;
事件路由:剖析事件内容并将事件路由散发至上游产品。

事件驱动架构具备以下劣势:

• 升高耦合 :升高事件生产者和订阅者的耦合性。事件生产者只需关注事件的产生,无需关注事件如何解决以及被分发给哪些订阅者;任何一个环节呈现故障,都不会影响其余业务失常运行;
异步执行 :事件驱动架构实用于异步场景,即使是需要高峰期,收集各种起源的事件后保留在事件总线中,而后逐渐散发传递事件,不会造成零碎拥塞或资源过剩的状况;
可扩展性: 事件驱动架构中路由和过滤能力反对划分服务,便于扩大和路由散发;
敏捷性: 事件驱动架构反对与各种阿里云产品和利用集成,反对事件路由至任何零碎服务,提供各种麻利高效的部署计划。

应用 EventBridge 构建 EDA 架构

事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务。EventBridge 提供的几个外围概念,能够满足构建 EDA 架构的须要。

事件总线 EventBridge 反对以下事件源:

**• 阿里云官网事件源
• 自定义事件源 **

事件总线 EventBridge 的事件总线包含以下类型:

云服务专用事件总线 :一个无需创立且不可批改的内置事件总线,用于接管您的阿里云官网事件源的事件;阿里云官网事件源的事件只能公布到云服务专用总线;
自定义事件总线:须要您自行创立并治理的事件总线,用于接管自定义利用或存量音讯数据的事件;自定义利用或存量音讯数据的事件只能公布到自定义总线。

在 EventBridge 中,一个事件规定蕴含以下内容:
• 事件模式:用于过滤事件并将事件路由到事件指标;
• 事件指标:包含事件的转换和解决,负责生产事件。

EventBridge 提供了简洁的事件模式匹配语法,同时具备灵便的事件转换能力,前面将会通过演示来展现一些具体的例子。

此外,EventBridge 还提供了一些加强能力,这些能力使得 EDA 架构中流经的事件更加通明,具备了开箱即用的观测和剖析能力:

• 事件追踪:能够查看公布到事件总线 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 工具,能够参见 https://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

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

钉钉上收到音讯告诉

在 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

在控制台模仿自定义事件源公布事件

在 FunctionCompute 的控制台页面查看函数调用日志

在 EventBridge 控制台查看事件轨迹

总结

EventBridge 作为构建 EDA 架构的基础设施,通过一些外围概念和个性提供了灵便丰盛的事件收集、解决和路由的能力,并反对通过 OpenAPI、terraform 等形式将这些能力方便快捷的带给用户。本文介绍了 EventBridge 和 IaC 的重点概念和个性,而后演示了如何利用 IaC 理念自动化部署 EventBridge 来应用这些概念和个性。

期待大家能够挖掘更多利用 EventBridge 疾速搭建 EDA 架构的 idea,并应用 terraform 快捷的将这些 idea 变为事实。

相干链接

[1] 阿里云 terraform 文档
https://help.aliyun.com/produ…

[2] terraform registry 文档
https://registry.terraform.io…

[3] 钉钉官网文档
https://open.dingtalk.com/doc…

想要理解更多 EventBridge 相干信息,扫描下方二维码退出钉钉群~

点击此处,即可观看文章对应的视频~

退出移动版