第9章 Multicloud Object Gateway でのバケット通知
バケット通知により、バケットにイベントがある場合は常に通知を外部サーバーに送信できます。Multicloud Object Gateway (MCG) は、複数のバケットイベント通知タイプをサポートします。フローの作成、データダイジェストのトリガーなどのアクティビティーのバケット通知を受信できます。MCG は、通知設定で指定できる以下のイベントタイプをサポートします。
- s3:TestEvent
- s3:ObjectCreated:*
- s3:ObjectCreated:Put
- s3:ObjectCreated:Post
- s3:ObjectCreated:Copy
- s3:ObjectCreated:CompleteMultipartUpload
- s3:ObjectRemoved:*
- s3:ObjectRemoved:Delete
- s3:ObjectRemoved:DeleteMarkerCreated
- s3:LifecycleExpiration:*
- s3:LifecycleExpiration:Delete
- s3:LifecycleExpiration:DeleteMarkerCreated
- s3:ObjectRestore:*
- s3:ObjectRestore:Post
- s3:ObjectRestore:Completed
- s3:ObjectRestore:Delete
- s3:ObjectTagging:*
- s3:ObjectTagging:Put
- s3:ObjectTagging:Delete
9.1. Multicloud Object Gateway でのバケット通知の設定 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
設定する前に、以下のいずれかがあることを確認します。
Kafka クラスターがデプロイされている。
たとえば、AMQ Streams on OpenShift のスタートガイド を参照し、
AMQ/strimziを使用して Kafka をデプロイできます。HTTP(s) サーバーが接続されている。
たとえば、受信 HTTP 要求をログに記録するように HTTP サーバーをセットアップし、それらを以下のように
oc logsコマンドを使用して観察できます。$ cat http_logging_server.yaml apiVersion: v1 kind: List metadata: {} items: - apiVersion: apps/v1 kind: Deployment metadata: name: http-logger spec: replicas: 1 selector: matchLabels: app: http-logger template: metadata: labels: app: http-logger spec: containers: - name: http-logger image: registry.redhat.io/ubi9/python-39:latest command: - /bin/sh - -c - | set -e # Fail on any error mkdir -p /tmp/app pip install flask cat <<EOF > /tmp/app/server.py from flask import Flask, request app = Flask(__name__) @app.route("/", methods=["POST", "GET"]) def log_request(): body = request.get_data(as_text=True) print(body) # Simple one-line logging per request return "", 200 if __name__ == "__main__": app.run(host="0.0.0.0", port=8676, debug=True) EOF exec python /tmp/app/server.py ports: - containerPort: 8676 protocol: TCP securityContext: runAsNonRoot: true allowPrivilegeEscalation: false - apiVersion: v1 kind: Service metadata: name: http-logger labels: app: http-logger spec: selector: app: http-logger ports: - port: 8676 targetPort: 8676 protocol: TCP name: http $ oc create -f http_logging_server.yaml -n <http-server-namespace>
- サーバーが、通知の送信元となる MCG コア Pod からアクセスできることを確認してください。
MCG の認証情報を取得するようにしてください。
NOOBAA_ACCESS_KEY=$(oc extract secret/noobaa-admin -n openshift-storage --keys=AWS_ACCESS_KEY_ID --to=- 2>/dev/null); \ NOOBAA_SECRET_KEY=$(oc extract secret/noobaa-admin -n openshift-storage --keys=AWS_SECRET_ACCESS_KEY --to=- 2>/dev/null); \ S3_ENDPOINT=https://$(oc get route s3 -n openshift-storage -o json | jq -r ".spec.host") alias aws_alias='AWS_ACCESS_KEY_ID=$NOOBAA_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$NOOBAA_SECRET_KEY aws --endpoint $S3_ENDPOINT --no-verify-
手順
ローカルマシンで、
jsonファイル (例:connection.json) を使用して接続を記述します。Kafka の場合:
{ "name": "kafka_notif_conn_file" <-- any string "notification_protocol": "kafka", "metadata.broker.list": "<kafka-service-name>.<project>.svc.cluster.local:<kafka-service-port>", "topic": "my-topic",<-- refer to an existing KafkaTopic resource }metadata.broker.listの下の構造は<service-name>.<namespace>.svc.cluster.local:9092である必要があります。トピックは、namespace の既存のkafkatopicリソースの名前を参照する必要があります。HTTP(s) の場合:
{ "name": "http_notif_connection_config", "notification_protocol": "http", <-- or "https" "agent_request_object": { "host": "<http-service>.<http-server-namespace>.svc.cluster.local", "port": <http-server-port> } }追加オプション:
- request_options_object
- 値は、nodejs の http(s) 要求に渡される JSON です (オプション)。
nodejs の http(s) 要求オプションでサポートされる任意のフィールドを使用できます。以下に例を示します。
- 'path'
- URL パスを指定するために使用します。
- 'auth'
- http の簡易認証に使用します。'auth' の値の構文は <name>:<password> です。
openshift-storagenamespace のファイルからシークレットを作成します。$ oc create secret generic <connection-secret> --from-file=connect.json -n openshift-storage接続シークレットおよびオプションの CephFS RWX PVC を使用して、
openshift-storagenamespace のNooBaaCR を更新します。PVC が指定されていない場合、必要に応じて MCG が自動的に作成します。$ oc get pvc bn-pvc -n openshift-storage NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE bn-pvc Bound pvc-24683f8d-48e4-4c6b-b108-d507ca2f4fd1 25Gi RWX ocs-storagecluster-cephfs <unset> 25h$ oc patch noobaa noobaa --type='merge' -n openshift-storage -p '{ "spec": { "bucketNotifications": { "connections": [ { "name": <connection-secret>, "namespace": "openshift-storage" } ], "enabled": true, "pvc": "bn-pvc" <-- optional } } }'Important接続シークレットの名前は、namespace が異なる場合でもリスト内で一意である必要があります。
次の手順に進む前に、
noobaa-coreおよびnoobaa-endpointPod が再起動するまで待機します。S3 エイリアスで
noobaa-admin認証情報と S3 エンドポイントを使用して、MCG バケットでS3:PutBucketNotificationを使用します。$ aws_alias s3api put-bucket-notification --bucket first.bucket --notification-configuration '{ "TopicConfiguration": { "Id": "<notif_event_kafka>", <-- Unique string "Events": ["s3:ObjectCreated:*"], <-- a filter for events "Topic": "<connection-secret/connect.json>" } }'
検証手順
バケット通知の設定がバケットに設定されていることを確認します。
$ aws_alias s3api get-bucket-notification-configuration --bucket first.bucket { "TopicConfigurations": [ { "Id": "notif_event_kafka", "TopicArn": "kafka-connection-secret/connect.json", "Events": [ "s3:ObjectCreated:*" ] } ] }バケットにいくつかのオブジェクトを追加します。
echo 'a' | aws_alias s3 cp - s3://first.bucket/aしばらく待機してからトピックメッセージをクエリーし、予想される通知が送受信されたことを確認します。
以下に例を示します。
Kafka の場合
$ oc -n your-kafka-project rsh my-cluster-kafka-0 bin/kafka-console-consumer.sh \ --bootstrap-server my-cluster-kafka-bootstrap.myproject.svc.cluster.local:9092 \ --topic my-topic \ --from-beginning --timeout-ms 10000 | grep '^{.*}' | jq -c '.' | jqHTTP(s) の場合
$ oc logs deployment/http-logger -n <http-server-namespace> | grep '^{.*}' | jq出力
{ "Records": [ { "eventVersion": "2.3", "eventSource": "noobaa:s3", "eventTime": "2024-11-27T12:44:21.987Z", "s3": { "s3SchemaVersion": "1.0", "object": { "sequencer": 10, "key": "a", "eTag": "60b725f10c9c85c70d97880dfe8191b3" }, "bucket": { "name": "second.bucket", "ownerIdentity": { "principalId": "admin@noobaa.io" }, "arn": "arn:aws:s3:::first.bucket" } }, "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "noobaa" }, "requestParameters": { "sourceIPAddress": "100.64.0.3" }, "responseElements": { "x-amz-request-id": "m3zvo0cm-5239xd-bhj", "x-amz-id-2": "m3zvo0cm-5239xd-bhj" } } ] }