2.16. bucket 通知
作为存储管理员,您可以使用这些 API 为存储桶通知机制提供配置和部署接口。API 主题是命名的对象,其中包含特定端点的定义。bucket 通知将主题与特定 bucket 关联。S3 bucket operations 部分提供有关 bucket 通知的更多详情。
在所有主题操作中,参数都是 URL 编码,并使用 application/x-www-form-urlencoded
内容类型在消息正文中发送。
需要重新创建与这个主题相关联的任何存储桶通知,以使主题更新生效。
2.16.1. 先决条件
- 在 Ceph 对象网关上创建 bucket 通知。
2.16.2. 存储桶通知概述
bucket 通知提供了一种方式,可以在 bucket 中发生特定事件时从 Ceph 对象网关发送信息。bucket 通知可以发送到 HTTP、AMQP0.9.1 和 Kafka 端点。必须创建一个通知条目,以便为特定存储桶上的事件和特定主题发送存储桶通知。可以在事件类型的子集上创建 bucket 通知,也可以默认为所有事件类型创建 bucket 通知。bucket 通知可以根据键前缀或后缀过滤事件,正则表达式与键匹配,以及附加到对象或对象标签的元数据属性。bucket 通知具有 REST API,用于为 bucket 通知机制提供配置和控制接口。
2.16.3. 持久性通知
持久性通知支持将 Ceph 对象网关中的可靠和异步发送到在主题中配置的端点。常规通知也可靠,因为到端点的交付是在请求期间同步执行的。通过持久通知,Ceph 对象网关会在端点停机或操作过程中出现网络问题时重试通知,如果无法成功传送到端点,也会重试通知。只有在与通知操作成功相关的所有操作后,才会发送通知。如果端点在较长时间内停机,则通知队列将填满,并且为这些端点配置了通知的 S3 操作将失败。
使用 kafka-ack-level=none
时,没有显示消息失败,因此在代理再次启动时不会重试代理时发送的消息。代理再次启动后,只会看到新的通知。
2.16.4. 创建主题
您可以在创建存储桶通知前创建主题。主题是简单通知服务(SNS)实体和所有主题操作,即,创建
、删除
、列出
,并获取
SNS 操作。主题需要具有创建存储桶通知时使用的端点参数。请求成功后,响应中包含稍后可用来在存储桶通知请求中引用此主题的 Amazon Resource Name(ARN)主题。
topic_arn
提供存储桶通知配置,并在创建主题后生成。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 根级别访问权限.
- 安装 Ceph 对象网关.
- 用户 access key 和 secret key。
- 端点参数.
流程
创建带有请求格式的主题:
语法
POST Action=CreateTopic &Name=TOPIC_NAME [&Attributes.entry.1.key=amqp-exchange&Attributes.entry.1.value=EXCHANGE] [&Attributes.entry.2.key=amqp-ack-level&Attributes.entry.2.value=none|broker|routable] [&Attributes.entry.3.key=verify-ssl&Attributes.entry.3.value=true|false] [&Attributes.entry.4.key=kafka-ack-level&Attributes.entry.4.value=none|broker] [&Attributes.entry.5.key=use-ssl&Attributes.entry.5.value=true|false] [&Attributes.entry.6.key=ca-location&Attributes.entry.6.value=FILE_PATH] [&Attributes.entry.7.key=OpaqueData&Attributes.entry.7.value=OPAQUE_DATA] [&Attributes.entry.8.key=push-endpoint&Attributes.entry.8.value=ENDPOINT] [&Attributes.entry.9.key=persistent&Attributes.entry.9.value=true|false]
以下是请求参数:
-
端点
:将通知发送到的端点的 URL。 -
OpaqueData
: 不透明数据在主题配置中设置,并添加到该主题触发的所有通知。 -
persistent
:指示对此端点的通知是否是持久的,是否为异步的。默认值为false
。 HTTP 端点:
-
URL
: https://FQDN:PORT -
port defaults to
: 分别为 HTTP[S] 使用 80/443。 -
verify-ssl
:指示服务器证书是否由客户端验证。默认情况下,它是true
。
-
AMQP0.9.1 端点:
-
URL
: amqp://USER:PASSWORD@FQDN:PORT[/VHOST]. -
用户和密码分别默认为:
guest
和guest
。 - 应当通过 HTTPS 提供用户和密码详细信息,否则主题创建请求将被拒绝。
-
端口默认为
5672。 -
vhost
默认为:"/" -
amqp-exchange
:该交换必须存在,并且能够根据主题路由消息。这是用于 AMQP0.9.1 的强制参数。指向同一端点的不同主题必须使用相同的交换。 AMQP-ack-level
:不需要结束确认,因为消息在代理中可以保留,然后再将它们传送到最终目的地。有三个确认方法:-
none
:当发送到代理,则消息被视为已发送
。 -
broker
: 默认情况下,代理确认信息将被视为已发送
。 routable
:如果代理可路由到使用者,则消息被视为已发送
。注意特定参数的键和值不必驻留在同一行中或任何特定顺序,但必须使用相同的索引。属性索引不需要是连续的,或从任何特定值开始。
注意topic-name
用于 AMQP 主题。
-
-
Kafka 端点:
-
URL
: kafka://USER:PASSWORD@FQDN:PORT. -
use-ssl
默认被设置为false
。如果将use-ssl
设置为true
,则与代理的连接会使用安全的连接。 -
如果提供了
ca-location
,并且使用安全连接,则会使用指定的 CA 而不是默认的端口来验证代理。 - 用户和密码只能通过 HTTP[S] 提供。否则,主题创建请求将被拒绝。
-
用户和密码只能与
use-ssl
一起提供,否则与代理的连接将失败。 -
端口默认为
: 9092。 Kafka-ack-level
:无需结束确认,因为信息在传送到最终目的地前可能会保留在代理中。存在两个确认方法:-
none
:当发送到代理,则消息被视为已发送
。 -
broker
: 默认情况下,代理确认信息将被视为已发送
。
-
-
-
以下是响应格式的示例:
示例
<CreateTopicResponse xmlns="https://sns.amazonaws.com/doc/2010-03-31/"> <CreateTopicResult> <TopicArn></TopicArn> </CreateTopicResult> <ResponseMetadata> <RequestId></RequestId> </ResponseMetadata> </CreateTopicResponse>
响应中的 Amazon 资源名称(ARN)具有以下格式: arn:aws:sns:ZONE_GROUP:TENANT:TOPIC
以下是一个 AMQP0.9.1 端点的示例:
示例
client.create_topic(Name='my-topic' , Attributes={'push-endpoint': 'amqp://127.0.0.1:5672', 'amqp-exchange': 'ex1', 'amqp-ack-level': 'broker'}) "
2.16.5. 获取主题信息
返回有关特定主题的信息。如果提供,这可包括端点信息。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 根级别访问权限.
- 安装 Ceph 对象网关.
- 用户 access key 和 secret key。
- 端点参数.
流程
使用以下请求格式获取主题信息:
语法
POST Action=GetTopic &TopicArn=TOPIC_ARN
以下是响应格式的示例:
<GetTopicResponse> <GetTopicRersult> <Topic> <User></User> <Name></Name> <EndPoint> <EndpointAddress></EndpointAddress> <EndpointArgs></EndpointArgs> <EndpointTopic></EndpointTopic> <HasStoredSecret></HasStoredSecret> <Persistent></Persistent> </EndPoint> <TopicArn></TopicArn> <OpaqueData></OpaqueData> </Topic> </GetTopicResult> <ResponseMetadata> <RequestId></RequestId> </ResponseMetadata> </GetTopicResponse>
以下是标签和定义:
-
User
:创建该主题的用户的名称。 -
Name
:主题的名称. JSON 格式的端点包括:
EndpointAddress
:端点 URL。如果端点 URL 包含用户和密码信息,则必须通过 HTTPS 进行请求。否则,主题获取请求将被拒绝。-
EndPointArgs
:端点参数。 -
EndpointTopic
:发送到端点的主题名称可以与上例主题名称不同。 -
HasStoredSecret
:当端点 URL 包含用户和密码信息时为true
。 -
Persistent
: 当主题是持久的则为true
。
-
-
TopicArn
: Topic ARN。 -
OpaqueData
:这是在主题上设置的不透明数据。
-
2.16.6. 列出主题
列出用户已定义的主题。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 根级别访问权限.
- 安装 Ceph 对象网关.
- 用户 access key 和 secret key。
- 端点参数.
流程
使用以下请求格式列出主题信息:
语法
POST Action=ListTopics
以下是响应格式的示例:
<ListTopicdResponse xmlns="https://sns.amazonaws.com/doc/2020-03-31/"> <ListTopicsRersult> <Topics> <member> <User></User> <Name></Name> <EndPoint> <EndpointAddress></EndpointAddress> <EndpointArgs></EndpointArgs> <EndpointTopic></EndpointTopic> </EndPoint> <TopicArn></TopicArn> <OpaqueData></OpaqueData> </member> </Topics> </ListTopicsResult> <ResponseMetadata> <RequestId></RequestId> </ResponseMetadata> </ListTopicsResponse>
注意如果端点 URL 包含用户和密码信息,在任何主题中,则必须通过 HTTPS 进行请求。否则,主题列表请求将被拒绝。
2.16.7. 删除主题
删除已删除的主题会导致不操作,且不是失败。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 根级别访问权限.
- 安装 Ceph 对象网关.
- 用户 access key 和 secret key。
- 端点参数.
流程
使用以下请求格式删除主题:
语法
POST Action=DeleteTopic &TopicArn=TOPIC_ARN
以下是响应格式的示例:
<DeleteTopicResponse xmlns="https://sns.amazonaws.com/doc/2020-03-31/"> <ResponseMetadata> <RequestId></RequestId> </ResponseMetadata> </DeleteTopicResponse>
2.16.8. 事件记录
事件包含 Ceph 对象网关完成的操作信息,并通过所选端点(如 HTTP、HTTPS、Kafka 或 AMQ0.9.1)作为有效负载发送。事件记录采用 JSON 格式。
示例
{"Records":[ { "eventVersion":"2.1", "eventSource":"ceph:s3", "awsRegion":"us-east-1", "eventTime":"2019-11-22T13:47:35.124724Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"tester" }, "requestParameters":{ "sourceIPAddress":"" }, "responseElements":{ "x-amz-request-id":"503a4c37-85eb-47cd-8681-2817e80b4281.5330.903595", "x-amz-id-2":"14d2-zone1-zonegroup1" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"mynotif1", "bucket":{ "name":"mybucket1", "ownerIdentity":{ "principalId":"tester" }, "arn":"arn:aws:s3:us-east-1::mybucket1", "id":"503a4c37-85eb-47cd-8681-2817e80b4281.5332.38" }, "object":{ "key":"myimage1.jpg", "size":"1024", "eTag":"37b51d194a7513e45b56f6524f2d51f2", "versionId":"", "sequencer": "F7E6D75DC742D108", "metadata":[], "tags":[] } }, "eventId":"", "opaqueData":"me@example.com" } ]}
以下是事件记录密钥及其定义:
-
awsRegion
: Zonegroup。 -
eventTime
: 指示触发事件的时间的时间戳。 -
eventName
:事件类型。 -
userIdentity.principalId
:触发该事件的用户的身份。 -
requestParameters.sourceIPAddress
:触发该事件的客户端的 IP 地址。不支持此字段。 -
responseElements.x-amz-request-id
:触发事件的请求 ID。 -
responseElements.x_amz_id_2
:触发事件的 Ceph 对象网关的身份。身份格式为 RGWID-ZONE-ZONEGROUP。 -
s3.configurationId
:创建事件的通知 ID。 -
s3.bucket.name
:存储桶的名称。 -
s3.bucket.ownerIdentity.principalId
:存储桶的所有者。 -
s3.bucket.arn
: bucket 的 Amazon Resource Name(ARN)。 -
s3.bucket.id
:存储桶的身份。 -
s3.object.key
:对象键。 -
s3.object.size
:对象的大小。 -
s3.object.eTag
:对象 etag。 -
s3.object.version
:版本控制存储桶中的对象版本。 -
s3.object.sequencer
:以十六进制格式为每个对象增大更改的标识符。 -
s3.object.metadata
:对象上设置的任何元数据,作为x-amz-meta
。 -
s3.object.tags
:对象上设置的任何标签。 -
s3.eventId
:事件的唯一标识。 -
s3.opaqueData
: Opaque 数据在主题配置中设置,并添加到该主题触发的所有通知中。
其它资源
- 如需更多信息,请参阅事件消息结构。
2.16.9. 支持的事件类型
支持以下事件类型:
-
s3:ObjectCreated:*
-
s3:ObjectCreated:Put
-
s3:ObjectCreated:Post
-
s3:ObjectCreated:Copy
-
s3:ObjectCreated:CompleteMultipartUpload
-
s3:ObjectRemoved:*
-
s3:ObjectRemoved:Delete
-
s3:ObjectRemoved:DeleteMarkerCreated