TheBen
TheBen

Reputation: 3520

Is it possible to scope Firebase functions to a folder inside a storage bucket?

I have tested Firebase functions for storage successfully. However, I havn't seen anywhere a hint how to only invoke the function when a file is added into a folder inside my bucket. The only hint I have seen about scoping the function is for different buckets here.

Is it possible to scope the function to a folder inside my bucket , if yes how? Or would I need to have multiple buckets instead of folders to separate different tasks.

Upvotes: 21

Views: 5109

Answers (4)

chromebookdev
chromebookdev

Reputation: 494

This is better late than never. You can trigger from the audit log.

You want to create something like the following:

gcloud eventarc triggers update <trigger-name> \
  --destination-run-service="<function name>" \
  --destination-run-region="<region of function>" \
  --location="<region of trigger and bucket>" \
  --event-filters="methodName=storage.objects.create" \
  --event-filters="resourceLocation=<region same as location>"\
  --event-filters="type=type=google.cloud.audit.log.v1.written"
  --event-filters-path-pattern="projects/_/buckets/<your bucket name>/objects/<your filter pattern>"

Further reading available here: https://cloud.google.com/eventarc/docs/path-patterns

Not all services offer the path-pattern filtering, so you need to run something like this to get the details: gcloud eventarc providers describe cloudaudit.googleapis.com

I hope that helps, 6 years later :D

Feel free to update to relate to firebase more specifically or mark as answered.

Upvotes: 0

Muhammad bin Yusrat
Muhammad bin Yusrat

Reputation: 1463

Please note that Google Cloud Storage works on a flat filesystem. So practically there are no directories. If you're storing a file like /users/profile_pictures/photo.jpg it is basically all part of the file name. So in reality, there are no directories. There are just files. Which is why there cannot be a trigger on a directory per se. Of course you can work that around by checking the name of the file itself and see whether its start matches a particular string or not.

export const generateThumbnailTrigger = functions.storage.object().onFinalize(async (object) => {
    const filePath = object.name;
    if (filePath?.startsWith('temp/')) {
        console.log('start doing something with the file');
    } else {
        return false;
    }
});

Upvotes: 5

Frank van Puffelen
Frank van Puffelen

Reputation: 599716

firebaser here

There is currently no way to trigger Cloud Functions only for writes in a specific folder in Cloud Storage. If you want to limit the triggering to a subset of the files in your project, putting them in a separate bucket is currently the only way to accomplish that.

As a workaround, you can write metadata about the image to a supported database (Realtime Database or Cloud Firestore), and use that to trigger a Cloud Function that transforms the file. This is what I usually do, as it also allows me to capture the metadata in a format that can be queried.

Upvotes: 26

Er.Se
Er.Se

Reputation: 476

You may check inside the function. Get the "filePath" or "fileDir" on your function and check if it is the folder you want.

const path = require('path');
const filePath = event.data.name;
const fileDir = path.dirname(filePath);

//if you want to check the posts folder only then:

if (fileDir != 'posts') {
    console.log('This is not in post folder');
    return null;
}

Upvotes: 5

Related Questions