订阅 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 存储桶中对象的操作来生成事件。
-
安装 Object Storage 插件 CLI。
ibmcloud plugin install cloud-object-storage -
创建 Object Storage 资源实例。 例如,创建名为
mycloud-object-storage的 Object Storage 资源,该资源使用 IBM Cloud Lite 服务套餐。ibmcloud resource service-instance-create mycloud-object-storage cloud-object-storage lite global -
显示您创建的 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 入门。
-
配置您在上一步中找到的 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. -
标识要预订的存储区。 要查看与 Object Storage 实例关联的存储区列表,
ibmcloud cos buckets要创建存储区,
ibmcloud cos bucket-create -bucket BUCKET_NAME -
标识 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
在创建 Object Storage 订阅之前,必须将“通知管理器”角色分配给一个 Code Engine 项目。 作为通知管理员,Code Engine 可以查看、修改和删除 Object Storage 存储桶中的通知。
只有帐户管理员才能分配通知管理器角色。
-
标识要使用的 Code Engine 项目。 您可以使用
ibmcloud ce project list命令来显示项目列表。 使用ibmcloud ce project select命令来选择项目作为当前上下文。 例如,要选择名为myproject的项目ibmcloud ce project select -n myproject -
使用
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实例的名称。 -
验证是否设置了“通知管理员”角色。
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 应用程序准备就绪后,您可以创建一个 Object Storage 订阅,以便通过 ibmcloud ce sub cos create 命令开始接收xml-ph-0001@deepl.internal事件。
例如,创建名为 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 中的事件标头和正文信息。
请注意,预订可能会影响应用程序的扩展方式。 有关更多信息,请参阅 配置应用程序缩放。
测试预订
-
将
.txt文件上载到存储区。 例如,您可以使用ibmcloud cos object-put命令将sample.txt对象上载到以sample作为--key值的存储区。ibmcloud cos object-put --bucket mybucket --key sample --body sample.txt -
使用
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”订阅已成功创建,且“Object Storage”订阅已准备好处理事件,您可以使用 ibmcloud ce sub cos update 命令更新 xml-ph-0002@deepl.internal
订阅。 例如,您可以将预订更改为仅在对存储区中的部分对象执行特定操作时运行。
-
仅当对名称前缀为
test的文件执行delete操作时,才更新 Object Storage 预订以转发事件。ibmcloud ce sub cos update --name cos-sub --event-type delete --prefix test -
运行
ibmcloud ce sub cos get命令以查找有关预订的信息。ibmcloud ce sub cos get --name cos-sub示例输出
在此输出中,您可以看到显示了
Prefix和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 -
从存储区中删除具有
test前缀的对象。 例如,删除名称 (或密钥) 为test2.txt的文件。 您可以使用ibmcloud cos object-delete命令从存储区中删除对象,也可以使用 Object Storage 控制台。 -
使用
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 delete 和 ibmcloud 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 命令。