Suscripción a sucesos de Object Storage

Con esta guía de aprendizaje, va a aprender a suscribirse a sucesos de Object Storage utilizando la CLI de IBM Cloud® Code Engine.

En entornos distribuidos, a menudo deseará que las aplicaciones o trabajos reaccionen a los mensajes (sucesos) que se generan en otros componentes, normalmente llamados generadores de sucesos. Con Code Engine, las aplicaciones o los trabajos pueden recibir sucesos de interés suscribiéndose a productores de sucesos. La información de sucesos se recibe como solicitudes POST HTTP para aplicaciones y como variables de entorno para trabajos.

Antes de empezar

Todos los usuarios de Code Engine están obligados a tener una cuenta de pago por uso. Las guías de aprendizaje pueden incurrir en costes. Utilice el Estimador de costes para generar una estimación de costes basada en el uso previsto. Para obtener más información, consulta los precios de « Code Engine ».

Determinación del grupo y región de Object Storage

El generador de sucesos de Object Storage genera sucesos en función de las operaciones en los objetos de los grupos de IBM Cloud Object Storage.

  1. Instale la CLI del plugin de Object Storage.

    ibmcloud plugin install cloud-object-storage
    
  2. Cree una instancia recurso de Object Storage. Por ejemplo, cree un recurso de Object Storage llamado mycloud-object-storage que utilice el plan de servicio IBM Cloud Lite.

    ibmcloud resource service-instance-create mycloud-object-storage cloud-object-storage lite global
    
  3. Visualice los detalles de instancia de recurso de Object Storage que ha creado. Utilice los detalles para obtener el CRN (Cloud Resource Name) de la instancia de Object Storage . El CRN identifica qué instancia de Object Storage desea utilizar. El CRN es el valor del campo ID en la salida del mandato ibmcloud resource service-instance COS_INSTANCE_NAME.

    ibmcloud resource service-instance mycloud-object-storage
    

    Salida de ejemplo

    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
    [...]
    

    Si no sabe el nombre de su instancia de Object Storage, ejecute ibmcloud resource service-instances --service-name cloud-object-storage para ver una lista de instancias de Object Storage.

    Para obtener más información sobre las instancias de Object Storage, consulte Cómo empezar con IBM Cloud Object Storage.

  4. Configure el CRN de Object Storage que ha encontrado en el paso anterior para especificar una instancia de Object Storage con la que se va a trabajar. Asegúrese de copiar todo el ID, empezando por crn:. Estos ejemplos utilizan la opción --force para forzar la configuración a utilizar el CRN especificado, lo que puede ser útil si tiene más de una instancia de Object Storage.

    ibmcloud cos config crn --crn CRN --force
    

    Salida de ejemplo

    Saving new Service Instance ID...
    OK
    Successfully stored your service instance ID.
    
  5. Identifique un grupo al que se va a suscribir. Para ver una lista de grupos asociados a su instancia de Object Storage,

    ibmcloud cos buckets
    

    Para crear un grupo,

    ibmcloud cos bucket-create -bucket BUCKET_NAME
    
  6. Identifique la ubicación y el plan del grupo de Object Storage; por ejemplo, utilice el grupo mybucket.

    ibmcloud cos bucket-location-get --bucket mybucket
    

    Salida de ejemplo

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

Su grupo de Object Storage debe ser un grupo regional que se encuentre en la misma región que su proyecto de Code Engine.

Asignación del rol de Gestor de notificaciones a Code Engine

Para poder crear una suscripción de Object Storage, debe asignar el rol de Gestor de notificaciones a un proyecto de Code Engine. Como Gestor de notificaciones, Code Engine puede ver, modificar y suprimir notificaciones para un grupo de Object Storage.

Solo los administradores de la cuenta pueden asignar el rol de Gestor de notificaciones.

  1. Identifique el proyecto de Code Engine que desea utilizar. Puede utilizar el mandato ibmcloud ce project list para visualizar una lista de proyectos. Utilice el mandato ibmcloud ce project select para seleccionar el proyecto como contexto actual. Por ejemplo, para seleccionar un proyecto denominado myproject

    ibmcloud ce project select -n myproject
    
  2. Asigne el rol Gestor de notificaciones utilizando el mandato ibmcloud iam authorization-policy-create.

    Por ejemplo, para asignar el rol de Gestor de notificaciones a un proyecto denominado myproject para una Object Storage instancia denominada mycosinstance,

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

    Tras asignar el rol de Gestor de notificaciones al proyecto, puede crear suscripciones de Object Storage para cualquier grupo regional de su instancia de Object Storage que se encuentre en la misma región que el proyecto.

    En la tabla siguiente se resumen las opciones que se utilizan con el mandato iam authorization-policy-create en este ejemplo. Para obtener más información sobre el mandato y sus opciones, consulte el mandato ibmcloud iam authorization-policy-create.

    Componentes del mandato iam authorization-policy-create
    Opción de mandato Descripción
    codeengine El servicio de origen que está autorizado para acceder.
    cloud-object-storage El servicio de destino al que el servicio de origen está autorizado para acceder.
    Notifications Manager Los roles que dan acceso al servicio de origen.
    source-service-instance-name El nombre del proyecto codeengine al que desea autorizar el acceso.
    target-service-instance-name El nombre de la instancia cloud-object-storage a la que desea acceder.
  3. Verifique que el rol de Gestor de notificaciones se ha establecido.

    ibmcloud iam authorization-policies
    

    Salida de ejemplo

    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
    

Cree su aplicación (o trabajo)

Se pueden utilizar sucesos para desencadenar aplicaciones o trabajos, en esta guía de aprendizaje se utiliza una aplicación.

Cree una aplicación denominada cos-app con el mandato ibmcloud ce app create utilizando una imagen denominada cos-listen. Esta app registra cada suceso a medida que llega. Esta imagen se ha creado a partir de cos-listen.go, disponible en el repositorio «Samples for IBM Cloud Code Engine »(GitHub).

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

Ejecute ibmcloud ce application get --name cos-app para verificar que la app está en estado Ready (Lista). La aplicación está en estado preparado si el resumen de estado refleja que la aplicación se ha desplegado correctamente.

Para obtener más información sobre esta aplicación, consulta el archivo «readme» de IBM Cloud Object Storage.

Crear una suscripción

Una vez la app esté lista, puede crear una suscripción de Object Storage para poder empezar a recibir sucesos de Object Storage con el mandato ibmcloud ce sub cos create.

Por ejemplo, cree una suscripción de Object Storage que se denomine cos-sub. Esta suscripción reenvía cualquier tipo de operación de grupo del grupo mybucket a una aplicación denominada cos-app.

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

Ejecute el mandato ibmcloud ce sub cos get -n cos-sub para encontrar información sobre la suscripción.

Salida de ejemplo

De forma predeterminada, el mandato ibmcloud ce sub cos get devuelve dos partes. La primera parte incluye información relacionada con la suscripción de Object Storage como, por ejemplo, el nombre de la suscripción, el destino, el prefijo, el sufijo y el tipo de suceso. La segunda parte incluye información de sucesos relacionada con el recurso sobre la suscripción de Object Storage que se puede utilizar para fines de depuración. De forma predeterminada, la información de sucesos está disponible durante 1 hora después de que se produzca.

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

De forma predeterminada, el mandato subscription cos create comprueba primero si existe la aplicación de destino. Si falla la comprobación de destino porque el nombre de la app que se ha indicado no existe en el proyecto, el mandato subscription cos create devuelve un error. Si desea crear una suscripción sin crear primero la aplicación, utilice la opción --force. Mediante la opción --force, el mandato ignora la comprobación de destino. Fíjese que en el campo Ready de la suscripción se muestra false hasta que se crea la app de destino. A continuación, la suscripción pasa automáticamente al estado Ready: true.

Tras crear la suscripción, pero antes de que el mandato subscription cos create informe de los resultados, el mandato subscription cos create sondea repetidamente la suscripción para comprobar el estado con el fin de verificar su disponibilidad. Este sondeo continuo sobre el estado dura 15 segundos de forma predeterminada antes de que se agote el tiempo de espera. Si el estado de la suscripción se devuelve como Ready:true, informa de que se ha llevado a cabo correctamente, de lo contrario, informa de un error. Puede cambiar la cantidad de tiempo que espera el mandato subscription cos create antes de que se agote el tiempo de espera utilizando la opción --wait-timeout. También puede ignorar el sondeo del estado definiendo la opción --no-wait en false.

Para obtener más información sobre cabeceras y cuerpo, consulte Cabeceras HTTP e información de cuerpo para sucesos.

Tenga en cuenta que las suscripciones pueden afectar a la forma de escalado de la aplicación. Para obtener más información, consulte Configuración del escalado de una aplicación.

Prueba de la suscripción

  1. Cargue un archivo .txt en el grupo. Por ejemplo, puede utilizar el mandato ibmcloud cos object-put para cargar el objeto sample.txt en un grupo con sample como valor para --key.

    ibmcloud cos object-put --bucket mybucket --key sample --body sample.txt
    
  2. Ver el suceso procesado utilizando el mandato ibmcloud ce app logs.

    ibmcloud ce app logs --name cos-app
    

    Salida de ejemplo

    Este mandato devuelve archivos de registro que incluyen información sobre el suceso que se ha reenviado a la app de destino. En la salida siguiente, puede ver que se ha realizado una operación Write en el objeto sample del grupo denominado mybucket.

    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"}
    

Actualización de la suscripción de Object Storage

Ahora ya sabe que la suscripción de Object Storage se ha creado correctamente y que la suscripción de Object Storageestá lista para servir sucesos, puede actualizar la suscripción de Object Storage con el mandato ** ibmcloud ce sub cos update**. Por ejemplo, puede cambiar la suscripción para que se ejecute solamente cuando se producen operaciones específicas en un subconjunto de objetos del grupo.

  1. Actualice la suscripción de Object Storage para reenviar sucesos solamente cuando se produzcan operaciones de tipo delete en archivos con el prefijo test.

    ibmcloud ce sub cos update --name cos-sub --event-type delete --prefix test
    
  2. Ejecute el mandato ibmcloud ce sub cos get para encontrar información sobre la suscripción.

    ibmcloud ce sub cos get --name cos-sub
    

    Salida de ejemplo

    En esta salida, puede ver que se muestran los valores actualizados para Prefix y 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. Suprima un objeto del grupo que tiene el prefijo test. Por ejemplo, suprima un archivo con test2.txt para el nombre (o clave). Puede utilizar el mandato ibmcloud cos object-delete para suprimir un objeto del grupo o utilizar la consola de Object Storage.

  4. Ver el suceso procesado utilizando el mandato ibmcloud ce app logs.

    ibmcloud ce app logs --name cos-app
    

    Salida de ejemplo

    Este mandato devuelve archivos de registro que incluyen información sobre el suceso que se ha reenviado a la app de destino. En la salida siguiente, puede ver que se ha realizado una operación Delete en el objeto .txt del grupo denominado mybucket.

    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"}
    

Guía de aprendizaje para la Limpieza para Object Storage

¿Está preparado para suprimir la suscripción de Object Storage y la app? Puede utilizar los mandatos ibmcloud ce app delete e ibmcloud ce sub cos delete.

Para eliminar la suscripción,

ibmcloud ce sub cos delete --name cos-sub

Para eliminar la aplicación,

ibmcloud ce app delete --name cos-app

¿Está listo para suprimir el grupo de Object Storage y la instancia de servicio? Puede utilizar el mandato ibmcloud cos bucket-delete para eliminar el grupo. Para eliminar la instancia de servicio de Object Storage, utilice el mandato ibmcloud resource service-instance-delete.