MinIO 对象 Lambda

MinIO 对象 Lambda

MinIO 的对象 Lambda 实现允许转换您的数据,以满足逐个应用程序的独特数据格式要求。例如,电子商务应用程序创建的数据集可能包含个人身份信息 (PII)。当相同的数据被处理用于分析时,PII 应该被编辑。但是,如果同一数据集用于营销活动,您可能需要使用其他详细信息来丰富数据,例如来自客户忠诚度数据库的信息。

MinIO 的 Object Lambda 使应用程序开发人员能够在将数据返回给应用程序之前处理从 MinIO 检索到的数据。您可以在 MinIO 上注册一个 Lambda 函数目标,一旦注册成功,它就可以用于按需转换应用程序 GET 请求的数据。

这篇文章重点展示了一个工作示例——如何将 Object Lambda 与 MinIO 结合使用,您必须先在您的环境中部署 MinIO,然后才能开始使用外部 lambda 函数。您还必须安装 Python 3.8 或更高版本,lambda 处理程序才能工作。

示例 Lambda 处理程序

安装必要的依赖项。

pip install flask requests

以下是一个示例 lambda 处理程序。

from flask import Flask, request, abort, make_responseimport requestsapp = Flask(__name__)@app.route('/', methods=['POST'])def get_webhook():
	if request.method == 'POST':
		# obtain the request event from the 'POST' call
		event = request.json
		object_context = event["getObjectContext"]
		# Get the presigned URL to fetch the requested
		# original object from MinIO
		s3_url = object_context["inputS3Url"]
		# Extract the route and request token from the input context
		request_route = object_context["outputRoute"]
		request_token = object_context["outputToken"]
		# Get the original S3 object using the presigned URL
		r = requests.get(s3_url)
		original_object = r.content.decode('utf-8')
		# Transform all text in the original object to uppercase
		# You can replace it with your custom code based on your use case
		transformed_object = original_object.upper()
		# Write object back to S3 Object Lambda
		# response sends the transformed data
		# back to MinIO and then to the user
		resp = make_response(transformed_object, 200)
		resp.headers['x-amz-request-route'] = request_route
		resp.headers['x-amz-request-token'] = request_token
		return resp
	else:
		abort(400)if __name__ == '__main__':
	app.run()

当您编写用于 MinIO 的 Lambda 函数时,该函数基于 MinIO 提供给 Lambda 函数的事件上下文。事件上下文提供有关正在发出的请求的信息。它包含具有相关上下文的参数。用于创建 Lambda 函数的字段如下:

的字段getObjectContext表示连接到 MinIO 的输入和输出详细信息。它有以下字段:

  • inputS3Url– Lambda 函数可用于下载原始对象的预签名 URL。通过使用预签名 URL,Lambda 函数不需要 MinIO 凭证来检索原始对象。这允许 Lambda 函数专注于对象的转换,而不是保护凭证。

  • outputRoute– 当 Lambda 函数返回转换后的对象时添加到响应标头的路由标记。MinIO 使用它来进一步验证传入响应的有效性。

  • outputToken– 当 Lambda 函数返回转换后的对象时,将令牌添加到响应标头。MinIO 使用它来验证传入响应的有效性。

让我们启动 lambda 处理程序。

python lambda_handler.py
 * Serving Flask app 'webhook'
 * Debug mode: offWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000Press CTRL+C to quit

使用 Lambda 目标启动 MinIO

使用 Lambda 函数注册 MinIO,我们将我们的目标名称称为function,但您可以将其称为您选择的任何其他友好名称。

MINIO_LAMBDA_WEBHOOK_ENABLE_function=on MINIO_LAMBDA_WEBHOOK_ENDPOINT_function=http://localhost:5000 minio server /data &......MinIO Object Storage ServerCopyright: 2015-2023 MinIO, Inc.License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>Version: DEVELOPMENT.2023-02-05T05-17-27Z (go1.19.4 linux/amd64)......Object Lambda ARNs: arn:minio:s3-object-lambda::function:webhook

带有授权令牌的 Lambda 目标

如果您的 lambda 目标需要授权令牌,那么您可以按如下方式为每个函数目标启用它

MINIO_LAMBDA_WEBHOOK_ENABLE_function=on MINIO_LAMBDA_WEBHOOK_ENDPOINT_function=http://localhost:5000 MINIO_LAMBDA_WEBHOOK_AUTH_TOKEN="mytoken" minio server /data &

具有 mTLS 身份验证的 Lambda 目标

如果您的 lambda 目标需要 mTLS 客户端,您可以按如下方式为每个函数目标启用它

MINIO_LAMBDA_WEBHOOK_ENABLE_function=on MINIO_LAMBDA_WEBHOOK_ENDPOINT_function=http://localhost:5000 MINIO_LAMBDA_WEBHOOK_CLIENT_CERT=client.crt MINIO_LAMBDA_WEBHOOK_CLIENT_KEY=client.key minio server /data &

创建一个桶并上传一些数据

创建一个名为functionbucket

mc alias set myminio/ http://localhost:9000 minioadmin minioadminmc mb myminio/functionbucket

testobject创建一个包含一些将被转换的测试数据的文件

cat > testobject << EOFMinIO is a High Performance Object Storage released under GNU Affero General Public License v3.0. It is API compatible with Amazon S3 cloud storage service. Use MinIO to build high performance infrastructure for machine learning, analytics and application data workloads.EOF

通过以下方式将此对象上传到存储桶mc cp

mc cp testobject myminio/functionbucket/

通过 PresignedGET 调用 Lambda 转换

以下示例显示了如何使用minio-go

package mainimport (
	"context"
	"log"
	"net/url"
	"time"
	"fmt"
	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials")func main() {
	s3Client, err := minio.New("localhost:9000", &minio.Options{
		Creds:  credentials.NewStaticV4("minioadmin", "minioadmin", ""),
		Secure: false,
	})
	if err != nil {
		log.Fatalln(err)
	}
	// Set lambda function target via `lambdaArn`
	reqParams := make(url.Values)
	reqParams.Set("lambdaArn", "arn:minio:s3-object-lambda::function:webhook")
	// Generate presigned GET url with lambda function
	presignedURL, err := s3Client.PresignedGetObject(context.Background(), "functionbucket", "testobject", time.Duration(1000)*time.Second, reqParams)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(presignedURL)}

使用预签名 URL viacurl接收转换后的对象。

~ curl -v $(go run presigned.go)......> GET /functionbucket/testobject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20230205%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230205T173023Z&X-Amz-Expires=1000&X-Amz-SignedHeaders=host&lambdaArn=arn%3Aminio%3As3-object-lambda%3A%3Atoupper%3Awebhook&X-Amz-Signature=d7e343f0da9d4fa2bc822c12ad2f54300ff16796a1edaa6d31f1313c8e94d5b2 HTTP/1.1> Host: localhost:9000> User-Agent: curl/7.81.0> Accept: */*>MINIO IS A HIGH PERFORMANCE OBJECT STORAGE RELEASED UNDER GNU AFFERO GENERAL PUBLIC LICENSE V3.0. IT IS API COMPATIBLE WITH AMAZON S3 CLOUD STORAGE SERVICE. USE MINIO TO BUILD HIGH PERFORMANCE INFRASTRUCTURE FOR MACHINE LEARNING, ANALYTICS AND APPLICATION DATA WORKLOADS.

概括

这一新功能对数据工程师、数据科学家和应用程序开发人员具有相当大的实用性。它扩展了 MinIO 中已经强大的 lambda 计算功能,并与 MinIO 的性能和可扩展性特征相结合,将创建许多不同的应用程序和工作负载用例。请随时在General Slack 频道

上提出任何问题,或在GitHub 页面上对此新功能   发表评论。


上一篇 下一篇