做cra需要关注的网站,太原建站方法,网站站内搜索代码,青岛网站建设兼职简介#xff1a;本文将重点介绍 EventBridge 和 IaC 的重点概念和特性#xff0c;然后演示如何应用 IaC 理念自动化部署 EventBridge 来使用这些概念和特性。
作者#xff1a;王川#xff08;弗丁#xff09;
引言
EventBridge 作为构建 EDA 架构的基础设施#xff0c…简介本文将重点介绍 EventBridge 和 IaC 的重点概念和特性然后演示如何应用 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 做了很全面的支持使得跨多云部署基础设施变得极其简单。既然是 IaCterraform 提供了自己的语言 HCLhashicorp configuration languageHCL 具有类似 json 的简洁的语法通过声明式的资源描述可以让开发者快速上手。
动手实践
准备工作
安装 terraform cli 工具可以参见 Terraform CLI Documentation | Terraform by HashiCorp 的内容。创建一个 tf 文件 terraform.tf内容如下需要替换内的值
provider alicloud {access_key your access keysecret_key your secret keyregion 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 defaultrule_name audit_notifydescription demo# 通过后缀匹配的方式过滤来自所有云产品事件源的ActionTrail:ApiCall事件# 其他更多模式匹配的介绍可以查阅文档https://help.aliyun.com/document_detail/181432.htmlfilter_pattern jsonencode({type : [{suffix : :ActionTrail:ApiCall}]})targets {target_id test-targetendpoint your dingtalk bot webhook url# type的取值可以查阅文档https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/event_bridge_rule#typetype acs.dingtalk# 每个事件目标都有一组对应的param_list具体可以查阅文档https://help.aliyun.com/document_detail/185887.html# 每一个param的form关系到事件转换的配置可以查阅文档https://help.aliyun.com/document_detail/181429.htmlparam_list {resource_key URLform CONSTANTvalue your dingtalk bot webhook url}param_list {resource_key SecretKeyform CONSTANTvalue your dingtalk bot secret key}# 这里展示了TEMPLATE类型的事件转换描述# value是使用jsonpath引用事件内容的字典template则是模板内容EventBridge最终会根据这两者结合事件本身渲染出这个参数的值param_list {resource_key Bodyform TEMPLATEvalue jsonencode({source: $.source,type: $.typeregion: $.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 loggingdef 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_busdescription 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_nameevent_source_name demo_event_sourcedescription demolinked_external_source false
}# 声明一个叫fc_service的函数计算服务publishtrue意味着会立即部署上传的函数代码。
resource alicloud_fc_service fc_service {name eb-fc-servicedescription demopublish true
}# 将前面准备的python脚本文件打包成zip用于部署到函数计算
data archive_file code {type zipsource_file ${path.module}/src/index.pyoutput_path ${path.module}/code.zip
}# 声明一个fc_service服务中的函数其中filename引用了上面描述的zip包会将这个代码包上传。
resource alicloud_fc_function fc_function {service alicloud_fc_service.fc_service.namename eb-fc-functiondescription demofilename data.archive_file.code.output_pathmemory_size 128runtime python3handler 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_namerule_name demo_ruledescription 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#typetype acs.fc.functionendpoint 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 serviceNameform CONSTANTvalue alicloud_fc_service.fc_service.name}param_list {resource_key functionNameform CONSTANTvalue alicloud_fc_function.fc_function.name}param_list {resource_key Qualifierform CONSTANTvalue LATEST}# 注意formORIGINAL意味着每次投递事件都会将事件的原始内容作为这个参数的值param_list {resource_key Bodyform ORIGINAL}}
}
在命令行窗口依次执行命令
初始化 terraform init预览变更 terraform plan应用变更 terraform apply在控制台模拟自定义事件源发布事件 在 FunctionCompute 的控制台页面查看函数调用日志 在 EventBridge 控制台查看事件轨迹 总结
EventBridge 作为构建 EDA 架构的基础设施通过一些核心概念和特性提供了灵活丰富的事件收集、处理和路由的能力并支持通过 OpenAPI、terraform 等方式将这些能力方便快捷的带给用户。本文介绍了 EventBridge 和 IaC 的重点概念和特性然后演示了如何应用 IaC 理念自动化部署 EventBridge 来使用这些概念和特性。
期待大家可以发掘更多利用 EventBridge 快速搭建 EDA 架构的 idea并使用 terraform 快捷的将这些 idea 变为现实。
相关链接
[1] 阿里云 terraform 文档
Terraform - 帮助中心 - 阿里云
[2] terraform registry 文档
Terraform Registry
[3] 钉钉官方文档
自定义机器人接入 - 钉钉开放平台
原文链接
本文为阿里云原创内容未经允许不得转载。