def create_aws_client(service_name='s3'): """ - Local: uses SSO profile if AWS_PROFILE is set - Cloud: falls back to default chain (instance/role) """ profile = os.environ.get("AWS_PROFILE") region = os.environ.get("AWS_REGION", "us-west-2") if profile: try: boto3.setup_default_session(profile_name=profile, region_name=region) except ProfileNotFound as e: raise RuntimeError(f"AWS profile '{profile}' not found") from e else: boto3.setup_default_session(region_name=region) return boto3.client(service_name)if __name__ == "__main__": s3 = create_aws_client('s3') resp = s3.list_buckets() print([b['Name'] for b in resp.get('Buckets', [])])
import boto3from botocore.exceptions import ProfileNotFound, NoCredentialsErrordef create_aws_client_with_profile(service_name='s3', profile_name=None, region='us-west-2'): try: if profile_name: session = boto3.Session(profile_name=profile_name, region_name=region) return session.client(service_name) # Cloud: default chain (role/metadata) return boto3.client(service_name, region_name=region) except ProfileNotFound as e: raise RuntimeError(f"AWS profile '{profile_name}' not found") from e except NoCredentialsError as e: raise RuntimeError("No AWS credentials available") from e# Usage exampledef example_usage(): # For local development, set your SSO profile profile = "<project>-workload-development" # Create clients with the chosen profile s3_client = create_aws_client_with_profile('s3', profile) ses_client = create_aws_client_with_profile('ses', profile) # Example: list S3 buckets try: buckets = s3_client.list_buckets() print("S3 Buckets:") for b in buckets.get("Buckets", []): print(f" - {b['Name']}") except Exception as e: print(f"Error listing buckets: {e}")if __name__ == "__main__": example_usage()
import osimport boto3from typing import Optionalclass AWSClientManager: """Centralized AWS client/session management with SSO support.""" def __init__(self, profile_name: Optional[str] = None, region: Optional[str] = None): self.profile_name = profile_name or os.getenv("AWS_PROFILE") self.region = region or os.getenv("AWS_REGION", "us-west-2") self._session = None @property def session(self) -> boto3.session.Session: if not self._session: if self.profile_name: self._session = boto3.Session(profile_name=self.profile_name, region_name=self.region) else: self._session = boto3.Session(region_name=self.region) return self._session def client(self, service_name: str): return self.session.client(service_name) def resource(self, service_name: str): return self.session.resource(service_name)# Exampleif __name__ == "__main__": aws = AWSClientManager() s3 = aws.client('s3') print([b['Name'] for b in s3.list_buckets().get('Buckets', [])])
# Set profile for your development sessionexport AWS_PROFILE=<project>-<development_workload_account>export AWS_REGION=us-west-2# Run your Python applicationpython app.py
# Set environment variablesexport NODE_ENV=developmentexport AWS_PROFILE=<project>-<production_workload_account>export AWS_REGION=us-west-2# Run your Node.js applicationnpm start
# Local development NODE_ENV=developmentAWS_PROFILE=<project>-<development_workload_account>AWS_REGION=us-west-2# APP settingsLOG_LEVEL=debugAPI_BASE_URL=https://staging-api.<project>.com
# AWS Cloud environment NODE_ENV=production# AWS_PROFILE not set - uses IAM rolesAWS_REGION=us-west-2# Application settingsLOG_LEVEL=infoAPI_BASE_URL=https://api.<project>.com