paint-brush
使用 MinIO 和 Python 创建可扩展且高效的事件驱动应用程序经过@minio
3,803 讀數
3,803 讀數

使用 MinIO 和 Python 创建可扩展且高效的事件驱动应用程序

经过 MinIO10m2024/04/25
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

MinIO 中的事件通知一开始可能看起来并不令人兴奋,但一旦你利用了它们的功能,它们就会照亮你的存储桶内的动态。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 使用 MinIO 和 Python 创建可扩展且高效的事件驱动应用程序
MinIO HackerNoon profile picture


MinIO 中的事件通知乍一看可能并不令人兴奋,但一旦您利用了它们的强大功能,它们就会照亮您的存储桶内的动态。事件通知是成熟、高效的对象存储系统的关键组件。Webhook 是我个人最喜欢的与 MinIO 集成的工具。它们就像事件世界中的瑞士军刀,为各种挑战提供了通用解决方案。


MinIO 的用户友好型用户界面提供无缝服务整合,但我们将在本指南中更深入地介绍。我们将使用 Python 从头开始构建服务,使用其客户端凭据,引导您完成 MinIO 集成的细节。


在我们的探索中,我们将专注于使用 docker-compose 进行部署,这是一种提供简化和高效编排的方法。这种方法将涉及为 MinIO 和 Flask 设置一个有凝聚力的环境,使它们能够无缝交互。通过将 MinIO 服务与其适当的凭据和配置集成,我们旨在创建一个系统的工作流程,有效地展示管理和响应 MinIO 存储桶事件的实际应用。


一旦我们设置了客户端配置并定义了响应数据的结构,真正的乐趣就开始了。此演示将重点介绍如何将 MinIO 客户端连接到 Flask 应用程序的几个关键方面,在该应用程序中可以进一步处理事件通知数据。我们希望您能够轻松地使用 MinIO 开发自己的事件驱动系统,因此请利用我们在博客资产/flask-webhook-事件通知资源托管于MinIO 的 GitHub 页面


准备好进入一个数据处理既是一门艺术又是一门科学的世界,MinIO 让数据处理变得更简单。这是一个创新、创造和彻底改变您的应用程序处理数据方式的机会。

MinIO 和集成服务

MinIO 与Kubernetes 生态系统体现了其在各种云技术中的适应性。Webhook 是关键,它为开发人员提供了灵活地制定自定义集成的能力,无论是用于管理跨不同云平台的数据还是用于本地家庭实验室设置。


本指南超越了理论概念,为您提供了实用的可执行代码片段来构建您的集成。它邀请您探索利用 MinIO 事件通知的无限创造力潜力。

使用 Docker 为 Python 应用程序奠定基础

我们旅程的初始阶段致力于利用 Docker 容器化的强大功能来构建强大的 Python 应用程序环境。我们的方法以使用 Docker-compose 进行部署为中心,这种方法因其简单性和有效性而被选中。这一选择旨在满足广泛的开发人员的需求,优先考虑易用性和快速部署,同时确保高水平的功能。


利用 Docker-compose,我们创建了一个用户友好的、配置驱动的设置。此环境非常适合那些寻求快速部署而不牺牲项目功能深度的人。它提供了一条直接的途径来集成高级 webhook 功能和微调 MinIO 设置,以满足您项目的特定要求。


我们在设置此环境时采取的每个步骤都至关重要。这不仅仅是让服务启动并运行;而是要理解和利用组件来创建一个全面的系统。开发自己的系统可以成为点燃您创新的火花,增强您的整体数据管理策略,并最终将您的原始数据转化为可操作、有见地的信息。

部署 MinIO 和集成服务

使用 Docker-Compose 进行部署:Flask App 和 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


这将克隆minio/博客资产GitHub 中的存储库,导航至/flask-webhook-事件通知/包含目录docker-compose.yaml文件,并启动MinIO和Flask服务。

目录结构

此 docker-compose 结构概述了两个服务及其各自的配置变量。为了便于可视化,我在此处提供了所需目录结构的树形视图:


 /flask-webhook-event-notifications ├── Dockerfile ├── app │ └── main.py └── docker-compose.yaml

在 MinIO 中设置 Webhook

在 MinIO 中配置 webhook 可以通过多种方法完成,包括使用用户界面、使用mc (MinIO 客户端实用程序)或通过使用各种编程语言编写脚本。


MinIO 支持用于事件通知的各种外部服务,包括: AMQP(RabbitMQ)MQTTNATSNSQElasticsearchKafkaMySQLPostgreSQLRedis 、以及webhook服务


设置 MinIO 以利用这些事件通知涉及一系列明确定义的步骤,确保您的 MinIO 实例不仅可以捕获重要事件数据,还可以作为应用程序生态系统中交互式、响应式的部分有效地传达重要事件数据。

理解 MinIO 事件通知的数据结构

MinIO 的 S3 事件通知包括JSON数据结构详解这对于全面了解和有效管理事件至关重要。下面我列出了从事件数据中发现的一些值:


  • 钥匙:Bucket 中对象的唯一标识符。


  • 电子标签:用于完整性和版本控制的对象的版本标识符。


  • 尺寸:对象的大小(以字节为单位),表明其比例。


  • 序列发生器:确保事件按照发生的准确顺序进行处理。


  • 内容类型:对象的媒体类型,指定如何处理或显示文件。


  • 用户元数据:附加到对象的用户定义元数据,提供额外的上下文。


  • 铲斗详细信息

    • ARN(Amazon 资源名称) :AWS 中存储桶的唯一标识符。

    • 姓名:存储对象的Bucket名称。

    • 所有者身份:Bucket 拥有者的信息。


  • s3Schema版本:表示使用的 S3 事件通知架构的版本。


  • 配置ID :触发此事件的特定通知配置的标识符。


这种结构对于Flask 应用,实现与 MinIO bucket 交互的系统日志记录、解析和分析。

为 Webhook 和事件驱动操作设置 MinIO

部署上述docker-compose.yaml后,继续使用 MinIO 客户端mc命令行实用程序。此设置包括在 MinIO 中创建别名、配置端点和设置存储桶通知。


我们将在“minio”容器的交互式终端内工作,我们可以通过运行单个命令来生成它:


docker exec -it minio /bin/sh


从这个 shell 内部运行 mc 命令的原因是 Docker minio/minio镜像已经安装了mc并且准备就绪。


进入容器的交互式终端后,使用 MinIO 客户端(mc)配置 MinIO 以进行事件通知的过程涉及以下关键步骤:


  1. 设置 MinIO 别名:第一步是使用 MinIO 客户端 (mc) 为您的 MinIO 服务器创建别名。此别名是您的 MinIO 服务器的快捷方式,允许您轻松执行进一步的 mc 命令,而无需重复指定服务器的地址和访问凭据。此步骤简化了通过客户端管理 MinIO 服务器的过程。

    mc alias set myminio http://localhost:9000 minio minio123

  2. 将 Webhook 端点添加到 MinIO :在 MinIO 中配置新的 webhook 服务端点。此设置使用环境变量或运行时配置设置完成,您可以在其中定义重要参数,例如端点 URL、用于安全性的可选身份验证令牌以及用于安全连接的客户端证书。

    mc admin config set myminio notify_webhook:1 endpoint="http://flaskapp:5000/minio-event" queue_limit="10"


  3. 重新启动 MinIO 部署:配置设置后,重新启动 MinIO 部署以确保更改生效。

    mc admin service restart myminio

    预计:

    Restart command successfully sent to myminio. Type Ctrl-C to quit or wait to follow the status of the restart process....Restarted myminio successfully in 1 seconds


  4. 配置存储桶通知:下一步是使用 mc event add 命令。此命令用于添加新的存储桶通知事件,将新配置的 Webhook 服务设置为这些通知的目标。

    mc event add myminio/mybucket arn:minio:sqs::1:webhook --event put,get,delete

    预计:

    Successfully added arn:minio:sqs::1:webhook


  5. 列出存储桶订阅的事件:运行此命令列出分配给 myminio/mybucket 的事件:

    minio mc event list myminio/mybucket

    预计:

    arn:minio:sqs::1:webhook s3:ObjectCreated:*,s3:ObjectAccessed:*,s3:ObjectRemoved:* Filter:


  6. 列出存储桶分配的事件(以 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以确保应用程序的功能符合其预期用途。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 Bucket 事件集成

这篇博文在 Docker 环境中使用 MinIO 和 Python 来展示 MinIO 存储桶事件通知的强大功能和灵活性,并展示了创建可扩展、高效的事件驱动应用程序的战略方法。


Docker 及其容器化技术的使用脱颖而出,使 MinIO 和 Flask 等组件能够独立但有凝聚力地工作。当然,这种容器化的云原生设置最大限度地减少了冲突和依赖,凸显了 Docker 和 Docker 容器在现代软件架构中的重要性。


在对 MinIO webhook 事件通知的探索中,我坚信动态编程语言与 MinIO 强大功能的协同作用将带来无与伦比的工具包。这种组合为应用程序开发铺平了无限的机会。它不仅使我们能够创新和简化,而且还能够以卓越的效率和适应性扩展我们的能力。


本指南展示了使用 Python 进行 API 开发的简单性和有效性,为持续创新和满足不断变化的需求奠定了坚实的基础。它强调了适应性,这对于数据管理和应用程序开发的发展至关重要。这种方法不仅仅是一种方法论;它是一条确保我们的技术努力面向未来的途径。