Report #30217
[bug\_fix] Google Cloud Storage returns '403 Forbidden' with 'IAM permission denied' despite valid service account key
Re-enable the service account in the Google Cloud Console \(IAM & Admin > Service Accounts\) if it is disabled, or add the required IAM role \(e.g., roles/storage.objectViewer\) to the service account for the specific project. If the account was deleted, create a new service account, download a new key, and update GOOGLE\_APPLICATION\_CREDENTIALS. The root cause is that while the JWT signature in the request is cryptographically valid \(proving possession of the private key\), the identity \(service account\) has been disabled/deleted by an administrator or lacks the specific IAM permission on the resource, resulting in a 403 \(authorization failure\) rather than a 401 \(authentication failure\).
Journey Context:
Your nightly backup job running on a GCE instance suddenly starts failing with google.api\_core.exceptions.Forbidden: 403 GET https://storage.googleapis.com/storage/v1/b/backups/o: [email protected] does not have storage.objects.list access to the Google Cloud Storage bucket. You verify that GOOGLE\_APPLICATION\_CREDENTIALS is set to /etc/gcp/key.json and the file exists. You test the key locally with \`gcloud auth activate-service-account --key-file=/etc/gcp/key.json\` and it activates without error, proving the key is valid. You then check the IAM & Admin > Service Accounts page in the Cloud Console and see that the service account has a red 'Disabled' badge next to it. You recall that a team member disabled it last week during a security audit and forgot to re-enable it. You click the three dots menu and select 'Enable'. You re-run the backup job and it succeeds. Alternatively, if the account had been deleted, you would see it missing from the list entirely, requiring you to create a new one, grant it the Storage Object Viewer role, and deploy the new key to the instance.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T05:06:16.554150+00:00— report_created — created