This article describes the steps to integrate Slack with Google Cloud Functions to get notified about object events within a specified Google Cloud Storage bucket.
Events could include the creation of new objects, as well as delete, archive or metadata operations performed on a given bucket.
This pattern could be easily extended to other event sources supported by Cloud Functions including:
- Cloud Pub/Sub messages
- Cloud Firestore and Firebase events
- Stackdriver log entries
More information can be found at https://cloud.google.com/functions/docs/concepts/events-triggers.
The prerequisite steps to configure Slack are provided here:
- First you will need to create a Slack app (assuming you have already set up an account and a workspace). The following screenshots demonstrate this process:
- Next you need to Enable and Activate Incoming Webhooks to your app and add this to your workspace. The following screenshots demonstrate this process:
- Next you need to specify a channel for notifications generated from object events.
- Now you need to copy the Webhook url provided, you will use this later in your Cloud Function.
Treat your webhook url as a secret, do not upload this to a public source code repository
Next you need to create your Cloud Function, this example uses Python but you can use an alternative runtime including Node.js or Go.
This example templates the source code using the Terraform template_file
data source. The function source code is shown here:
Within your Terraform code you need to render your Cloud Function code substituting the slack_webhook_url
for it's value which you will supply as a Terraform variable. The rendered template file is then placed in a local directory along with a requirements.txt
file and zipped up. The resulting Zip archive is uploaded to a specified bucket where it will be sourced to create the Cloud Function.
Now you need to create the Cloud Function, the following HCL snippet demonstrates this:
The event_trigger
block in particular specifies which GCS bucket to watch and what events will trigger invocation of the function. Bucket events include:
google.storage.object.finalize
(the creation of a new object)google.storage.object.delete
google.storage.object.archive
google.storage.object.metadataUpdate
You could add additional logic to the Cloud Function code to look for specific object names or naming patterns, but keep in mind the function will fire upon every event matching the event_type
and resource
criteria.
To deploy the function, you would simply run:
terraform apply -var="slack_webhook_url=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"
Now once you upload a file named test-object.txt
, voilà!:
Full source code is available at: https://github.com/gamma-data/gcs-object-notifications-using-slack
if you have enjoyed this post, please consider buying me a coffee ☕ to help me keep writing!