Skip to content

Instantly share code, notes, and snippets.

@minherz
Last active August 15, 2023 14:53
Show Gist options
  • Save minherz/ae2e665ed3b5ba48dfe793c546574df3 to your computer and use it in GitHub Desktop.
Save minherz/ae2e665ed3b5ba48dfe793c546574df3 to your computer and use it in GitHub Desktop.
Automated rollback of CF
fetch cloud_function
| metric 'cloudfunctions.googleapis.com/function/execution_count'
| {
filter status != 'ok'
;
ident
}
| group_by drop[status], sliding(5m), .sum
| ratio
| scale '%'
| every (30s)
| condition val() > 20'%'
package example
import (
"fmt"
"net/http"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
functions.HTTP("EventHandler", eventHandler)
}
// eventHandler always returns "pong" on "/ping"
// and returns 404 to other requests
func eventHandler(w http.ResponseWriter,
r *http.Request) {
if r.URL.Path != "/ping" {
http.NotFound(w, r)
return
}
fmt.Fprint(w, "pong")
}
package example
import (
"net/http"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
functions.HTTP("EventHandler", eventHandler)
}
// eventHandler fails on "/ping" with 500
// and returns 404 to other requests
func eventHandler(w http.ResponseWriter,
r *http.Request) {
if r.URL.Path != "/ping" {
http.NotFound(w, r)
return
}
http.Error(w, "simulated error", http.StatusInternalServerError)
}
steps:
- name: 'gcr.io/cloud-builders/gcloud'
env:
- 'project_id=$PROJECT_ID'
- 'function_name=$_FUNCTION_NAME'
- 'function_region=$_FUNCTION_REGION'
script: |
#!/usr/bin/env bash
echo "Reading bucket and object for $function_name in $function_region ..."
read -r bucket object <<< $(gcloud functions describe "$function_name" --project="$project_id" --region="$function_region" --format="value(build_config.source.storage_source.bucket,build_config.source.storage_source.object)")
echo "Loading version for gs://$bucket/$object ..."
version=$(gcloud storage ls --all-versions "gs://$bucket/$object" --long | grep -v ^TOTAL | sort -r -k 2 | sed -n '2 p' | awk '{print $3}')
if [[ -n "$version" ]]; then
temp="gs://$bucket/temp.zip"
gcloud storage cp "$version" "$temp"
gcloud functions deploy "$function_name" --project="$project_id" --region="$function_region" --source="$temp"
gcloud storage rm "$temp"
else
echo "Cannot rollback to previous version. Only one version of the function was found."
fi
_FUNCTION_NAME=$(body.message.data.incident.resource.labels.function_name)
_FUNCTION_REGION=$(body.message.data.incident.resource.labels.region)
Cloud Build Settings Enable it to work with Cloud Fuctions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment