Skip to content

Commit 9f94288

Browse files
nicysneirosgarrettheel
authored andcommitted
Externalizes AWS Credentials (pynamodb#426)
1 parent 444312f commit 9f94288

File tree

5 files changed

+42
-3
lines changed

5 files changed

+42
-3
lines changed

docs/awsaccess.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,16 @@ policies as required, see the
1212
`DynamoDB <http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html>`_ docs for more
1313
information.
1414

15+
If for some reason you can't use conventional AWS configuration methods, you can set the credentials in the Model Meta class:
16+
17+
.. code-block:: python
18+
19+
from pynamodb.models import Model
20+
21+
class MyModel(Model):
22+
class Meta:
23+
aws_access_key_id = 'my_access_key_id'
24+
aws_secret_access_key = 'my_secret_access_key'
25+
1526
Finally, see the `AWS CLI documentation <http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-installing-credentials>`_
1627
for more details on how to pass credentials to botocore.

pynamodb/connection/table.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ def __init__(self,
1717
session_cls=None,
1818
request_timeout_seconds=None,
1919
max_retry_attempts=None,
20-
base_backoff_ms=None):
20+
base_backoff_ms=None,
21+
aws_access_key_id=None,
22+
aws_secret_access_key=None):
2123
self._hash_keyname = None
2224
self._range_keyname = None
2325
self.table_name = table_name
@@ -28,6 +30,10 @@ def __init__(self,
2830
max_retry_attempts=max_retry_attempts,
2931
base_backoff_ms=base_backoff_ms)
3032

33+
if aws_access_key_id and aws_secret_access_key:
34+
self.connection.session.set_credentials(aws_access_key_id,
35+
aws_secret_access_key)
36+
3137
def get_meta_table(self, refresh=False):
3238
"""
3339
Returns a MetaTable
@@ -145,7 +151,8 @@ def get_item(self, hash_key, range_key=None, consistent_read=False, attributes_t
145151
consistent_read=consistent_read,
146152
attributes_to_get=attributes_to_get)
147153

148-
def rate_limited_scan(self,
154+
def rate_limited_scan(
155+
self,
149156
filter_condition=None,
150157
attributes_to_get=None,
151158
page_size=None,

pynamodb/models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ def __init__(cls, name, bases, attrs):
184184
setattr(attr_obj, 'base_backoff_ms', get_settings_value('base_backoff_ms'))
185185
if not hasattr(attr_obj, 'max_retry_attempts'):
186186
setattr(attr_obj, 'max_retry_attempts', get_settings_value('max_retry_attempts'))
187+
if not hasattr(attr_obj, 'aws_access_key_id'):
188+
setattr(attr_obj, 'aws_access_key_id', None)
189+
if not hasattr(attr_obj, 'aws_secret_access_key'):
190+
setattr(attr_obj, 'aws_secret_access_key', None)
187191
elif issubclass(attr_obj.__class__, (Index, )):
188192
attr_obj.Meta.model = cls
189193
if not hasattr(attr_obj.Meta, "index_name"):
@@ -1269,7 +1273,9 @@ def _get_connection(cls):
12691273
session_cls=cls.Meta.session_cls,
12701274
request_timeout_seconds=cls.Meta.request_timeout_seconds,
12711275
max_retry_attempts=cls.Meta.max_retry_attempts,
1272-
base_backoff_ms=cls.Meta.base_backoff_ms)
1276+
base_backoff_ms=cls.Meta.base_backoff_ms,
1277+
aws_access_key_id=cls.Meta.aws_access_key_id,
1278+
aws_secret_access_key=cls.Meta.aws_secret_access_key)
12731279
return cls._connection
12741280

12751281
def _deserialize(self, attrs):

pynamodb/tests/test_model.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,8 @@ class Meta:
425425
request_timeout_seconds = 9999
426426
max_retry_attempts = 200
427427
base_backoff_ms = 4120
428+
aws_access_key_id = 'access_key_id'
429+
aws_secret_access_key = 'secret_access_key'
428430
session_cls = OverriddenSession
429431

430432
random_user_name = UnicodeAttribute(hash_key=True, attr_name='random_name_1')
@@ -671,6 +673,8 @@ def test_overidden_session(self):
671673
self.assertEqual(OverriddenSessionModel.Meta.request_timeout_seconds, 9999)
672674
self.assertEqual(OverriddenSessionModel.Meta.max_retry_attempts, 200)
673675
self.assertEqual(OverriddenSessionModel.Meta.base_backoff_ms, 4120)
676+
self.assertEqual(OverriddenSessionModel.Meta.aws_access_key_id, 'access_key_id')
677+
self.assertEqual(OverriddenSessionModel.Meta.aws_secret_access_key, 'secret_access_key')
674678
self.assertTrue(OverriddenSessionModel.Meta.session_cls is OverriddenSession)
675679

676680
self.assertEqual(OverriddenSessionModel._connection.connection._request_timeout_seconds, 9999)

pynamodb/tests/test_table_connection.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ def test_create_connection(self):
3333
conn = TableConnection(self.test_table_name)
3434
self.assertIsNotNone(conn)
3535

36+
def test_connection_session_set_credentials(self):
37+
conn = TableConnection(
38+
self.test_table_name,
39+
aws_access_key_id='access_key_id',
40+
aws_secret_access_key='secret_access_key')
41+
42+
credentials = conn.connection.session.get_credentials()
43+
44+
self.assertEqual(credentials.access_key, 'access_key_id')
45+
self.assertEqual(credentials.secret_key, 'secret_access_key')
46+
3647
def test_create_table(self):
3748
"""
3849
TableConnection.create_table

0 commit comments

Comments
 (0)