【问题标题】:beginSignedUploadSession() causing error live on PHP AppEngine Flex but not LocallybeginSignedUploadSession() 在 PHP AppEngine Flex 上导致错误,但不是在本地
【发布时间】:2019-06-14 01:47:19
【问题描述】:

我正在尝试让用户从 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) 但它没有提供其他详细信息。 AppEngine 日志不显示除错误 500 以外的任何信息。

假设 #403 可能意味着 Forbidden 并且问题出在凭据上,我已经重新检查了这一点,但这似乎很好,因为我认为我不需要提供 keyFile 或 keyFilePath,因为它在 AppEngine 上(不像当我在本地做时)。

我进行了一些相当广泛的搜索,但找不到任何似乎相关的内容。

任何建议将不胜感激。

更新

设法获取更多错误详细信息。错误消息是“IAM Service Account Credentials API has not been used in project XXXX”,异常是“GuzzleHttp\Exception\ClientException”。所以它似乎是一个 403 Forbidden 并且我想一定是与凭据相关但我仍然不确定我应该如何解决这个问题。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回复 jdp。我按照您的建议将此角色添加到服务帐户,但仍然出现相同的错误。我等了一会儿才给它时间更新以防万一。另外,我还尝试添加存储管理员角色,但结果相同。还有什么我应该寻找的吗?另外,只是想澄清一下,我一直在本地使用 KeyFilePath 中的 JSON 文件,但根据文档假设在实时服务器中这不是必需的。我应该上传这个文件并设置实时吗?
  • 您的服务帐号是否有权写入存储桶中的对象?我会推荐:roles/storage.admin or roles/storage.objectAdmin
  • 我曾尝试添加存储管理员角色,我认为该角色可能包括所有其他存储角色,但没有任何区别。
  • 确保 IAM API 已启用:cloud.google.com/iam/docs/quickstart。你是对的;让 AppEngine 为您处理身份验证。您无需在该上下文中提供密钥文件。 :)
【解决方案2】:

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

我之前已将其包含在 .gcloudignore 文件中,但根据我对 AppEngien 和 Cloud Storage 文档的理解,我没有在 StorageClient 的实时配置中使用它,这似乎暗示 AppEngine 将自动检测凭据并根据需要应用。

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

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2021-12-02
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多