Google Cloud Storage удаляет сущность / пользователя после успешной загрузки

Я разрабатываю приложение Express/Firebase уже несколько недель. Все работало нормально, пока я не столкнулся со следующей проблемой:

TypeError: firebase.storage is not a function

Быстрый поиск привел меня к TypeError: firebase.storage не является функцией. Поэтому, используя собранное там решение, я настроил @google-cloud/storage succesffuly. Но потом я столкнулся с:

Caller does not have storage.objects.create access to bucket example.appspot.com

После еще нескольких поисков я узнал, что должен вручную добавить своего пользователя firebase-admin в example.appspot.com ведро на https://console.cloud.google.com/storage/

После этого я проверяю следующее:

bucket.upload('./package.json')
  .then((file) => {
    console.log(file)
  })
  .catch((error) => {
    console.log(error)
  })

Это работает отлично. Проблема возникает, когда я останавливаю приложение Express и перезапускаю его, чтобы попытаться повторить загрузку, что приводит к Caller does not have... ошибка снова. Проверяя права доступа, я вижу, что пользователь, которого я добавил ранее, теперь исчез:

Я не знаю, если я что-то здесь упускаю, ошибка в @google-cloud/storage пакет или ошибка где-то еще. Есть идеи?

1 ответ

Решение

GCS считает каждую загрузку совершенно новым объектом. Если объект разделяет имя как существующий объект, ранее существующий объект будет удален, а новые свойства, включая ACL, не будут иметь отношения к старому.

Вы можете исправить это несколькими способами. Проще всего было бы добавить хранилище firebase-хранилища к "списку ACL объекта по умолчанию", что приведет к тому, что все вновь созданные объекты будут иметь ACL, включающий эту учетную запись службы, если не указано иное. Из командной строки, если у вас установлен gcloud SDK, вы можете сделать это следующим образом:

gsutil defacl ch -u firebase-storage@system.gserviceaccount.com:O gs://bucketname

Другим вариантом было бы явно установить ACL как часть загрузки или сразу после нее.