2016-12-12 1 views
1

Ich mache eine Klasse, um Operationen für eine DynamoDB-Datenbank zu behandeln. Es wird eine einfache Datenbank mit nur einer Tabelle sein.Raise NoRegionError() - Sie müssen eine Region angeben

Ich bekomme eine NoRegionError() bei der Ausführung meines Skripts als python dynamo.db. Wenn ich jedoch die Klasse in einer jupyter notebook oder qtconsole Umgebung aufrufen oder jeden der Befehle im Skript separat in einer Python-Shell ausführen, bekomme ich keinen solchen Fehler.

Ich habe meine Anmeldeinformationen zum lokalen Ordner .aws hinzugefügt, so dass ich nicht sicher bin, warum dieser Fehler auftritt und wie man ihn debuggt. Hier ist die Klasse, ich arbeite:

import boto3 

class Dynamo(object): 

    def __init__(self, **kwargs): 

     self._db_api = 'dynamodb' 
     self._session = None 
     self._client = None 
     self._database = None 
     self._region_name = kwargs.get('region_name', 'us-west-2') 
     self._endpoint_url = kwargs.get('endpoint_url', 'http://localhost:8000') 

     self.cached_table = {} 
     self.table = None 

    def connect(self): 
     self._session = boto3.Session() 
     print(self._region_name) 
     print(self._db_api) 

     if self._session: 
      self._database = self._session.resource(self._db_api) 


def main(): 

    dynamo = Dynamo() 
    dynamo.connect() 

    return dynamo 

if __name__ == '__main__': 
    dynodb = main() 

Und das ist der Fehler Ich erhalte:

Traceback (most recent call last): 
    File "test.py", line 39, in <module> 
    dynodb = main() 
    File "test.py", line 34, in main 
    dynamo.connect() 
    File "test.py", line 28, in connect 
    self._database = self._session.resource(self._db_api) 
    File "python2.7/site-packages/boto3/session.py", line 389, in resource 
    aws_session_token=aws_session_token, config=config) 
    File "python2.7/site-packages/boto3/session.py", line 263, in client 
aws_session_token=aws_session_token, config=config) 
    File "python2.7/site-packages/botocore/session.py", line 824, in create_client 
client_config=config, api_version=api_version) 
    File "python2.7/site-packages/botocore/client.py", line 69, in create_client 
verify, credentials, scoped_config, client_config, endpoint_bridge) 
    File "python2.7/site-packages/botocore/client.py", line 222, in _get_client_args 
verify, credentials, scoped_config, client_config, endpoint_bridge) 
    File "python2.7/site-packages/botocore/args.py", line 44, in get_client_args 
endpoint_url, is_secure, scoped_config) 
    File "python2.7/site-packages/botocore/args.py", line 101, in compute_client_args 
service_name, region_name, endpoint_url, is_secure) 
    File "python2.7/site-packages/botocore/client.py", line 295, in resolve 
service_name, region_name) 
    File "python2.7/site-packages/botocore/regions.py", line 122, in construct_endpoint 
partition, service_name, region_name) 
    File "python2.7/site-packages/botocore/regions.py", line 135, in _endpoint_for_partition 
raise NoRegionError() 
botocore.exceptions.NoRegionError: You must specify a region. 

Antwort

0

Sie sollten create a DynamoDB client mit boto3 Vorlagen:

boto3.client('dynamodb', region_name='us-west-2', endpoint_url='http://localhost:8000') 

Siehe auch this question and answer.

+0

Das stimmt, aber sollte boto3 die lokalen Einstellungen nicht überprüfen, wenn es im Code nicht gefunden wird, wie es beim Aufruf über ipython notebook der Fall ist? Ich möchte in der Lage sein, dies anderswo zu setzen und wie in der Frage erläutert, habe ich die Region und die Anmeldeinformationen in '.aws'-Ordner. Ich denke, die Frage ist, warum boto3 diesen Ordner nicht sieht. – oxtay

Verwandte Themen