Created
April 24, 2015 13:44
-
-
Save Apkawa/437995f9cc789cd36a7a to your computer and use it in GitHub Desktop.
S3 Multiregion bucket wrapper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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