【问题标题】:Using PHP to create a Pub/Sub notification for Google Cloud Storage使用 PHP 为 Google Cloud Storage 创建 Pub/Sub 通知
【发布时间】:2021-07-02 20:43:51
【问题描述】:

所以,我有一个基于 GKE 的函数来处理图像文件。我希望每当使用 Pub/Sub 将新文件转储到存储桶中时触发此功能。我有一个将图像文件推送到存储桶中的外部系统。我使用对象通知来执行此操作,现在我想使用 Pub/Sub。

我能否在 GoogleCloudStorage 中创建一个通知,以生成我的处理函数将要提取的 Pub/Sub 通知?我正在查看 PHP 库 (https://googleapis.github.io/google-cloud-php/#/docs/google-cloud/v0.162.0/storage/notification) 来执行此操作,但文档非常不足。

这段代码创建了一个通知,但我应该提供一个通知 ID 似乎很奇怪,而且我不确定有效负载将是什么......

$client=new StorageClient(['projectId'=><my project>, 'keyFile'=><key file contents>]);

$bucket_name = <my bucket name>;
$notification_id = '2482';  // ?????

$notification_params = [
        'eventType'     => 'OBJECT_FINALIZE',
        'payloadFormat' => 'JSON_API_V1',
        'bucketId'      => $bucket_name,
];

$bucket = $client->bucket( $bucket_name );

$notification = $bucket->notification( $notification_id );

这是创建我想要的通知的正确方法吗?我是否以这种方式指定我自己的 id?如果发生碰撞会怎样?

谢谢, 安迪

【问题讨论】:

  • “如果发生碰撞”是什么意思?你能解释一下吗?
  • 我的代码中指定的名称和已经存在的主题名称冲突?
  • 如果您在代码中定义了不存在的主题,则会出现错误。

标签: php google-cloud-storage google-kubernetes-engine publish-subscribe


【解决方案1】:

是的,可以在将对象推送到存储桶时创建 Pub/Sub 通知。在创建通知之前,您需要先create a Pub/Sub topic and subscriber

我使用了sample code create pub/sub notification,只是添加了存储桶的定义:

use Google\Cloud\Core\Iam\PolicyBuilder;
use Google\Cloud\PubSub\PubSubClient;
use Google\Cloud\Storage\StorageClient;


$storage = new StorageClient();
$bucket = $storage->bucket('your-bucket'); // define bucket to be used

$pubSub = new PubSubClient();
$topicName = 'your-topic'; // define the topic to be used

// grant pubsub publisher role for topic
$serviceAccountEmail = $storage->getServiceAccount();
$topic = $pubSub->topic($topicName);
$iam = $topic->iam();
$updatedPolicy = (new PolicyBuilder($iam->policy()))
    ->addBinding('roles/pubsub.publisher', [
        "serviceAccount:$serviceAccountEmail"
    ])
    ->result();
$iam->setPolicy($updatedPolicy);

$notification = $bucket->createNotification($topicName, [
    'event_types' => [
        'OBJECT_DELETE',
        'OBJECT_METADATA_UPDATE'
    ]
]);

要对此进行测试,请在创建发布/订阅通知时:

  • 将对象推送到您的存储桶中
  • 主题应该向订阅者发送消息
  • 检查订阅者中的消息

在测试桶中推送对象:


向订阅者发布消息/通知:

【讨论】:

  • 很遗憾,尝试创建不带参数的存储客户端时失败。如果我指定我的项目和密钥文件,它会一直运行,直到它尝试创建 PubSub 客户端。将项目添加到成功创建 PubSub 客户端,但是当我尝试创建更新的策略时,我得到:异常 'Exception' 和消息 'exception 'Google\Cloud\Core\Exception\BadRequestException' 和消息 '{ "error" : "invalid_grant", "error_description": "Bad Request" }' in /home/httpd/idxv3/vendor/google/cloud-core/src/RequestWrapper.php:368
  • 根据SO answer,您的错误可能有很多可能的原因。您也可以尝试在您的机器中设置环境变量GOOGLE_APPLICATION_CREDENTIALS 吗?如果上述解决方案都不起作用,您可以为此问题打开另一个问题,以便社区提供一些答案。
  • 但是来自 Google 的文档和错误消息特别暗示我需要使用服务帐户来处理任何类型的高负载,我们保证有这种负载。将“接受此错误”创可贴放在适当的位置只会推动我需要让服务帐户身份验证继续工作。我宁愿现在把它关掉。
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 2021-08-22
  • 2022-01-13
  • 2019-10-12
  • 2021-12-12
  • 2021-01-05
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多