Skip to content

Instantly share code, notes, and snippets.

@Apkawa
Created April 24, 2015 13:44
Show Gist options
  • Save Apkawa/437995f9cc789cd36a7a to your computer and use it in GitHub Desktop.
Save Apkawa/437995f9cc789cd36a7a to your computer and use it in GitHub Desktop.
S3 Multiregion bucket wrapper
class S3MultiRegionWrapper(object):
DEFAULT_REGION = 'eu-west-1'
BUCKET_REGIONS_MAP = None
def __init__(self, conn_kwargs):
self.region = conn_kwargs.pop("region", None) or self.DEFAULT_REGION
self.conn_kwargs = conn_kwargs
self.conn_kwargs['aws_access_key_id'] = settings.AWS_ACCESS_KEY_ID
self.conn_kwargs['aws_secret_access_key'] = settings.AWS_SECRET_ACCESS_KEY
self.region_connections = {}
def _get_conn(self, region=None):
from boto.s3 import connect_to_region
region = region or self.region
conn = self.region_connections.get(region)
if not conn:
conn = connect_to_region(region, **self.conn_kwargs)
self.region_connections[region] = conn
return conn
def get_region_for_bucket(self, bucket_name):
if S3MultiRegionWrapper.BUCKET_REGIONS_MAP is None:
conn = self._get_conn()
S3MultiRegionWrapper.BUCKET_REGIONS_MAP = {b.name: b.get_location() for b in conn.get_all_buckets()}
return S3MultiRegionWrapper.BUCKET_REGIONS_MAP.get(bucket_name, self.DEFAULT_REGION)
def get_bucket(self, bucket_name, **kwargs):
region = self.get_region_for_bucket(bucket_name)
return self._get_conn(region).get_bucket(bucket_name)
def __getattribute__(self, item):
try:
return super(S3MultiRegionWrapper, self).__getattribute__(item)
except AttributeError:
return getattr(self._get_conn(), item)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment