预订 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
必须先将通知管理器角色分配给 Code Engine 项目,然后才能创建 Object Storage 预订。 作为通知管理器,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 预订,以便可以使用 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 头和主体信息。
请注意,预订可能会影响应用程序的扩展方式。 有关更多信息,请参阅 配置应用程序缩放。
测试预订
-
将
.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 预订已准备好处理事件,您可以使用 ibmcloud ce sub cos update
命令更新 Object Storage 预订。 例如,您可以将预订更改为仅在对存储区中的部分对象执行特定操作时运行。
-
仅当对名称前缀为
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
命令。