Firebase Storage: программно удалять файлы из / tmp / - PullRequest
0 голосов
/ 20 марта 2020

Я испортил облачную функцию Firebase и случайно создал 1,9 миллиона изображений, хранящихся в gs://myapp.appspot.com//tmp/. Этот двойной sla sh является точным - сервер записывал в /tmp/, что, я думаю, приводит к пути, указанному выше.

Я сейчас хочу удалить эти файлы (все они чепуха ). Я попытался использовать оболочку Python следующим образом:

export GOOGLE_APPLICATION_CREDENTIALS="../secrets/service-account.json"

Затем:

from google.cloud import storage

storage_client = storage.Client()
bucket = storage_client.get_bucket('tmp')
blobs = bucket.list_blobs(bucket='tmp', prefix='')
for blob in blobs:
  print(' * deleting', blob)
  blob.delete()

Но это бросает:

google.api_core.exceptions.Forbidden: 403 GET https://storage.googleapis.com/storage/v1/b/tmp?projection=noAcl: firebase-adminsdk-yr6f8@myapp.iam.gserviceaccount.com does not have storage.buckets.get access to tmp.

Кто-нибудь знает, как разрешить учетные данные администратора для удаления из /tmp/? Любые указатели были бы чрезвычайно полезны!

1 Ответ

1 голос
/ 20 марта 2020

Мне удалось воспроизвести эту проблему с помощью команды gsutil:

gsutil cp ~/<example-file> gs://<my-project-name>.appspot.com//tmp/

Прежде всего, на моей консоли Firebase Я могу сделать это с помощью одной галочки (вся папка) не уверен, если вы считаете это.

В любом случае, если вы хотите, чтобы это было сделано с API, я нашел следующее решение.

  1. Я думаю (по сравнению с моим тестом) имя корзины должно быть : myapp.appspot.com
  2. Если вы напечатаете BLOB-объекты в python, вы получите что-то вроде этого: <Blob: <my-project-name>.appspot.com, /tmp/<example-file>, 1584700014023619>

2-е значение - это свойство name объекта blob. Я заметил, что в этой ситуации его имя blob начинается с /tmp/

Код, который работает на моей стороне:

from google.cloud import storage
storage_client = storage.Client()
bucket = storage_client.get_bucket('myapp.appspot.com')
blobs = bucket.list_blobs()
for blob in blobs:
        if blob.name.startswith('/tmp/'):
                print(' * deleting', blob)
                blob.delete()

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

Надеюсь, это поможет!

...