事件驱动架构:使用 Flask 的 MinIO 事件通知 Webhook

MinIO 中的事件通知乍一看可能并不令人兴奋,但一旦你掌握了它们的力量,它们就会照亮存储桶中的动态。事件通知是成熟高效的对象存储系统的关键组成部分。Webhooks 是我个人最喜欢的与 MinIO 集成的工具。它们就像事件世界中的瑞士军刀,为各种挑战提供通用的解决方案。
MinIO 的用户友好界面提供了无缝服务集成,但本指南将深入探讨。我们将在 Python 中从头开始构建服务,使用它们的客户端凭据,以引导您了解 MinIO 集成的来龙去脉。
在我们的探索中,我们将重点关注使用 docker-compose 进行部署,这种方法提供了简化和高效的编排。这种方法将涉及为 MinIO 和 Flask 设置一个协调一致的环境,使它们能够无缝地交互。通过将 MinIO 服务与其相应的凭据和配置集成,我们的目标是创建一个系统化的工作流程,有效地演示管理和响应 MinIO 存储桶事件的实际应用。
一旦我们设置了客户端配置并定义了响应数据的结构,就像往常一样,真正的乐趣开始了。此演示将重点介绍几个关键方面,说明如何将您的 MinIO 客户端连接到 Flask 应用程序,在该应用程序中可以进一步处理事件通知数据。我们希望您在使用 MinIO 开发自己的事件驱动系统时感到自在,因此请利用我们提供的服务blog-assets/flask-webhook-event-notifications资源托管在MinIO 的 GitHub 页面上。
准备好沉浸在一个数据处理既是艺术又是科学的世界中,通过 MinIO 使其变得更简单。这是一个创新的机会,创造并彻底改变您的应用程序处理数据的方式。
MinIO 和集成服务
MinIO 集成到Kubernetes 生态系统,体现了其在各种云技术中的适应性。Webhooks 至关重要,它为开发人员提供了灵活地构建自定义集成,无论是为了管理跨不同云平台的数据还是为本地家庭实验室设置。
本指南超越了理论概念,为您提供了实用的可执行代码片段来构建您的集成。它邀请您探索在利用 MinIO 事件通知方面无限的创造力潜力。
为使用 Docker 的 Python 应用程序奠定基础
我们旅程的初始阶段致力于利用 Docker 容器化的力量来构建一个强大的 Python 应用程序环境。我们的方法以使用 Docker-compose 进行部署为中心,这种方法以其简单性和有效性而著称。此选择旨在满足各种开发人员的需求,优先考虑易用性和快速部署,同时确保高水平的功能。
利用 Docker-compose,我们创建了一个用户友好的、配置驱动的设置。这种环境非常适合那些寻求快速部署而又不牺牲项目功能深度的人。它提供了一条通往集成高级 webhook 功能和微调 MinIO 设置的直接途径,满足项目特定要求。
我们在设置此环境中采取的每一步都至关重要。这不仅是为了让服务正常运行;而是关于了解和利用组件来创建一个全面的系统。开发您自己的系统可以成为激发您创新的火花,增强您整体数据管理策略,并最终将您的原始数据转化为可操作的、有洞察力的信息。
部署 MinIO 和集成服务
使用 Docker-Compose 部署:Flask 应用程序和 MinIO
我们将首先设置一个 Python 应用程序及其环境。这包括使用 docker compose 部署 MinIO 和要集成的服务。为了使用 Flask 应用程序设置 MinIO,我们将使用 git
命令将 **minio/blog-assets** 存储库克隆到您的本地环境
git clone https://github.com/minio/blog-assets.git
cd flask-webhook-event-notifications
docker-compose up
这将从 GitHub 克隆minio/blog-assets 存储库,导航到/flask-webhook-event-notifications/ 目录,其中包含 **docker-compose.yaml** 文件,并启动 MinIO 和 Flask 服务。
目录结构
此 docker-compose 结构概述了两个服务及其各自的配置变量。出于可视化目的,我在此处提供了所需目录结构的树状视图
/flask-webhook-event-notifications
├── Dockerfile
├── app
│ └── main.py
└── docker-compose.yaml
在 MinIO 中设置 Webhooks
在 MinIO 中配置 webhook 可以通过多种方法完成,从使用用户界面到使用 mc
(MinIO 客户端实用程序),或者通过使用各种编程语言进行脚本化。
MinIO 支持用于事件通知的各种外部服务,包括:**AMQP (RabbitMQ)**、**MQTT**、**NATS**、**NSQ**、**Elasticsearch**、**Kafka**、**MySQL**、**PostgreSQL**、**Redis** 和 **webhook 服务**。
设置 MinIO 以利用这些事件通知涉及一系列定义明确的步骤,确保您的 MinIO 实例不仅捕获,而且有效地传达重要的事件数据,作为应用程序生态系统中的一个交互式、响应式部分。
了解 MinIO 事件通知的数据结构
来自 MinIO 的 S3 事件通知包括一个详细的 JSON 数据结构,对于全面理解和有效管理事件至关重要。以下是我列出的一些在事件数据中找到的值
- Key:存储桶中对象的唯一标识符。
- eTag:对象的版本标识符,用于完整性和版本控制。
- Size:对象的字节大小,指示其规模。
- Sequencer:确保事件按发生的精确顺序进行处理。
- ContentType:对象的媒体类型,指定如何处理或显示文件。
- UserMetadata:附加到对象的由用户定义的元数据,提供其他上下文。
- 存储桶详细信息:
- ARN (Amazon 资源名称):存储桶在 AWS 中的唯一标识符。
- Name:存储对象的存储桶的名称。
- OwnerIdentity:关于存储桶所有者的信息。
- s3SchemaVersion:指示使用的 S3 事件通知模式的版本。
- ConfigurationId:触发此事件的特定通知配置的标识符。
此结构对于Flask 应用程序特别有效,可以系统地记录、解析和分析与 MinIO 存储桶的交互。
设置 MinIO 以用于 Webhooks 和事件驱动操作
在部署上面概述的 **docker-compose.yaml** 后,继续使用 MinIO 客户端 mc
命令行实用程序。此设置包括在 MinIO 中创建一个别名,配置端点并设置存储桶通知。
我们将在 **“minio”** 容器的交互式终端内工作,我们可以通过运行单个命令来生成它
docker exec -it minio /bin/sh
从此 shell 中运行我们的 mc 命令的原因是,Docker **minio/minio** 映像已经安装了 mc
并可以使用。
进入容器的交互式终端后,使用 MinIO 客户端 (mc) 配置 MinIO 以用于事件通知的过程涉及以下关键步骤
- 设置 MinIO 别名:第一步涉及使用 MinIO 客户端 (mc) 为您的 MinIO 服务器创建一个别名。此别名是您 MinIO 服务器的快捷方式,允许您轻松地执行其他 mc 命令,而无需反复指定服务器的地址和访问凭据。此步骤简化了通过客户端管理您的 MinIO 服务器的过程。
mc alias set myminio http://localhost:9000 minio minio123
- 将 Webhook 端点添加到 MinIO:在 MinIO 中配置新的 webhook 服务端点。此设置是使用环境变量或运行时配置设置完成的,您可以在其中定义重要参数,例如端点 URL、可选的身份验证令牌以确保安全性,以及用于安全连接的客户端证书。
mc admin config set myminio notify_webhook:1 endpoint="http://flaskapp:5000/minio-event" queue_limit="10"
- 重新启动 MinIO 部署:配置完设置后,重新启动您的 MinIO 部署以确保更改生效。
mc admin service restart myminio
期待成功将重启命令发送到 myminio。键入 Ctrl-C 退出或等待以跟踪重启过程的状态……在 1 秒内成功重启 myminio
- 配置存储桶通知:下一步涉及使用 mc event add 命令。该命令用于添加新的存储桶通知事件,并将新配置的 Webhook 服务设置为这些通知的目标。
mc event add myminio/mybucket arn:minio:sqs::1:webhook --event put,get,delete
期待成功添加 arn:minio:sqs::1:webhook
- 列出存储桶订阅的事件:运行此命令以列出分配给 myminio/mybucket 的事件
minio mc event list myminio/mybucket
期待arn:minio:sqs::1:webhook s3:ObjectCreated:*,s3:ObjectAccessed:*,s3:ObjectRemoved:* 过滤器
- 列出存储桶分配的事件(以 JSON 格式):运行此命令以 JSON 格式列出分配给 myminio/mybucket 的事件:
minio mc event list myminio/mybucket arn:minio:sqs::1:webhook --json
预期:{ "status": "success", "id": "", "event": ["s3:ObjectCreated:*","s3:ObjectAccessed:*", "s3:ObjectRemoved:*"], "prefix": "", "suffix": "", "arn": "arn:minio:sqs::1:webhook"}
Flask 接收的事件通知数据的结构
根据您正在构建的服务或集成,您可能需要从 Flask 应用程序中识别 event_data,这需要您对事件提供的数据有充分的了解。
{
"s3": {
"bucket": {
"arn": "arn:aws:s3:::mybucket",
"name": "mybucket",
"ownerIdentity": {
"principalId": "minio"
}
},
"object": {
"key": "cmd.md",
"eTag": "d8e8fca2dc0f896fd7cb4cb0031ba249",
"size": 5,
"sequencer": "17A9AB4FA93B35D8",
"contentType": "text/markdown",
"userMetadata": {
"content-type": "text/markdown"
}
},
"configurationId": "Config",
"s3SchemaVersion": "1.0"
},
"source": {
"host": "127.0.0.1",
"port": "",
"userAgent": "MinIO (linux; arm64) minio-go/v7.0.66 mc/RELEASE.2024-01-11T05-49-32Z"
},
"awsRegion": "",
"eventName": "s3:ObjectCreated:Put",
"eventTime": "2024-01-12T17:58:12.569Z",
"eventSource": "minio:s3",
"eventVersion": "2.0",
"userIdentity": {
"principalId": "minio"
},
"responseElements": {
"x-amz-id-2": "dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8",
"x-amz-request-id": "17A9AB4FA9328C8F",
"x-minio-deployment-id": "c3642fb7-ab2a-44a0-96cb-246bf4d18e84",
"x-minio-origin-endpoint": "http://172.18.0.3:9000"
},
"requestParameters": {
"region": "",
"principalId": "minio",
"sourceIPAddress": "127.0.0.1"
}
}
通过遵循这些步骤,您可以有效地利用 MinIO 事件通知,显著地自动化数据工作流程。有关更详细的指南和信息,请参阅 MinIO 文档中的 存储桶通知 和 监控存储桶和对象事件。
如果您有兴趣设置带有 PostgreSQL 的 MinIO,请查看 使用 MinIO 和 PostgreSQL 简化数据事件,我在其中介绍了 MinIO 对数据事件的广泛配置和管理。这些配置范围从使用MinIO 控制台提供用户友好的图形界面,到使用mc
命令行工具进行更详细的可脚本化设置。博客文章进一步阐述了对该主题的理解,强调了在 MinIO UI 中正确配置 PostgreSQL 的重要性以及更改生效时重新启动 MinIO 服务器的重要性。
开发使用 Flask 接收事件通知的 Webhook
在我们的环境部署完成后,我们现在将重点转移到将 MinIO 与 Python 集成,这是我们数据处理系统的一个关键方面。这种集成对于创建连贯的生态系统至关重要,MinIO 可以与 Flask 无缝协作。
导入必要的包
在我们的演示代码中,我们精心选择了 Python 导入,以确保应用程序的功能符合其预期目的。flask
包创建了 Web 服务器基础设施,定义了用于处理传入 HTTP 请求的端点。然后,应用程序可以被编码为以任何期望的方式处理 MinIO 事件通知。
from flask import Flask, jsonify, request
这些导入共同构成了应用程序的基础,使它能够接收和处理 MinIO 事件通知。
Python 中的 Flask 应用程序和事件处理端点
实例化一个 Flask 应用程序,并设置一个端点来处理路由 /minio-event
上的 POST 请求。Flask 是 Python 中的一个微型 Web 框架,非常适合设置 Web 应用程序和 API 端点。
app = Flask(__name__)
@app.route('/minio-event', methods=['POST'])
def handle_minio_event():
event_data = request.json
app.logger.info(f"Received MinIO event: {event_data}")
return jsonify(event_data), 200
Flask 应用程序中的 handle_minio_event
函数处理包含 MinIO 事件数据的 POST 请求,并返回从 MinIO 事件通知接收的 event_data
。
这种方法促进了对存储事件的实时处理和响应,使 MinIO 存储系统和 Flask 应用程序之间能够进行动态交互。
通过 Python 脚本将服务与 MinIO 存储桶事件集成
这篇博客文章使用 Docker 环境中的 MinIO 和 Python 来演示 MinIO 存储桶事件通知的强大功能和灵活性,并展示了一种创建可扩展、高效的事件驱动应用程序的战略方法。
Docker 及其容器化技术的使用,突出了使 MinIO 和 Flask 等组件能够独立运行,同时又保持协作的能力。当然,这种容器化的云原生设置最大程度地减少了冲突和依赖关系,突出了 Docker 和 Docker 容器在现代软件架构中的重要性。
在对 MinIO Webhook 事件通知进行探索的最后,我确信动态编程语言和 MinIO 的强大功能之间的协同作用,提供了一个无与伦比的工具包。这种组合为应用程序开发提供了无限的机会。它使我们不仅能够创新和简化,还能够以非凡的效率和适应性扩展我们的能力。
本指南展示了使用 Python 进行 API 开发的简单性和有效性,为持续创新和满足不断变化的需求奠定了坚实的基础。它强调了适应性对于数据管理和应用程序开发的持续发展至关重要。这种方法不仅仅是一种方法,而是一条通往未来科技的道路。