diff --git a/moto/s3/responses.py b/moto/s3/responses.py
index 13e5f87d9..1eb010842 100755
--- a/moto/s3/responses.py
+++ b/moto/s3/responses.py
@@ -193,7 +193,13 @@ class ResponseObject(_TemplateEnvironmentMixin):
elif 'location' in querystring:
bucket = self.backend.get_bucket(bucket_name)
template = self.response_template(S3_BUCKET_LOCATION)
- return template.render(location=bucket.location)
+
+ location = bucket.location
+ # us-east-1 is different - returns a None location
+ if location == DEFAULT_REGION_NAME:
+ location = None
+
+ return template.render(location=location)
elif 'lifecycle' in querystring:
bucket = self.backend.get_bucket(bucket_name)
if not bucket.rules:
@@ -432,8 +438,19 @@ class ResponseObject(_TemplateEnvironmentMixin):
else:
if body:
+ # us-east-1, the default AWS region behaves a bit differently
+ # - you should not use it as a location constraint --> it fails
+ # - querying the location constraint returns None
try:
- region_name = xmltodict.parse(body)['CreateBucketConfiguration']['LocationConstraint']
+ forced_region = xmltodict.parse(body)['CreateBucketConfiguration']['LocationConstraint']
+
+ if forced_region == DEFAULT_REGION_NAME:
+ raise S3ClientError(
+ 'InvalidLocationConstraint',
+ 'The specified location-constraint is not valid'
+ )
+ else:
+ region_name = forced_region
except KeyError:
pass
@@ -1176,7 +1193,7 @@ S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """
"""
S3_BUCKET_LOCATION = """
-{{ location }}"""
+{% if location != None %}{{ location }}{% endif %}"""
S3_BUCKET_LIFECYCLE_CONFIGURATION = """
diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py
index ffafc0dfd..9db4829ca 100644
--- a/tests/test_s3/test_s3.py
+++ b/tests/test_s3/test_s3.py
@@ -977,6 +977,15 @@ def test_bucket_location():
bucket.get_location().should.equal("us-west-2")
+@mock_s3_deprecated
+def test_bucket_location_us_east_1():
+ cli = boto3.client('s3')
+ bucket_name = 'mybucket'
+ # No LocationConstraint ==> us-east-1
+ cli.create_bucket(Bucket=bucket_name)
+ cli.get_bucket_location(Bucket=bucket_name)['LocationConstraint'].should.equal(None)
+
+
@mock_s3_deprecated
def test_ranged_get():
conn = boto.connect_s3()
@@ -1300,6 +1309,16 @@ def test_bucket_create_duplicate():
exc.exception.response['Error']['Code'].should.equal('BucketAlreadyExists')
+@mock_s3
+def test_bucket_create_force_us_east_1():
+ s3 = boto3.resource('s3', region_name='us-east-1')
+ with assert_raises(ClientError) as exc:
+ s3.create_bucket(Bucket="blah", CreateBucketConfiguration={
+ 'LocationConstraint': 'us-east-1',
+ })
+ exc.exception.response['Error']['Code'].should.equal('InvalidLocationConstraint')
+
+
@mock_s3
def test_boto3_bucket_create_eu_central():
s3 = boto3.resource('s3', region_name='eu-central-1')
diff --git a/tox.ini b/tox.ini
index 0f3f1466a..1830c2e1b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -8,6 +8,10 @@ deps =
commands =
{envpython} setup.py test
nosetests {posargs}
+setenv =
+ AWS_ACCESS_KEY_ID=dummy_key
+ AWS_SECRET_ACCESS_KEY=dummy_secret
+ AWS_DEFAULT_REGION=us-east-1
[flake8]
ignore = E128,E501