beginSignedUploadSession (), вызывающий ошибку в реальном времени на PHP AppEngine Flex, но не локально - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь получить пользовательские загрузки напрямую в Google Cloud Storage из моего приложения в AppEngine Flex (PHP 7.2).Код работает локально (не используя локальный сервер разработки 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) возвращает ошибку (# 403), но никаких других подробностей он не представляет.Журналы AppEngine не показывают никакой информации, кроме ошибки 500.

Предполагая, что # 403 может означать Запрещено и что проблема была с учетными данными, я перепроверил это, но, кажется, хорошо, так как я предполагаюМне не нужно предоставлять keyFile или keyFilePath, потому что он находится в AppEngine (в отличие от того, когда я делаю это локально).

Я провел несколько довольно обширных поисков, но не могу найти ничего, что, по-видимому, связано.

Будем весьма благодарны за любые предложения.

Обновление

Удалось получить более подробную информацию об ошибке.Сообщение об ошибке «API учетных данных службы IAM не использовался в проекте XXXX», а исключение - «GuzzleHttp \ Exception \ ClientException».Похоже, это 403 Forbidden, и я думаю, это должно быть связано с учетными данными, но я все еще не уверен, как мне это исправить.

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Убедитесь, что ваша учетная запись службы AppEngine имеет разрешение iam.serviceAccounts.signBlob. Вы можете получить его, предоставив роль Service Account Token Creator. Нажмите здесь для руководства по предоставлению доступа.

0 голосов
/ 27 июня 2019

В конце концов я решил свою проблему, загрузив файл учетных данных JSON своей учетной записи службы в AppEngine в моем развертывании.

Ранее я включил это в файл .gcloudignore и не использовал его в оперативной конфигурации для StorageClient, основываясь на моем понимании документации для AppEngien и Cloud Storage, которая, как казалось, подразумевала, что AppEngine автоматически обнаруживает учетные данные и применяется по мере необходимости.

Я не уверен, является ли это решение безопасным или оптимальным, но в этом случае оно сработало.

...