Google Cloud Storage 创建发布订阅通知
Google Cloud Storage create pub sub notification
我正在尝试使用 PHP 创建一个 pub/sub 通知。我有一个项目和一个服务帐户。我的代码如下所示:
use Google\Cloud\Core\Iam\PolicyBuilder;
use Google\Cloud\PubSub\PubSubClient;
use Google\Cloud\Storage\StorageClient;
self::$storage_client = new StorageClient(
[
'projectId' => "MY PROJECT ID",
'keyFile' => json_decode(file_get_contents("PATH TO MY KEYFILE", true)
]
);
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID"
);
$serviceAccountEmail = self::$storage_client->getServiceAccount();
$topicName = 'projects/MY PROJECT ID/topics/thumbnail-service-1';
$topic = $pubSub->topic( $topicName );
$iam = $topic->iam();
// --> Error happens here:
$updatedPolicy = (new PolicyBuilder( $iam->policy() ))
->addBinding('roles/pubsub.publisher', [ "serviceAccount:$serviceAccountEmail" ])
->result();
$iam->setPolicy( $updatedPolicy );
$notification = $bucket->createNotification( $topicName,
['event_types' => [
'OBJECT_FINALIZE',
'OBJECT_DELETE',
]
]
);
我想我正在尝试创建名为的主题,但出现此错误:
exception 'Exception' with message 'exception 'Google\Cloud\Core\Exception\NotFoundException' with message '{
"error": {
"code": 404,
"message": "Resource not found (resource=thumbnail-service-1).",
"status": "NOT_FOUND"
}
}
不应该是想找话题,我要创造话题。我错过了什么?
您提供的代码并不是要创建 Pub/Sub 主题,而是要获取现有主题。如果要创建主题,需要调用createTopic
:
use Google\Cloud\PubSub\PubSubClient;
$pubsub = new PubSubClient(['projectId' => $projectId]);
$topic = $pubsub->createTopic($topicName);
创建主题后,您应该可以使用主题名称调用 createNotification
。
您没有授权 PubSub 客户端:
更改代码的这一部分:
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID" ]
);
收件人:
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID",
'keyFile' => json_decode(file_get_contents("PATH TO MY KEYFILE", true) ]
);
您的代码缺少右数组括号 ]
。我假设这是一个复制粘贴错字,因为 PHP 在这种情况下会打印错误。
注意:我更喜欢使用 KeyFilePath
而不是 KeyFile
。代码更易读。
$pubSub = new PubSubClient([
'projectId' => "MY PROJECT ID",
'keyFilePath' => "/path/to/service-account.json"
]);
接下来,验证主题名称是否确实存在。
我正在尝试使用 PHP 创建一个 pub/sub 通知。我有一个项目和一个服务帐户。我的代码如下所示:
use Google\Cloud\Core\Iam\PolicyBuilder;
use Google\Cloud\PubSub\PubSubClient;
use Google\Cloud\Storage\StorageClient;
self::$storage_client = new StorageClient(
[
'projectId' => "MY PROJECT ID",
'keyFile' => json_decode(file_get_contents("PATH TO MY KEYFILE", true)
]
);
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID"
);
$serviceAccountEmail = self::$storage_client->getServiceAccount();
$topicName = 'projects/MY PROJECT ID/topics/thumbnail-service-1';
$topic = $pubSub->topic( $topicName );
$iam = $topic->iam();
// --> Error happens here:
$updatedPolicy = (new PolicyBuilder( $iam->policy() ))
->addBinding('roles/pubsub.publisher', [ "serviceAccount:$serviceAccountEmail" ])
->result();
$iam->setPolicy( $updatedPolicy );
$notification = $bucket->createNotification( $topicName,
['event_types' => [
'OBJECT_FINALIZE',
'OBJECT_DELETE',
]
]
);
我想我正在尝试创建名为的主题,但出现此错误:
exception 'Exception' with message 'exception 'Google\Cloud\Core\Exception\NotFoundException' with message '{
"error": {
"code": 404,
"message": "Resource not found (resource=thumbnail-service-1).",
"status": "NOT_FOUND"
}
}
不应该是想找话题,我要创造话题。我错过了什么?
您提供的代码并不是要创建 Pub/Sub 主题,而是要获取现有主题。如果要创建主题,需要调用createTopic
:
use Google\Cloud\PubSub\PubSubClient;
$pubsub = new PubSubClient(['projectId' => $projectId]);
$topic = $pubsub->createTopic($topicName);
创建主题后,您应该可以使用主题名称调用 createNotification
。
您没有授权 PubSub 客户端:
更改代码的这一部分:
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID" ]
);
收件人:
$pubSub = new PubSubClient(
[ 'projectId' => "MY PROJECT ID",
'keyFile' => json_decode(file_get_contents("PATH TO MY KEYFILE", true) ]
);
您的代码缺少右数组括号 ]
。我假设这是一个复制粘贴错字,因为 PHP 在这种情况下会打印错误。
注意:我更喜欢使用 KeyFilePath
而不是 KeyFile
。代码更易读。
$pubSub = new PubSubClient([
'projectId' => "MY PROJECT ID",
'keyFilePath' => "/path/to/service-account.json"
]);
接下来,验证主题名称是否确实存在。