Google Storageclient.ListObjects вызывает отмену потока при развертывании на сервере

У меня есть код, который извлекает файлы из Google Cloud Storage. Код отлично работает при запуске на моем локальном компьютере для разработки, но при развертывании на нашем рабочем сервере он всегда «останавливается» всякий раз, когда используется параметр «objectsInBucket» (в приведенном ниже коде).

В приведенном ниже примере последним кодом, который действительно правильно выполняется при развертывании на сервере, является строка «LogHelper.LogToConsole («-6»).

Если я «раскомментирую» цикл foreach, последний вывод на консоль будет «- 4». Кроме того, если я, например, создам переменную типа "var count = objectsInBucket.Count();" и поместите его сразу после "objectsInBucket = storageClient.Listobjects(_gcsBucketName);" тогда последним выходом будет «- 1».

Но, как я уже сказал, эта проблема возникает только при развертывании на сервере. Так что может быть причиной этого?

 Google.Api.Gax.PagedEnumerable<Google.Apis.Storage.v1.Data.Objects, Google.Apis.Storage.v1.Data.Object> objectsInBucket = null;
                
 LogHelper.LogToConsole($" - 1");
 objectsInBucket = storageClient.ListObjects(_gcsBucketName);
 LogHelper.LogToConsole($" - 2");
 //var count = objectsInBucket.Count(); // this causes last output to be "- 2"
 var dirPath = Path.Combine(_gcsAttachemntPath, attachmentId);
 LogHelper.LogToConsole($" - 3");

 if (objectsInBucket != null)
 {
    LogHelper.LogToConsole($" - 4");
    //LogHelper.LogToConsole($" - {objectsInBucket.Count()} attachments exists on bucket:");
    //foreach (var obj in objectsInBucket)
    //{
    //    LogHelper.LogToConsole($" - - {obj.Name}");
    //}
     LogHelper.LogToConsole($" - 5");
     var directoryInfo = new DirectoryInfo(dirPath);
     if (directoryInfo.Exists)
     {
       LogHelper.LogToConsole($" - Deleting directory: {dirPath}");
       directoryInfo.Delete(true);
     }
    
    directoryInfo.Create();
    LogHelper.LogToConsole($" - Directory created: {dirPath}");
 }
 
 LogHelper.LogToConsole($" - 6");
 var attachmentFiles = objectsInBucket.Where(x => x.Name.Contains(attachmentId));

Разрешения? Вы не включаете достаточно кода для воспроизведения своего опыта (что затрудняет помощь), но, надеюсь, вы используете учетные данные приложения по умолчанию. Когда вы запускаете код локально, вы, вероятно, используете gcloud auth application-default учетные данные, которые используют вашу учетную запись пользователя (и ее разрешения). Когда вы запускаете службу вычислений, вы используете удостоверение экземпляра, и у него разные разрешения.

DazWilkin 08.11.2022 18:02

Мы подключаемся к проекту/сегменту, используя учетные данные из json-файла, содержащего project_id, Private_key_id, private_key и т. д. Мы используем те же учетные данные на машине разработчика, что и на сервере. Чтобы, возможно, дать дополнительную информацию, я могу добавить, что код читает сообщения из очереди сообщений, и если сообщение имеет вложение, я читаю это вложение, и именно тогда я использую «StorageClient.ListObjects», который дает «Задача была отменена» - ошибка при установке на сервер. Итак, чтение сообщений работает нормально, но чтение вложений не работает.. (на сервере)

Toby Fieldgroove 10.11.2022 15:54

Очень сложно решать проблемы с помощью расширенной серии комментариев, и это не предоставляет повторно используемый контент для других. Не следует использовать ключ учетной записи службы (файл JSON) напрямую при развертывании в службе вычислений. Вы должны (и, возможно, будете) использовать учетные данные экземпляра службы вычислений. Я подозреваю (!), что на самом деле вы используете учетные данные экземпляра, а не файл JSON при развертывании в Google Cloud, и у этого удостоверения нет правильных разрешений для облачного хранилища. Удачи!

DazWilkin 10.11.2022 17:36

Вы можете взглянуть на мой ответ?

Rohit Kharche 29.12.2022 07:14
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
4
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из кода, которым вы поделились, кажется, вы хотите добиться этого: если объект существует в папке, вы хотите удалить объект и создать подпапку в той же папке. Если он не существует, создайте подпапку непосредственно в папке..I я не очень разбираюсь в С#, я думаю, что приведенный ниже код может вам помочь.

StorageClient storageClient = StorageClient.Create(projectId);
string bucketName = "bucketName";
string folderName = "folderToCreate";
string objectName = "ObjectToCheckToExist";
bool objectExists = storageClient.GetObject(bucketName, $"{folderName}/{objectName}") != null;
if (objectExists){   
 storageClient.DeleteObject(bucketName, $"{folderName}/{objectName}");
 storageClient.DeleteFolder(bucketName, folderName);
}
else {
    storageClient.CreateFolder(bucketName, folderName);
}

Также ознакомьтесь с официальным документом.

Ответ принят как подходящий

ответы были высоко оценены.

Оказывается, этот звонок по какой-то причине был заблокирован в фаерволе на сервере. Нам предоставили прокси для использования при совершении этих звонков. Потом при использовании прокси все работало нормально.

Другие вопросы по теме