IBM Cloud Docs
预订 Object Storage 事件

预订 Object Storage 事件

通过本教程,您可以了解如何使用 IBM Cloud® Code Engine CLI 来预订 Object Storage 事件。

在分布式环境中,您通常希望应用程序或作业对从其他组件 (通常称为事件生产者) 生成的消息 (事件) 作出反应。 通过 Code Engine,应用程序或作业可以通过预订事件生产者来接收感兴趣的事件。 事件信息作为应用程序的 POST HTTP 请求接收,并作为作业的环境变量接收。

准备工作

所有 Code Engine 用户都需要具有现收现付帐户。 教程可能会产生成本。 使用“成本估算器”可根据您的预计使用量生成成本估算。 有关更多信息,请参阅 Code Engine 定价

确定 Object Storage 存储区和区域

Object Storage 事件生产者根据对 IBM Cloud Object Storage 存储区中对象的操作生成事件。

  1. 安装 Object Storage 插件 CLI。

    ibmcloud plugin install cloud-object-storage
    
  2. 创建 Object Storage 资源实例。 例如,创建名为 mycloud-object-storage 的 Object Storage 资源,该资源使用 IBM Cloud Lite 服务套餐。

    ibmcloud resource service-instance-create mycloud-object-storage cloud-object-storage lite global
    
  3. 显示您创建的 Object Storage 资源实例的详细信息。 使用详细信息从 Object Storage 实例获取 CRN (云资源名称)。 CRN 标识要使用的 Object Storage 实例。 CRN 是 ibmcloud resource service-instance COS_INSTANCE_NAME 命令输出中 ID 字段的值。

    ibmcloud resource service-instance mycloud-object-storage
    

    示例输出

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

    如果您不知道 Object Storage 实例名称,请运行 ibmcloud resource service-instances --service-name cloud-object-storage 以查看 Object Storage 实例的列表。

    有关 Object Storage 实例的更多信息,请参阅 IBM Cloud Object Storage 入门。

  4. 配置您在上一步中找到的 Object Storage CRN,以指定要使用的 Object Storage 实例。 确保从 crn: 开始复制整个标识。 此示例使用 --force 选项来强制配置使用指定的 CRN,如果您有多个 Object Storage 实例,那么这可能很有用。

    ibmcloud cos config crn --crn CRN --force
    

    示例输出

    Saving new Service Instance ID...
    OK
    Successfully stored your service instance ID.
    
  5. 标识要预订的存储区。 要查看与 Object Storage 实例关联的存储区列表,

    ibmcloud cos buckets
    

    要创建存储区,

    ibmcloud cos bucket-create -bucket BUCKET_NAME
    
  6. 标识 Object Storage 存储区的位置和计划; 例如,使用 mybucket 存储区。

    ibmcloud cos bucket-location-get --bucket mybucket
    

    示例输出

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

Object Storage 存储区必须是与 Code Engine 项目位于同一区域中的区域存储区。

将通知管理员角色分配给 Code Engine

必须先将通知管理器角色分配给 Code Engine 项目,然后才能创建 Object Storage 预订。 作为通知管理器,Code Engine 可以查看,修改和删除 Object Storage 存储区的通知。

只有帐户管理员才能分配通知管理器角色。

  1. 标识要使用的 Code Engine 项目。 您可以使用 ibmcloud ce project list 命令来显示项目列表。 使用 ibmcloud ce project select 命令来选择项目作为当前上下文。 例如,要选择名为 myproject 的项目

    ibmcloud ce project select -n myproject
    
  2. 使用 ibmcloud iam authorization-policy-create 命令分配通知管理员角色。

    例如,要为名为 mycosinstance 的 Object Storage 实例的名为 myproject 的项目分配通知管理员角色,

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

    将“通知管理员”角色分配给项目后,可以为 Object Storage 实例中与项目位于同一区域中的任何区域存储区创建 Object Storage 预订。

    下表概述了此示例中与 iam authorization-policy-create 命令配合使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud iam authorization-policy-create 命令。

    iam authorization-policy-create 命令组件
    命令选项 描述
    codeengine 可授权访问的源服务。
    cloud-object-storage 可以授权源服务访问的目标服务。
    Notifications Manager 为源服务提供访问权的角色。
    source-service-instance-name 要授权访问的 codeengine 项目的名称。
    target-service-instance-name 要访问的 cloud-object-storage 实例的名称。
  3. 验证是否设置了“通知管理员”角色。

    ibmcloud iam authorization-policies
    

    示例输出

    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
    

创建应用程序 (或作业)

虽然事件可用于触发应用程序或作业,但本教程使用应用程序。

通过使用名为 cos-listen 的映像,使用 ibmcloud ce app create 命令创建名为 cos-app 的应用程序。 此应用程序在到达时记录每个事件。 此映像是根据 cos-listen.go 构建的,可从 样本 IBM Cloud Code Engine GitHub 存储库获取。

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

运行 ibmcloud ce application get --name cos-app 以验证应用程序是否处于 Ready 状态。 如果状态摘要反映已成功部署应用程序,那么应用程序处于就绪状态。

有关此应用程序的更多信息,请参阅 IBM Cloud Object Storage 自述文件

创建预订

应用程序就绪后,您可以创建 Object Storage 预订,以便可以使用 ibmcloud ce sub cos create 命令开始接收 Object Storage 事件。

例如,创建名为 cos-sub 的 Object Storage 预订。 此预订将任何类型的存储区操作从 mybucket 存储区转发到名为 cos-app 的应用程序。

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

运行 ibmcloud ce sub cos get -n cos-sub 命令以查找有关预订的信息。

示例输出

缺省情况下,ibmcloud ce sub cos get 命令返回两个部分。 第一部分包含与 Object Storage 预订相关的信息,例如预订名称,目标,前缀,后缀和事件类型。 第二部分包含有关可用于调试目的的 Object Storage 预订的资源相关事件信息。 缺省情况下,事件信息在 1 小时后可用。

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

缺省情况下,subscription cos create 命令首先检查目标应用程序是否存在。 如果由于您提供的应用程序名称在项目中不存在而导致目标检查失败,那么 subscription cos create 命令将返回错误。 如果要在不首先创建应用程序的情况下创建预订,请使用 --force 选项。 通过使用 --force 选项,该命令将绕过目标检查。 请注意,在创建目标应用程序之前,预订的 Ready 字段将显示 false。 然后,预订将自动进入 Ready: true 状态。

在创建预订之后,但在 subscription cos create 命令报告任何结果之前,subscription cos create 命令会反复轮询预订以获取其状态以验证其就绪性。 缺省情况下,此状态连续轮询将持续 15 秒,直到超时为止。 如果预订状态返回为 Ready:true,那么将报告成功,否则将报告错误。 您可以使用 --wait-timeout 选项来更改 subscription cos create 命令在超时之前等待的时间量。 您还可以通过将 --no-wait 选项设置为 false 来绕过状态轮询。

有关头和主体的更多信息,请参阅 事件的 HTTP 头和主体信息

请注意,预订可能会影响应用程序的扩展方式。 有关更多信息,请参阅 配置应用程序缩放

测试预订

  1. .txt 文件上载到存储区。 例如,您可以使用 ibmcloud cos object-put 命令将 sample.txt 对象上载到以 sample 作为 --key 值的存储区。

    ibmcloud cos object-put --bucket mybucket --key sample --body sample.txt
    
  2. 使用 ibmcloud ce app logs 命令查看已处理的事件。

    ibmcloud ce app logs --name cos-app
    

    示例输出

    此命令返回日志文件,其中包含有关转发到目标应用程序的事件的信息。 从以下输出中,您可以看到对名为 mybucket 的存储区中的 sample 对象执行了 Write 操作。

    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 预订

现在,您知道 Object Storage 预订已成功创建,并且 Object Storage 预订已准备好处理事件,您可以使用 ibmcloud ce sub cos update 命令更新 Object Storage 预订。 例如,您可以将预订更改为仅在对存储区中的部分对象执行特定操作时运行。

  1. 仅当对名称前缀为 test 的文件执行 delete 操作时,才更新 Object Storage 预订以转发事件。

    ibmcloud ce sub cos update --name cos-sub --event-type delete --prefix test
    
  2. 运行 ibmcloud ce sub cos get 命令以查找有关预订的信息。

    ibmcloud ce sub cos get --name cos-sub
    

    示例输出

    在此输出中,您可以看到显示了 PrefixEventType 的更新值。

    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. 从存储区中删除具有 test 前缀的对象。 例如,删除名称 (或密钥) 为 test2.txt 的文件。 您可以使用 ibmcloud cos object-delete 命令从存储区中删除对象,也可以使用 Object Storage 控制台。

  4. 使用 ibmcloud ce app logs 命令查看已处理的事件。

    ibmcloud ce app logs --name cos-app
    

    示例输出

    此命令返回日志文件,其中包含有关转发到目标应用程序的事件的信息。 从以下输出中,您可以看到对名为 mybucket 的存储区中的 .txt 对象执行了 Delete 操作。

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

清除 Object Storage 教程

是否准备好删除 Object Storage 预订和应用程序? 您可以使用 ibmcloud ce app deleteibmcloud ce sub cos delete 命令。

要除去预订,

ibmcloud ce sub cos delete --name cos-sub

要除去应用程序,

ibmcloud ce app delete --name cos-app

是否准备好删除 Object Storage 存储区和服务实例? 您可以使用 ibmcloud cos bucket-delete 命令来除去存储区。 要除去 Object Storage 服务实例,请使用 ibmcloud resource service-instance-delete 命令。