MinIO 的对象 Lambda 实现允许您根据应用程序的独特数据格式要求对数据进行转换。例如,由电子商务应用程序创建的数据集可能包含个人身份信息 (PII)。当对同一数据进行分析处理时,应删除 PII。但是,如果将同一数据集用于营销活动,您可能需要使用其他详细信息(例如客户忠诚度数据库中的信息)来丰富数据。
MinIO 的对象 Lambda 使应用程序开发人员能够在将数据返回给应用程序之前处理从 MinIO 检索到的数据。您可以在 MinIO 上注册 Lambda 函数目标,成功注册后,可以用来根据需要为应用程序 GET 请求转换数据。
本文重点介绍一个工作示例 - 如何将对象 Lambda 与 MinIO 结合使用,您必须 在您的环境中部署 MinIO 才能开始使用外部 lambda 函数。您还必须安装 Python 3.8 或更高版本才能使 lambda 处理程序正常工作。
示例 Lambda 处理程序
安装必要的依赖项。
pip install flask requests
以下是一个示例 lambda 处理程序。
from flask import Flask, request, abort, make_response
import requests
app = 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: off
WARNING: 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:5000
Press CTRL+C to quit
使用 Lambda 目标启动 MinIO
将 MinIO 注册到 Lambda 函数,我们将目标名称称为 function
,但您可以根据自己的需要调用它。
MINIO_LAMBDA_WEBHOOK_ENABLE_function=on MINIO_LAMBDA_WEBHOOK_ENDPOINT_function=http://localhost:5000 minio server /data &
...
...
MinIO Object Storage Server
Copyright: 2015-2023 MinIO, Inc.
License: GNU AGPLv3 <https://gnu.ac.cn/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 minioadmin
mc mb myminio/functionbucket
创建一个包含一些将要转换的测试数据的文件 testobject
cat > testobject << EOF
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.
EOF
通过 mc cp
将此对象上传到存储桶。
mc cp testobject myminio/functionbucket/
以下示例显示了如何使用 minio-go
package main
import (
"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)
}
通过 curl
使用预签名 URL 接收转换后的对象。
~ 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 的性能和可扩展性特征相结合,将创造许多不同的应用程序和工作负载用例。
如果您有任何问题,请随时在 通用 Slack 频道 中提问,或在 GitHub 页面 上评论此新功能。