Skip to content

Instantly share code, notes, and snippets.

@dhermes
Created February 14, 2025 17:50
Show Gist options
  • Save dhermes/ac01b9a99d90820dc63bb91e6583ce2d to your computer and use it in GitHub Desktop.
Save dhermes/ac01b9a99d90820dc63bb91e6583ce2d to your computer and use it in GitHub Desktop.
[2025-02-14] Manually patch scaling on App Engine service
import json
import subprocess
import click
import requests
### https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1beta/apps.services.versions/get
### https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1beta/apps.services.versions/patch
def get_access_token():
cmd = ("gcloud", "auth", "print-access-token")
token = subprocess.check_output(cmd)
return token.decode("ascii").strip()
@click.command()
@click.option("--project", "project", type=str, required=True)
@click.option("--service", "service", type=str, required=True)
@click.option("--version", "version", type=str, required=True)
@click.option("--min-total-instances", "min_total_instances", type=int, required=True)
@click.option("--max-total-instances", "max_total_instances", type=int, required=True)
def run_main(
project: str,
service: str,
version: str,
min_total_instances: int,
max_total_instances: int,
):
access_token = get_access_token()
headers = {
"X-Goog-User-Project": project,
"Accept": "application/json",
"Authorization": f"Bearer {access_token}",
}
url1 = f"https://appengine.googleapis.com/v1beta/apps/{project}/services/{service}/versions/{version}"
url2 = f"https://appengine.googleapis.com/v1beta/apps/{project}/services/{service}/versions/{version}?updateMask=automatic_scaling.min_total_instances,automatic_scaling.max_total_instances"
session = requests.Session()
get_response = session.get(url1, headers=headers)
if get_response.status_code != 200:
raise RuntimeError("Wrong status for GET", get_response.status_code)
version_body = get_response.json()
version_body["automaticScaling"]["minTotalInstances"] = min_total_instances
version_body["automaticScaling"]["maxTotalInstances"] = max_total_instances
patch_response = session.patch(url2, json=version_body, headers=headers)
print(patch_response)
if patch_response.status_code == 200:
return
print(json.dumps(json.loads(patch_response.content), indent=2))
if __name__ == "__main__":
run_main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment