【问题标题】:How do I get notified when an object is uploaded to my GCS bucket?当对象上传到我的 GCS 存储桶时,我如何收到通知?
【发布时间】:2017-08-21 20:07:41
【问题描述】:

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

【问题讨论】:

  • 我配置了所有东西,但我的脚本等待说正在监听项目/bold-proton-236611/subscriptions/projects/bold-proton-236611/subscriptions/subtestbucketthhh 上的消息

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


【解决方案1】:

执行此操作的方法是为新对象创建 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 指定 Pub/Sub 主题。如果该主题尚不存在,gsutil 将为您创建它。

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

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

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

现在我们已配置并发送通知,但我们希望看到它们。让我们创建一个 Pub/Sub 订阅:

$ gcloud beta pubsub 订阅创建 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

【讨论】:

  • 如何使用服务凭证授权我的订阅者客户端?几乎没有任何地方的样本
  • 您可以从 UI 手动授予服务帐户从订阅中进行轮询的权限:cloud.google.com/pubsub/docs/access_control#console
  • 服务帐户本身(它有一个电子邮件地址)需要通过 UI 进行授权,是的。然后,如果您在应用引擎中使用 Python 客户端库,该库将自动处理身份验证工作。
  • Cloud Pub/Sub 订阅可以配置为轮询(如我上面的示例)或推送(这对您的应用引擎案例非常有用)。 cloud.google.com/pubsub/docs/subscriber#push_pull
  • 有 32 MB 的限制,因此无法从应用引擎读取大于该文件的文件。
【解决方案2】:

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

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

【讨论】:

  • 对象更改通知不是测试版。它们已经可用多年了。但是,Cloud Pub/Sub 支持几乎在各个方面都更胜一筹:它更便宜、更强大且更易于使用。我强烈建议选择 Cloud Pub/Sub 通知或 Google Cloud Functions 而不是对象更改通知。
  • @BrandonYarbrough -- 是的,你是对的,我更新了我的评论以更准确。我只是在处理这些服务,而且命名约定非常混乱。但是,我发现云发布/订阅很难使用。我在尝试使用“gsutil notification create ...”配置云发布/订阅时收到“CommandException:通知命令的无效子命令“create””
  • 通知命令相当新。要使用它们,您需要 gsutil 版本 4.24。如果您使用 gcloud SDK,请运行“gcloud components update”,或者如果您使用的是 gsutil,请运行“gsutil update”。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2020-09-17
    • 2022-11-04
    • 2018-02-17
    • 2018-08-26
    • 1970-01-01
    • 2021-05-01
    • 2014-04-05
    相关资源
    最近更新 更多