如何将对象上传到我的GCS存储桶时收到通知?

时间:2017-03-28 16:20:35

标签: google-cloud-storage google-cloud-platform google-cloud-pubsub

我有一个应用程序可以定期将照片上传到GCS存储桶。上传这些照片后,我需要添加缩略图并进行一些分析。如何为存储桶设置通知?

3 个答案:

答案 0 :(得分:11)

执行此操作的方法是为新对象创建Cloud Pub / Sub主题,并配置GCS存储桶以在创建新对象时将消息发布到该主题。

首先,让我们创建一个水桶PHOTOBUCKET:

$ gsutil mb gs://PHOTOBUCKET

现在,请确保您activated the Cloud Pub/Sub API

接下来,让我们创建一个Cloud Pub / Sub主题,并使用gsutil将其连接到我们的GCS存储桶:

$ gsutil notification create \
    -t uploadedphotos -f json \
    -e OBJECT_FINALIZE gs://PHOTOBUCKET

-t指定发布/订阅主题。如果该主题尚未存在,gsutil将为您创建该主题。

-e指定您只对OBJECT_FINALIZE消息(正在创建的对象)感兴趣。否则,您将在主题中收到各种消息。

-f指定您希望消息的有效负载成为JSON API的对象元数据。

请注意,这需要最新版本的gsutil,因此请确保更新到最新版本的gcloud,或者如果您使用独立的gsutil,请运行gsutil update

现在我们已经配置了通知和抽水,但我们希望看到它们。让我们创建一个Pub / Sub订阅:

$ gcloud beta pubsub subscriptions create processphotos --topic = uploadedphotos

现在我们只需要阅读这些消息。 Here's a Python example做到这一点。以下是相关内容:

def poll_notifications(subscription_id):
    client = pubsub.Client()
    subscription = pubsub.subscription.Subscription(
        subscription_id, client=client)
    while True:
        pulled = subscription.pull(max_messages=100)
        for ack_id, message in pulled:
            print('Received message {0}:\n{1}'.format(
                message.message_id, summarize(message)))
            subscription.acknowledge([ack_id])

def summarize(message):
    # [START parse_message]
    data = message.data
    attributes = message.attributes

    event_type = attributes['eventType']
    bucket_id = attributes['bucketId']
    object_id = attributes['objectId']
    return "A user uploaded %s, we should do something here." % object_id

以下是关于该系统如何运作的更多内容:

https://cloud.google.com/storage/docs/reporting-changes https://cloud.google.com/storage/docs/pubsub-notifications

答案 1 :(得分:1)

GCP还提供了一个名为“对象更改通知”的Pub / Sub云存储更改通知的早期版本。当该桶中的对象发生更改时,此功能将直接POST到所需的端点。 Google推荐Pub / Sub方法。

https://cloud.google.com/storage/docs/object-change-notification

答案 2 :(得分:0)

同时使用this example! 记住两件事 1)他们已经将代码升级到python 3.6 pub_v1,这可能无法在python 2.7上运行 2)在调用poll_notifications(projectid,subscriptionname)时 传递您的GCP项目ID:例如,粗体字和订阅名称,例如Asrtopic