beginSignedUploadSession()导致错误在PHP AppEngine Flex上实时运行,但在本地未运行

时间:2019-06-14 01:47:19

标签: php google-app-engine google-cloud-platform google-cloud-storage

我正在尝试将用户从我在AppEngine Flex(PHP 7.2)上的应用直接上传到Google Cloud Storage。该代码在本地工作(不使用GCP本地开发服务器),但是当我将代码上传到AppEngine并打开页面/视图时,出现500错误。想知道是否有人对GCP和GCS有更多的经验可以指出我做错了什么?

我将调试语句(为简便起见删除了)放入实时服务器代码中,在调用$ object-> beginSignedUploadSession()之前,我可以看到它们立即停止(请参见下面的代码)。

$config = [
    'projectId' => 'my-project-id'
];

$storage = new StorageClient($config);
$bucket = $storage->bucket('my-project-id.appspot.com'); 
$object = $bucket->object('csv_data/tmpcsvdata-' . $model->file_hash . '.csv');

$upload_url = $object->beginSignedUploadSession();

这会在本地正确生成签名的上传URL,因此我可以将其插入视图中,然后AJAX负责将用户的文件上传到GCS。实时,应用程序错误处理程序(Yii2)返回Error(#403),但未显示其他详细信息。除了错误500,AppEngine日志不显示任何其他信息。

假设#403可能意味着被禁止,并且问题出在凭据上,我已经重新检查了一下,但这似乎很好,因为我假设我不需要提供keyFile或keyFilePath,因为它位于AppEngine上(与当我在本地进行操作时。

我已经做了一些相当广泛的搜索,但是找不到任何与之相关的东西。

任何建议将不胜感激。

更新

设法获得更多的错误详细信息。错误消息是“项目XXXX中未使用过IAM服务帐户凭据API”,异常是“ GuzzleHttp \ Exception \ ClientException”。所以看来这是一个403 Forbidden,我想必须与凭据相关,但是我仍然不确定应该如何解决。

2 个答案:

答案 0 :(得分:1)

确保您的AppEngine服务帐户具有iam.serviceAccounts.signBlob权限。您可以通过授予Service Account Token Creator角色来获得它。点击here,获取授予访问权限的指南。

答案 1 :(得分:0)

最后,我通过将服务帐户JSON凭证文件上传到部署中的AppEngine解决了我的问题。

根据我对AppEngien和Cloud Storage文档的了解,我以前已经将此文件包含在.gcloudignore文件中,并且没有在StorageClient的实时配置中使用它,这似乎意味着AppEngine将自动检测到凭据并根据需要应用。

我不确定该解决方案是安全的还是最佳实践,但在这种情况下它是否对我有用。