cloud_config_service
A lightweight, unified configuration loader for local development, AWS, Azure, and GCP. It centralizes your environment variables in one place (Parameter Store / App Configuration / Secret Manager) and loads them into os.environ at runtime. Also provides a simple decorator to ensure config is loaded before your handler executes.
Features
- Local: Loads from
.env - AWS: Loads from SSM Parameter Store (GetParametersByPath)
- Azure: Loads from Azure App Configuration (connection string or endpoint + Managed Identity)
- GCP: Loads from Secret Manager (lists all secrets in a project and reads latest version)
- Single
load_cloud_config()entrypoint andwith_cloud_config()decorator - Cross-platform (Windows, macOS, Linux)
- Minimal imports: cloud SDKs are only imported when needed
Installation
pip install cloud_config_service
Or from source in your repository root (where README.md and setup.py live):
pip install .
Quick Start
Set two environment variables:
CLOUD_PROVIDER: one oflocal,aws,azure,gcpCONFIG_LOCATION: path/endpoint for the provider (see Providers below). Forlocal, you can leave it empty.
Then:
from cloud_config_service.config_loader import load_cloud_config
config = load_cloud_config()
# Values are now available via os.environ
Providers
Local
CLOUD_PROVIDER=local.envin your current working directory is loaded (key=value pairs).- Example
.env:DATABASE_URL=postgresql://localhost:5432/mydb API_KEY=your-api-key JWT_SECRET=supersecret ENVIRONMENT=development
AWS (SSM Parameter Store)
CLOUD_PROVIDER=awsCONFIG_LOCATION=/trident/awsmarketplace/dev(path prefix)- Permissions: IAM role needs
ssm:GetParametersByPath. - SDK:
boto3
Azure (App Configuration)
CLOUD_PROVIDER=azureCONFIG_LOCATION=either:- Connection string:
Endpoint=https://your-app-config.azconfig.io;Id=...;Secret=... - Endpoint URL:
https://your-app-config.azconfig.io(uses Managed Identity viaDefaultAzureCredential)
- Connection string:
- SDKs:
azure-appconfiguration,azure-identity
GCP (Secret Manager)
CLOUD_PROVIDER=gcpCONFIG_LOCATION=projects/YOUR_PROJECT_ID- Auth: ADC (Application Default Credentials) or service account with Secret Manager access.
- SDK:
google-cloud-secret-manager
Usage
1) Explicit load
import os
from cloud_config_service.config_loader import load_cloud_config
# Typically set in your environment/platform:
# os.environ["CLOUD_PROVIDER"] = "aws"
# os.environ["CONFIG_LOCATION"] = "/trident/awsmarketplace/dev"
config = load_cloud_config() # returns dict and sets environment variables
print("DATABASE_URL:", os.getenv("DATABASE_URL"))
print("API_KEY:", os.getenv("API_KEY"))
2) Decorator for handlers
Use with_cloud_config() to ensure config is loaded before your function runs. Good for AWS Lambda/Azure Functions.
import os
from cloud_config_service.config_loader import with_cloud_config
@with_cloud_config()
def lambda_handler(event, context):
token = os.getenv("JWT_SECRET")
return {"statusCode": 200, "body": "OK"}
Stacking with other decorators (e.g., JWT)
import functools
import os
from cloud_config_service.config_loader import with_cloud_config
def jwt_middleware(func):
@functools.wraps(func)
def wrapper(event, context):
jwt_secret = os.getenv("JWT_SECRET")
# validate token using jwt_secret
return func(event, context)
return wrapper
@with_cloud_config() # load config first
@jwt_middleware
def lambda_handler(event, context):
return {"statusCode": 200, "body": "OK"}
Environment Variables Reference
-
CLOUD_PROVIDER:local|aws|azure|gcp- Default:
local.
-
CONFIG_LOCATION:- local: optional (loads
.envfrom current working directory) - aws: required (e.g.,
/my/app/dev) - azure: required (connection string
Endpoint=...;Id=...;Secret=...or endpoint URL) - gcp: required (e.g.,
projects/my-project)
- local: optional (loads
Permissions and Auth
- AWS: Lambda/EC2 role needs
ssm:GetParametersByPath. - Azure: If using endpoint URL, assign Managed Identity to allow App Configuration access. If using connection string, MSI not required.
- GCP: Ensure your service account or ADC has Secret Manager access and
roles/secretmanager.secretAccessor.
Error Handling
- Missing SDKs are handled gracefully with guidance to install them:
boto3for AWSazure-appconfigurationandazure-identityfor Azuregoogle-cloud-secret-managerfor GCPpython-dotenvfor local.env
- Provider exceptions are caught and printed; wrap
load_cloud_config()in your own error handling for production if desired.
API
from cloud_config_service import load_cloud_config, with_cloud_config
-
load_cloud_config() -> Dict[str, str]:- Reads envs, loads config from the selected provider, returns a dict, and sets
os.environ.
- Reads envs, loads config from the selected provider, returns a dict, and sets
-
with_cloud_config():- Decorator that calls
load_cloud_config()before the wrapped function executes.
- Decorator that calls
Development
- Python >= 3.8 recommended.
- To run locally with
.env, setCLOUD_PROVIDER=localand ensure a.envexists in your working directory.
License
MIT
Metadata
Release files for cloud-config-service 0.1.13
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cloud_config_service-0.1.13.tar.gz | 7.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cloud_config_service-0.1.13-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.7 kB
Release files / cloud_config_service-0.1.13.tar.gz
| Download URL | cloud_config_service-0.1.13.tar.gz |
|---|---|
| Size | 7.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4ff74bf418b06b963cebbc79ae1264671c1b68a2b9967f46c0cfb927e74ce63
|
|
BLAKE2b-256 checksum How to use checksums |
90d0152fad51c710cfc1a458baa2a88c6635ee2a0e6ed51f3c7ede03bba6d4e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|
Release files / cloud_config_service-0.1.13-py3-none-any.whl
| Download URL | cloud_config_service-0.1.13-py3-none-any.whl |
|---|---|
| Size | 8.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a2511d372cfde21d4fca0e09d2848f7b32d58473d710ea5676e2137e0fc97901
|
|
BLAKE2b-256 checksum How to use checksums |
209186033096e437ea0a23363b0cce44a1aaa587b28cdc9c80d261d59172bfbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|