Assinando eventos do Object Storage
Com este tutorial, é possível aprender como assinar eventos do Object Storage usando a CLI do IBM Cloud® Code Engine.
Muitas vezes, em ambientes distribuídos, você deseja que os seus aplicativos ou tarefas reajam a mensagens (eventos) que são geradas por meio de outros componentes, que geralmente são chamados de produtores de evento. Com o Code Engine, seus aplicativos ou tarefas podem receber eventos de interesse assinando os produtores de evento. As informações do evento são recebidas como solicitações de HTTP POST para aplicativos e como variáveis de ambiente para tarefas.
Antes de Iniciar
Todos os usuários do Code Engine são obrigados a ter uma conta pré-paga. Os tutoriais podem gerar custos adicionais. Use o Estimador de custos para gerar uma estimativa de custo com base em seu uso planejado. Para obter mais informações, consulte os preços do Code Engine.
Determinar seu depósito e sua região do Object Storage
O produtor de evento do Object Storage gera eventos com base em operações em objetos em depósitos do IBM Cloud Object Storage.
-
Instale a CLI do plug-in Object Storage.
ibmcloud plugin install cloud-object-storage -
Crie uma instância de recurso do Object Storage. Por exemplo, crie um recurso do Object Storage denominado
mycloud-object-storageque usa o plano de serviço IBM Cloud Lite.ibmcloud resource service-instance-create mycloud-object-storage cloud-object-storage lite global -
Exiba os detalhes da instância do recurso do Object Storage que você criou. Use os detalhes para obter o CRN (Cloud Resource Name) a partir de sua instância do Object Storage. O CRN identifica qual instância do Object Storage você deseja usar. O CRN é o valor do campo
IDna saída do comandoibmcloud resource service-instance COS_INSTANCE_NAME.ibmcloud resource service-instance mycloud-object-storageSaída de exemplo
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 [...]Se você não souber o nome de sua instância do Object Storage, execute
ibmcloud resource service-instances --service-name cloud-object-storagepara ver uma lista de instâncias do Object Storage.Para obter mais informações sobre instâncias do Object Storage, consulte Introdução ao IBM Cloud Object Storage.
-
Configure seu CRN do Object Storage que você localizou na etapa anterior para especificar uma instância do Object Storage com a qual trabalhar. Certifique-se de copiar o ID inteiro, começando com
crn:. Este exemplos usa a opção--forcepara forçar a configuração a usar o CRN especificado, o que pode ser útil se você tiver mais de uma instância do Object Storage.ibmcloud cos config crn --crn CRN --forceSaída de exemplo
Saving new Service Instance ID... OK Successfully stored your service instance ID. -
Identifique um depósito para assinar. Para ver uma lista de depósitos que estão associados à sua instância do Object Storage,
ibmcloud cos bucketsPara criar um depósito,
ibmcloud cos bucket-create -bucket BUCKET_NAME -
Identifique a localização e o plano do depósito do Object Storage; por exemplo, use o depósito
mybucket.ibmcloud cos bucket-location-get --bucket mybucketSaída de exemplo
Details about bucket mybucket: Region: us-south Class: Standard
O seu depósito do Object Storage deve ser um depósito regional localizado na mesma região de seu projeto Code Engine.
Atribuindo a função de Gerenciador de notificações ao Code Engine
Antes de criar uma assinatura do Object Storage, deve-se atribuir a função de Gerenciador de notificações a um projeto do Code Engine. Como um Gerenciador de notificações, o Code Engine pode visualizar, modificar e excluir notificações para um depósito do Object Storage.
Somente administradores de conta podem designar a função Gerenciador de Notificações.
-
Identifique o projeto Code Engine que você deseja utilizar. É possível usar o comando
ibmcloud ce project listpara exibir uma lista de projetos. Use o comandoibmcloud ce project selectpara selecionar seu projeto como o contexto atual. Por exemplo, para selecionar um projeto denominadomyprojectibmcloud ce project select -n myproject -
Atribua a função de Gerenciador de notificações usando o comando
ibmcloud iam authorization-policy-create.Por exemplo, para atribuir a função de Gerenciador de Notificações a um projeto denominado
myprojectpara uma instância do Object Storage denominadamycosinstance,ibmcloud iam authorization-policy-create codeengine cloud-object-storage "Notifications Manager" --source-service-instance-name PROJECT --target-service-instance-name COS-INSTANCEDepois de designar a função de Gerenciador de Notificações para o seu projeto, é possível, então, criar assinaturas do Object Storage para quaisquer depósitos regionais em sua instância do Object Storage que estão na mesma região que o seu projeto.
A tabela a seguir resume as opções que são usadas com o comando
iam authorization-policy-createneste exemplo. Para obter mais informações sobre o comando e suas opções, consulte o comandoibmcloud iam authorization-policy-create.Componentes do comando iam authorization-policy-create Opção de comando Descrição codeengineO serviço de origem que pode ser autorizado a acessar. cloud-object-storageO serviço de destino que o serviço de origem pode ser autorizado a acessar. Notifications ManagerAs funções que fornecem acesso para o serviço de origem. source-service-instance-nameO nome do projeto codeengineque você deseja autorizar para acesso.target-service-instance-nameO nome da instância cloud-object-storageque você deseja acessar. -
Verifique se a função de Gerenciador de notificações está configurada.
ibmcloud iam authorization-policiesSaída de exemplo
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
Crie seu app (ou tarefa)
Enquanto os eventos podem ser usados para acionar apps ou tarefas, este tutorial usa um app.
Crie um aplicativo denominado cos-app com o comando ibmcloud ce app create usando uma imagem chamada cos-listen.
Esse app registra cada evento à medida que ele chega. Esta imagem foi criada a partir de cos-listen.go, disponível no repositório “Samples for IBM Cloud Code Engine ” GitHub.
ibmcloud ce app create --name cos-app --image icr.io/codeengine/cos-listen
Execute ibmcloud ce application get --name cos-app para verificar se o seu app está em um estado Ready. O aplicativo estará em um estado pronto se o resumo do status refletir que o aplicativo foi implementado com sucesso.
Para obter mais informações sobre este aplicativo, consulte o arquivo “readme” em IBM Cloud Object Storage.
Criar uma assinatura
Depois que o seu app estiver pronto, será possível criar uma assinatura do Object Storage para que você possa começar a receber eventos do Object Storage com o comando ibmcloud ce sub cos create.
Por exemplo, crie uma assinatura do Object Storage chamada de cos-sub. Esta assinatura encaminha qualquer tipo de operação de depósito a partir do depósito mybucket para um aplicativo que é chamado de cos-app.
ibmcloud ce sub cos create --name cos-sub --destination cos-app --bucket mybucket --event-type all
Execute o comando ibmcloud ce sub cos get -n cos-sub para localizar informações sobre sua assinatura.
Saída de exemplo
Por padrão, o comando ibmcloud ce sub cos get retorna duas partes. A primeira parte inclui informações relacionadas à assinatura do Object
Storage, como nome da assinatura, destino, prefixo, sufixo e tipo de evento. A segunda parte inclui informações de evento relacionadas a recursos sobre a assinatura do Object Storage que pode ser usada para propósitos de depuração. Por padrão,
as informações do evento ficam disponíveis por 1 hora após a ocorrência.
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
Por padrão, o comando subscription cos create verifica primeiro se o aplicativo de destino existe. Se a verificação de destino falhar porque o nome do app que você forneceu não existe em seu projeto, o comando subscription cos create retornará um erro. Para criar uma assinatura sem primeiro criar o aplicativo, use a opção --force. Ao usar a opção --force, o comando ignora a verificação de destino. Observe que o campo Ready da assinatura
mostra false até que o app de destino seja criado. Em seguida, a assinatura muda para um estado Ready: true automaticamente.
Após a criação da assinatura, mas antes que o comando subscription cos create relate quaisquer resultados, o comando subscription cos create pesquisa repetidamente a assinatura em busca
de seu status para verificar sua prontidão. Essa pesquisa contínua de status dura 15 segundos por padrão antes de atingir o tempo limite. Se o status da assinatura retornar como Ready:true, ele relatará o sucesso, caso contrário,
relatará um erro. É possível mudar a quantidade de tempo que o comando subscription cos create espera antes de atingir o tempo limite usando a opção --wait-timeout. Também é possível ignorar a pesquisa
de status, configurando a opção --no-wait para false.
Para obter mais informações sobre cabeçalhos e corpo, consulte Cabeçalhos HTTP e informações do corpo para eventos.
Observe que as assinaturas podem afetar como um aplicativo é escalado. Para obter mais informações, consulte Configurando o ajuste de escala do aplicativo.
Testando a sua assinatura
-
Faça upload de um arquivo
.txtpara o seu depósito. Por exemplo, é possível usar o comandoibmcloud cos object-putpara fazer o upload do objetosample.txtpara um depósito comsamplecomo o valor para--key.ibmcloud cos object-put --bucket mybucket --key sample --body sample.txt -
Visualize o evento processado usando o comando
ibmcloud ce app logs.ibmcloud ce app logs --name cos-appSaída de exemplo
Este comando retorna arquivos de log que incluem informações sobre o evento que foi encaminhado para seu app de destino. Na saída a seguir, é possível ver que uma operação de
Writefoi executada no objeto desampleno intervalo denominadomybucket.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"}
Atualizar sua assinatura do Object Storage
Agora que você sabe que sua assinatura de Object Storage foi criada com sucesso e que a assinatura de Object Storage está pronta para servir eventos, é possível atualizar a assinatura de Object Storage com o comando ibmcloud ce sub cos update.
Por exemplo, é possível mudar sua assinatura para executar somente quando operações específicas ocorrerem em um subconjunto de objetos no depósito.
-
Atualize a assinatura do Object Storage para encaminhar eventos somente quando operações
deleteocorrerem em arquivos com um prefixo de nome detest.ibmcloud ce sub cos update --name cos-sub --event-type delete --prefix test -
Execute o comando
ibmcloud ce sub cos getpara localizar informações sobre a sua assinatura.ibmcloud ce sub cos get --name cos-subSaída de exemplo
Nesta saída, é possível ver que os valores atualizados para
PrefixeEventTypesão exibidos.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 -
Exclua um objeto do seu depósito que tenha o prefixo
test. Por exemplo, exclua um arquivo comtest2.txtcomo o nome (ou chave). É possível usar o comandoibmcloud cos object-deletepara excluir um objeto de seu depósito ou usar o console do Object Storage. -
Visualize o evento processado usando o comando
ibmcloud ce app logs.ibmcloud ce app logs --name cos-appSaída de exemplo
Este comando retorna arquivos de log que incluem informações sobre o evento que foi encaminhado para seu app de destino. Na saída a seguir, é possível ver que uma operação de
Deletefoi executada no objeto de.txtno intervalo denominadomybucket.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"}
Tutorial de limpeza do Object Storage
Pronto para excluir sua assinatura do Object Storage e seu app? É possível usar os comandos ibmcloud ce app delete e ibmcloud ce sub cos delete.
Para remover a sua assinatura,
ibmcloud ce sub cos delete --name cos-sub
Para remover o seu aplicativo,
ibmcloud ce app delete --name cos-app
Pronto para excluir seu depósito e instância de serviço Object Storage? É possível usar o comando ibmcloud cos bucket-delete para remover seu depósito. Para remover sua instância de serviço do Object Storage, use o comando ibmcloud resource service-instance-delete.