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 как часть загрузки или сразу после нее.