This guide explains how to upgrade your LiteLLM deployment to use Google Secret Manager for secure secret management.
🚀 Automated Setup: You can skip the manual steps below by using our provisioning script:
./scripts/provision_gcloud.sh. This script automatically creates all required secrets, Cloud SQL, and Redis instances.
- Security: Secrets are encrypted at rest and in transit
- Audit Trail: Complete visibility into who accessed which secrets and when
- IAM Control: Fine-grained access control using standard Google Cloud IAM roles
- Versioning: Automatic versioning with rollback capability
- Compliance: Meets enterprise security requirements
-
Enable the Secret Manager API:
gcloud services enable secretmanager.googleapis.com -
Verify you have the following IAM roles:
roles/secretmanager.admin(orroles/secretmanager.secretAdmin)roles/run.developer
Create each secret using the following commands:
gcloud secrets create database-url \
--data-file=<(echo -n "postgresql://user:password@host:5432/dbname")gcloud secrets create litellm-master-key \
--data-file=<(echo -n "sk-your-master-key-here")
gcloud secrets create litellm-salt-key \
--data-file=<(echo -n "sk-your-salt-key-here")gcloud secrets create ui-username \
--data-file=<(echo -n "admin")
gcloud secrets create ui-password \
--data-file=<(echo -n "your-secure-password")gcloud secrets create redis-host \
--data-file=<(echo -n "your-redis-host")
gcloud secrets create redis-password \
--data-file=<(echo -n "your-redis-password")gcloud secrets create langfuse-secret-key \
--data-file=<(echo -n "sk-lf-your-key")
gcloud secrets create langfuse-public-key \
--data-file=<(echo -n "pk-lf-your-key")
gcloud secrets create context7-api-key \
--data-file=<(echo -n "ctx7sk-your-key")
gcloud secrets create tavily-api-key \
--data-file=<(echo -n "tvly-your-key")Find your Cloud Run service's service account:
gcloud run services describe litellm-proxy \
--region=us-central1 \
--format="value(spec.template.spec.serviceAccountName)"Grant the service account access to secrets:
PROJECT_ID="your-project-id"
SERVICE_ACCOUNT=$(gcloud run services describe litellm-proxy \
--region=us-central1 \
--format="value(spec.template.spec.serviceAccountName)")
# Grant secret accessor role
gcloud secrets add-iam-policy-binding database-url \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/secretmanager.secretAccessor"
# Repeat for all secrets
for secret in litellm-master-key litellm-salt-key ui-password redis-password \
langfuse-secret-key langfuse-public-key context7-api-key tavily-api-key; do
gcloud secrets add-iam-policy-binding $secret \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/secretmanager.secretAccessor"
doneUpdate your deployment to reference secrets:
# Add secret references to deploy_gcloud.sh
gcloud run deploy litellm-proxy \
--image gcr.io/$PROJECT_ID/litellm-proxy \
--platform managed \
--region us-central1 \
--memory 4Gi \
--cpu 2 \
--port 4000 \
--set-secrets=DATABASE_URL=database-url:latest \
--set-secrets=LITELLM_MASTER_KEY=litellm-master-key:latest \
--set-secrets=LITELLM_SALT_KEY=litellm-salt-key:latest \
--set-secrets=UI_USERNAME=ui-username:latest \
--set-secrets=UI_PASSWORD=ui-password:latest \
--set-secrets=REDIS_HOST=redis-host:latest \
--set-secrets=REDIS_PASSWORD=redis-password:latest \
--set-secrets=LANGFUSE_SECRET_KEY=langfuse-secret-key:latest \
--set-secrets=LANGFUSE_PUBLIC_KEY=langfuse-public-key:latest \
--set-secrets=CONTEXT7_API_KEY=context7-api-key:latest \
--set-secrets=TAVILY_API_KEY=tavily-api-key:latest \
--set-env-vars=STORE_MODEL_IN_DB=True \
--set-env-vars=LITELLM_LOG=INFO \
--set-env-vars=REDIS_PORT=6379 \
--set-env-vars=LANGFUSE_BASE_URL=https://cloud.langfuse.com \
--allow-unauthenticated- Go to Cloud Run service
- Click "Edit & Deploy New Revision"
- Scroll to "Variables & Secrets"
- For each secret:
- Click "Reference a secret"
- Select the secret
- Set the environment variable name
- Click Deploy
After verifying deployment works:
# Remove old environment variables
gcloud run services update litellm-proxy \
--region=us-central1 \
--clear-env-vars \
--update-secrets DATABASE_URL=database-url:latest,LITELLM_MASTER_KEY=litellm-master-key:latest,...gcloud secrets listgcloud secrets describe database-urlgcloud secrets versions access latest --secret=database-urlecho -n "new-value" | gcloud secrets versions add database-url --data-file=-# Disable secret first (required)
gcloud secrets versions disable latest --secret=database-url
# Then delete
gcloud secrets delete database-url# Add new version
echo -n "new-secret-value" | gcloud secrets versions add litellm-master-key --data-file=-
# Grant new version access (automatically inherits latest version)
gcloud run services update litellm-proxy \
--region=us-central1 \
--update-secrets=LITELLM_MASTER_KEY=litellm-master-key:latest# Create Cloud SQL instance
gcloud sql instances create litellm-db \
--tier=db-f1-micro \
--region=us-central1 \
--database-version=POSTGRES_15
# Create database
gcloud sql databases create litellm --instance=litellm-db
# Create user
gcloud sql users create litellm --instance=litellm-db --password=secure-password
# Get connection string
gcloud sql instances describe litellm-db --format="value(connectionName)"# Create Memorystore instance
gcloud redis instances create litellm-redis \
--region=us-central1 \
--tier=STANDARD \
--memory-size-gb=1 \
--redis-version=redis_7_2
# Get connection host
gcloud redis instances describe litellm-redis \
--region=us-central1 \
--format="value(host)"-
Use Principle of Least Privilege
- Grant
roles/secretmanager.secretAccessoronly to service accounts that need it - Avoid using
roles/secretmanager.adminin production
- Grant
-
Rotate Secrets Regularly
- Create new secret versions periodically
- Update Cloud Run to use latest version
-
Monitor Secret Access
- Enable Secret Manager audit logs
- Set up alerts for unauthorized access attempts
-
Use Secret Versioning
- Always reference specific versions when possible
- Use
latestonly during migrations
# Verify service account has correct IAM role
gcloud secrets get-iam-policy database-url# Verify secret exists
gcloud secrets list# Check logs
gcloud run services logs tail litellm-proxy --region=us-central1
# Verify secret values are correct
gcloud secrets versions access latest --secret=database-url# IAM changes can take 2-5 minutes to propagate
# Try redeploying the service
gcloud run services update litellm-proxy --region=us-central1