第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-

手順

  1. ローカルマシンで、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> です。
  2. openshift-storage namespace のファイルからシークレットを作成します。

    $ oc create secret generic <connection-secret> --from-file=connect.json -n openshift-storage
  3. 接続シークレットおよびオプションの CephFS RWX PVC を使用して、openshift-storage namespace の NooBaa CR を更新します。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-endpoint Pod が再起動するまで待機します。

  4. 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>"
      }
    }'

検証手順

  1. バケット通知の設定がバケットに設定されていることを確認します。

    $ aws_alias s3api get-bucket-notification-configuration --bucket first.bucket
    {
        "TopicConfigurations": [
            {
                "Id": "notif_event_kafka",
                "TopicArn": "kafka-connection-secret/connect.json",
                "Events": [
                    "s3:ObjectCreated:*"
                ]
            }
        ]
    }
  2. バケットにいくつかのオブジェクトを追加します。

    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 '.' | jq

    HTTP(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"
          }
        }
      ]
    }
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る