Object Storage-Ereignisse abonnieren

In diesem Lernprogramm wird das Abonnieren von Object Storage-Ereignissen über die IBM Cloud® Code Engine-Befehlszeilenschnittstelle erläutert.

In verteilten Umgebungen ist es oftmals erwünscht, dass Anwendungen oder Jobs auf Nachrichten (Ereignisse) reagieren, die von anderen, zumeist als Ereignisproduzenten bezeichneten Komponenten generiert werden. Mit Code Engine können Ihre Anwendungen und Jobs relevante Ereignisse empfangen, indem Ereignisproduzenten abonniert werden. Ereignisinformationen werden für Anwendungen als POST-HTTP-Anforderungen und für Jobs als Umgebungsvariablen empfangen.

Vorbereitende Schritte

Alle Code Engine-Benutzer müssen über ein nutzungsabhängiges Konto verfügen. Für Tutorien können Kosten anfallen. Verwenden Sie den Cost Estimator, um einen Kostenvoranschlag auf der Grundlage Ihrer voraussichtlichen Nutzung zu erstellen. Weitere Informationen finden Sie unter „ Code Engine-Preise “.

Object Storage-Bucket und -Region bestimmen

Der Object Storage-Ereignisproduzent generiert Ereignisse auf Grundlage von Operationen für Objekte in IBM Cloud Object Storage-Buckets.

  1. Installieren Sie die Befehlszeilenschnittstelle des Object Storage-Plug-ins.

    ibmcloud plugin install cloud-object-storage
    
  2. Erstellen Sie eine Object Storage-Ressourceninstanz. Erstellen Sie beispielsweise eine Object Storage-Ressource namens mycloud-object-storage, die den Lite-Serviceplan von IBM Cloud verwendet.

    ibmcloud resource service-instance-create mycloud-object-storage cloud-object-storage lite global
    
  3. Zeigen Sie die Details der Object Storage-Ressourceninstanz an, die Sie erstellt haben. Verwenden Sie die Details, um den Cloudressourcennamen (CRN) aus Ihrer Object Storage-Instanz abzurufen. Der Cloudressourcenname gibt an, welche Object Storage-Instanz verwendet werden soll. Der Cloudressourcenname ist der Wert des Feldes ID in der Ausgabe für den Befehl ibmcloud resource service-instance COS_INSTANCE_NAME.

    ibmcloud resource service-instance mycloud-object-storage
    

    Beispielausgabe

    Name:                  mycloud-object-storage
    ID:                    crn:v1:bluemix:public:cloud-object-storage:global:a/ab9d57f699655f028880abcd2ccdb524:910b727b-abcd-4a73-abcd-77c68bfeabcd::
    GUID:                  910b727b-abcd-4a73-abcd-77c68bfeabcd
    Location:              global
    Service Name:          cloud-object-storage
    Service Plan Name:     lite
    Resource Group Name:   Default
    State:                 active
    Type:                  service_instance
    Sub Type:
    Created at:            2020-10-14T19:09:22Z
    Created by:            user@us.ibm.com
    Updated at:            2020-10-14T19:09:22Z
    [...]
    

    Wenn Sie Ihren Object Storage-Instanznamen nicht kennen, führen Sie den Befehl ibmcloud resource service-instances --service-name cloud-object-storage aus, um eine Liste mit Object Storage-Instanzen anzuzeigen.

    Weitere Informationen zu Object Storage-Instanzen finden Sie unter Einführung in IBM Cloud Object Storage.

  4. Konfigurieren Sie Ihren Object Storage-CRN, den Sie im vorherigen Schritt ermittelt haben, um eine Object Storage-Instanz anzugeben, mit der gearbeitet werden soll. Achten Sie darauf, die vollständige ID ab crn: zu kopieren. In diesem Beispiel wird mit der Option --force die Verwendung des angegebenen Cloudressourcennamens durch die Konfiguration erzwungen; dies kann hilfreich sein, wenn mehrere Object Storage-Instanzen vorhanden sind.

    ibmcloud cos config crn --crn CRN --force
    

    Beispielausgabe

    Saving new Service Instance ID...
    OK
    Successfully stored your service instance ID.
    
  5. Bestimmen Sie ein Bucket, das abonniert werden soll. Um eine Liste der Buckets anzuzeigen, die Ihrer Object Storage-Instanz zugeordnet sind, gehen Sie wie folgt vor:

    ibmcloud cos buckets
    

    Geben Sie zum Erstellen eines Buckets Folgendes ein:

    ibmcloud cos bucket-create -bucket BUCKET_NAME
    
  6. Geben Sie den Standort und den Plan für das Object Storage-Bucket an. Verwenden Sie zum Beispiel das Bucket mybucket.

    ibmcloud cos bucket-location-get --bucket mybucket
    

    Beispielausgabe

    Details about bucket mybucket:
    Region: us-south
    Class: Standard
    

Ihr Object Storage-Bucket muss ein regionales Bucket sein, das sich in derselben Region wie Ihr Code Engine-Projekt befindet.

Code Engine die Rolle eines Benachrichtigungsmanagers zuweisen

Bevor Sie eine -Object StorageSubskription erstellen können, müssen Sie die Rolle 'Benachrichtigungsmanager' einem Code Engine-Projekt zuordnen. Als Benachrichtigungsmanager kann Code Engine Benachrichtigungen für ein Object Storage-Bucket anzeigen, ändern und löschen.

Nur Kontoadministratoren können die Rolle "Benachrichtigungsmanager" zuweisen.

  1. Ermitteln Sie das Code Engine-Projekt, das Sie verwenden möchten. Mit dem Befehl ibmcloud ce project list können Sie eine Liste von Projekten anzeigen. Mit dem Befehl ibmcloud ce project select können Sie Ihr Projekt als aktuellen Kontext auswählen. Geben Sie beispielsweise zur Auswahl eines Projekts namens myproject Folgendes ein:

    ibmcloud ce project select -n myproject
    
  2. Weisen Sie mit dem Befehl ibmcloud iam authorization-policy-create die Rolle 'Benachrichtigungsmanager' zu.

    Wenn Sie beispielsweise einem Projekt namens myproject für eine Object Storage-Instanz namens mycosinstance die Rolle 'Benachrichtigungsservice' zuweisen möchten, geben Sie Folgendes ein:

    ibmcloud iam authorization-policy-create codeengine cloud-object-storage "Notifications Manager" --source-service-instance-name PROJECT --target-service-instance-name COS-INSTANCE
    

    Nach dem Zuweisen der Rolle eines Benachrichtigungsmanagers zu Ihrem Projekt können Sie Object Storage-Abonnements für alle regionalen Buckets in der Object Storage-Instanz erstellen, die sich in derselben Region wie Ihr Projekt befinden.

    In der folgenden Tabelle sind die Optionen zusammengefasst, die mit dem Befehl iam authorization-policy-create in diesem Beispiel verwendet werden. Weitere Informationen zum Befehl und den zugehörigen Optionen finden Sie im Abschnitt über den Befehl ibmcloud iam authorization-policy-create.

    iam authorization-policy-create command components
    Befehlsoption Beschreibung
    codeengine Der Quellenservice, der für den Zugriff autorisiert werden kann.
    cloud-object-storage Der Zielservice, für den der Quellenservice die Zugriffsberechtigung erhalten kann.
    Notifications Manager Die Rollen, die dem Quellenservice den Zugriff ermöglichen.
    source-service-instance-name Der Name des codeengine-Projekts, für das Sie den Zugriff erteilen möchten.
    target-service-instance-name Der Name der cloud-object-storage-Instanz, auf die zugegriffen werden soll.
  3. Überprüfen Sie, ob die Rolle 'Benachrichtigungsmanager' festgelegt wurde.

    ibmcloud iam authorization-policies
    

    Beispielausgabe

    ID:                        abcd1234-a123-b456-bdd9-849e337c4460
    Source service name:       codeengine
    Source service instance:   1234abcd-b456-c789-a7c5-ef82e56fb24c
    Target service name:       cloud-object-storage
    Target service instance:   a1b2c3d4-cbad-567a-8cea-77c68bfe97c9
    Roles:                     Notifications Manager
    

App (oder Job) erstellen

Während Ereignisse verwendet werden können, um Apps oder Jobs auszulösen, verwendet dieses Lernprogramm eine App.

Erstellen Sie eine Anwendung mit dem Namen cos-app mit dem Befehl ibmcloud ce app create, indem Sie ein Image verwenden, das als cos-listen bezeichnet wird. Diese App protokolliert jedes Ereignis bei dessen Eingang. Dieses Bild wurde auf der Grundlage von „ cos-listen.go “ erstellt, das im Repository „Samples for IBM Cloud Code Engine “(GitHub ) verfügbar ist.

ibmcloud ce app create --name cos-app --image icr.io/codeengine/cos-listen

Führen Sie den Befehl ibmcloud ce application get --name cos-app aus, um sicherzustellen, dass die App den Bereitstatus (Ready) aufweist. Die Anwendung befindet sich im Bereitstatus, wenn die Statuszusammenfassung zeigt, dass die Anwendung erfolgreich bereitgestellt wurde.

Weitere Informationen zu dieser App finden Sie unter IBM Cloud Object Storage Readme-Datei.

Subskription erstellen

Wenn die App bereit ist, können Sie ein Object Storage-Abonnement erstellen, damit Sie Object Storage-Ereignisse empfangen können. Verwenden Sie dazu den Befehl ibmcloud ce sub cos create.

Erstellen Sie beispielsweise ein Object Storage-Abonnement mit dem Namen cos-sub. Dieses Abonnement leitet Bucketoperationen jeden Typs aus dem Bucket mybucket an eine Anwendung namens cos-app weiter.

ibmcloud ce sub cos create --name cos-sub --destination cos-app --bucket mybucket --event-type all

Führen Sie den Befehl ibmcloud ce sub cos get -n cos-sub aus, um Informationen zu Ihrer Subskription zu finden.

Beispielausgabe

Der Befehl ibmcloud ce sub cos get gibt standardmäßig zwei Teile zurück. Der erste Teil enthält Informationen zum Object Storage-Abonnement, wie den Namen des Abonnements, das Ziel, das Präfix, das Suffix und den Ereignistyp. Der zweite Teil enthält ressourcenbezogene Ereignisinformationen zu dem Object Storage-Abonnement, die zu Fehlerbehebungszwecken verwendet werden können. Die Ereignisinformationen sind nach ihrem Auftreten standardmäßig 1 Stunde lang verfügbar.

Getting COS event subscription 'cos-sub'...
OK
Name:          cos-sub
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           4m16s
Created:       2021-02-01T13:11:31-05:00
Destination:  App:cos-app
Bucket:       mybucket
EventType:    all
Ready:        true
Conditions:
    Type            OK    Age  Reason
    CosConfigured   true  38s
    Ready           true  38s
    ReadyForEvents  true  38s
    SinkProvided    true  38s
Events:
    Type    Reason          Age  Source                Messages
    Normal  CosSourceReady  39s  cossource-controller  CosSource is ready

Der Befehl subscription cos create überprüft standardmäßig zunächst, ob die Zielanwendung vorhanden ist. Schlägt die Zielprüfung fehl, weil der App-Name, den Sie angegeben haben, in Ihrem Projekt nicht vorhanden ist, gibt der Befehl subscription cos create einen Fehler zurück. Wenn Sie ein Abonnement erstellen möchten, ohne zuerst die Anwendung zu erstellen, verwenden Sie die Option --force. Bei Verwendung der Option --force umgeht der Befehl die Zielprüfung. Beachten Sie, dass das Feld Ready des Abonnements den Wert false anzeigt, bis die Ziel-App erstellt wird. Anschließend wird das Abonnement automatisch in den Status Ready: true versetzt.

Nach dem Erstellen des Abonnements und vor dem Melden von Ergebnissen durch den Befehl subscription cos create fragt der Befehl subscription cos create wiederholt den Status des Abonnements ab, um dessen Bereitschaft zu überprüfen. Diese kontinuierliche Statusabfrage dauert standardmäßig 15 Sekunden, bevor das Zeitlimit überschritten wird. Wenn der Abonnementstatus als Ready:true zurückgegeben wird, meldet er Erfolg, andernfalls meldet er einen Fehler. Sie können die Zeit ändern, die der Befehl subscription cos create wartet, bevor das Zeitlimit überschritten wird. Verwenden Sie dazu die Option --wait-timeout. Sie können die Statusabfrage auch umgehen, indem Sie die Option --no-wait auf false setzen.

Weitere Informationen zu Headern und Hauptteilen finden Sie in Informationen zu HTTP-Headern und -Hauptteilen für Ereignisse.

Dabei ist zu beachten, dass sich Abonnements auf die Skalierung einer Anwendung auswirken können. Weitere Informationen finden Sie im Abschnitt Anwendungsskalierung konfigurieren.

Abonnement testen

  1. Laden Sie eine .txt-Datei in Ihr Bucket hoch. Mit dem Befehl ibmcloud cos object-put können Sie beispielsweise das Objekt sample.txt mit dem Wert sample für --key in ein Bucket hochladen.

    ibmcloud cos object-put --bucket mybucket --key sample --body sample.txt
    
  2. Zeigen Sie das verarbeitete Ereignis mit dem Befehl ibmcloud ce app logs an.

    ibmcloud ce app logs --name cos-app
    

    Beispielausgabe

    Dieser Befehl gibt Protokolldateien mit Informationen zu dem Ereignis zurück, das an Ihre Ziel-App weitergeleitet wurde. Aus der folgenden Ausgabe geht hervor, dass eine Schreiboperation (Write) für das Objekt sample im Bucket namens mybucket ausgeführt wurde.

    Body: {"bucket":"mybucket","endpoint":"","key":"sample","notification":{"bucket_name":"mybucket","content_type":"text/plain","event_type":"Object:Write","format":"2.0","object_length":"1960","object_name":"sample","request_id":"103dd6f7-dd7b-4f49-86db-c2ff4b678b0a","request_time":"2021-02-11T16:57:42.373Z"},"operation":"Object:Write"}
    

Object Storage-Abonnement aktualisieren

Da Sie jetzt wissen, dass Ihr Object Storage-Abonnement erfolgreich erstellt wurde und das Object Storage-Abonnement zur Verarbeitung von Ereignissen bereitsteht, können Sie das Object Storage-Abonnement mit dem Befehl ibmcloud ce sub cos update aktualisieren. Sie können Ihr Abonnement beispielsweise so ändern, dass es nur ausgeführt wird, wenn bestimmte Operationen für eine Untergruppe von Objekten im Bucket auftreten.

  1. Aktualisieren Sie das Object Storage-Abonnement so, dass nur dann Ereignisse weitergeleitet werden, wenn delete-Operationen für Dateien mit dem Namenspräfix test ausgeführt werden.

    ibmcloud ce sub cos update --name cos-sub --event-type delete --prefix test
    
  2. Führen Sie den Befehl ibmcloud ce sub cos get aus, um Informationen zu Ihrem Abonnement abzurufen.

    ibmcloud ce sub cos get --name cos-sub
    

    Beispielausgabe

    Diese Ausgabe zeigt die aktualisierten Werte für Prefix und EventType.

    Getting COS event subscription 'cos-sub'...
    OK
    Name:          cos-sub
    ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:  myproject
    Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
    Age:           4m16s
    Created:       2021-02-01T13:11:31-05:00
    Destination:  App:cos-app
    Bucket:       mybucket
    EventType:    delete
    Prefix:       test
    Ready:        true
    Conditions:
        Type            OK    Age  Reason
        CosConfigured   true  24m
        Ready           true  24m
        ReadyForEvents  true  24m
        SinkProvided    true  24m
    Events:
        Type    Reason          Age               Source                Messages
        Normal  CosSourceReady  9s (x2 over 24m)  cossource-controller  CosSource is ready
    
  3. Löschen Sie ein Objekt mit dem Präfix test aus Ihrem Bucket. Löschen Sie beispielsweise eine Datei mit dem Namen (bzw. Schlüssel) test2.txt. Zum Löschen eines Objekts aus Ihrem Bucket können Sie den Befehl ibmcloud cos object-delete oder die Object Storage-Konsole verwenden.

  4. Zeigen Sie das verarbeitete Ereignis mit dem Befehl ibmcloud ce app logs an.

    ibmcloud ce app logs --name cos-app
    

    Beispielausgabe

    Dieser Befehl gibt Protokolldateien mit Informationen zu dem Ereignis zurück, das an Ihre Ziel-App weitergeleitet wurde. Aus der folgenden Ausgabe geht hervor, dass eine Schreiboperation (Delete) für das Objekt .txt im Bucket namens mybucket ausgeführt wurde.

    Body: {"bucket":"mybucket","endpoint":"",""key":"test2.txt","notification":{"bucket_name":"mybucket","event_type":"Object:Delete","format":"2.0","object_length":"41","object_name":"test2.txt","request_id":"c1099857-f1f3-4d74-9ac4-8d374582f77d","request_time":"2021-09-15T15:22:01.205Z"},"operation":"Object:Delete"}
    

Lernprogramm zur Bereinigung für Object Storage

Sind Sie bereit, Ihr Object Storage-Abonnement und Ihre App zu löschen? Hierzu können Sie die Befehle ibmcloud ce app delete und ibmcloud ce sub cos delete verwenden.

Zum Entfernen des Abonnements lautet der Befehl wie folgt:

ibmcloud ce sub cos delete --name cos-sub

Zum Entfernen der Anwendung lautet der Befehl wie folgt:

ibmcloud ce app delete --name cos-app

Sollen das Object Storage-Bucket und die Serviceinstanz gelöscht werden? Mit dem Befehl ibmcloud cos bucket-delete können Sie Ihr Bucket entfernen. Zum Entfernen Ihrer Object Storage-Serviceinstanz verwenden Sie den Befehl ibmcloud resource service-instance-delete.