Last week, I finally got around to hitting the GCP API directly using Python. It’s pretty easy to do in hindsight. Steps are below
If not done already, install PIP. On Debian 10, the command is this:
sudo apt install python3-pip
Then of course install the Python packages for GCP:
sudo pip3 install google-api-python-client google-cloud-storage
Now you’re ready to write some Python code. Start with a couple imports:
#!/usr/bin/env python3
from googleapiclient import discovery
from google.oauth2 import service_account
By default, the default compute service account for the VM or AppEngine will be used for authentication. Alternately, a service account can be specific with the key’s JSON file:
KEY_FILE = '../mykey.json'
creds = service_account.Credentials.from_service_account_file(KEY_FILE)
Connecting to the Compute API will look like this. If using the default service account, the ‘credentials’ argument is not required.
resource_object = discovery.build('compute', 'v1', credentials=creds)
All API calls require the project ID (not name) be provided as a parameter. I will set it like this:
PROJECT_ID = "myproject-1234"
With the connection to the API established, you can now run some commands. The resource object will have several methods, and in each there will typically be a list() method to list the items in the project. The execute() at the end is required to actually execute the call.
_ = resource_object.firewalls().list(project=PROJECT_ID).execute()
It’s important to note the list().execute() returns a dictionary. The actual list of items can be found in key ‘items’. I’ll use the get() method to retrieve the values for the ‘items’ key, or use an empty list if ‘items’ doesn’t exist. Here’s an example
firewall_rules = _.get('items', [])
print(len(firewall_rules), "firewall rules in project", PROJECT_ID)
for firewall_rule in firewall_rules:
print(" -", firewall_rule['name'])
The API reference guide has a complete list of everything that’s available. Here’s some examples:
firewalls() - List firewall rules
globalAddresses() - List all global addresses
healthChecks() - List load balancer health checks
subnetworks() - List subnets within a given region
vpnTunnels() - List configured VPN tunnels
Some calls will require the region name as a parameter. To get a list of all regions, this can be done:
_ = resource_object.regions().list(project=PROJECT_ID).execute()
regions = [region['name'] for region in _.get('items', [])]
Then iterate through each region. For example to list all subnets:
for region in regions:
_ = resource_object.subnetworks().list(project=PROJECT_ID,region=region).execute()
print("Reading subnets for region", region ,"...")
subnets = _.get('items', [])
for subnet in subnets:
print(" -", subnet['name'], subnet['ipCidrRange'])