2015-08-10 3 views
3

У меня очень уродливая проблема с выполнением PUT в «Динамо», что я бил головой в течение последних 2 дней.Dynamo Db JSONResponseError с boto под флягой

У меня есть этот модуль, который подключается к Динамо и дает мне некоторую функциональность:

import boto.dynamodb2 
from boto.dynamodb2.table import Table 
from boto.dynamodb2.fields import HashKey 
from boto.regioninfo import RegionInfo 
from boto.dynamodb2.layer1 import DynamoDBConnection 
import uuid 

try: 
    sessions = Table(
     table_name='IssueBoxSessions', 
     schema=[HashKey('SessionId')], 
     connection=DynamoDBConnection(
     region=RegionInfo(name='eu-west-1', 
          endpoint='dynamodb.eu-west-1.amazonaws.com') 
     )) 
except: 
    print("Dynamo can't connect") 

def create_session(): 
    id = str(uuid.uuid4()) 
    res = sessions.put_item(data={ 
     'SessionId': id, 
     'data': { 
      'user_id': 1, 
      'ip': '10.1.1.10', 
      'datetime': 'now' 
     } 
    }) 
    print(res) 
    return res 

Обратите внимание, что я разработку и тестирование на примере EC2 и аутентификацию с Динамо, используя IAM роль, прикрепленную к примеру.

Так что, когда я импортировать эту create_session функцию в интерпретаторе питона и назвать его, он работает:

>>> from issuesite.session_handler import create_session 
>>> create_session() 
True 
True 

Но, когда я пытаюсь использовать его в любом месте вблизи колбы, она имеет расплавить:

from flask import request 
from issuesite.session_handler import create_session 
from issuesite import app 

@app.route('/login', methods=['GET']) 
def login(): 
    if create_session(): 
     return "ok" 

ошибка выброшен является:

JSONResponseError: JSONResponseError: 400 Bad Request 
{u'message': u'The security token included in the request is invalid.', u'__type': u'com.amazon.coral.service#UnrecognizedClientException'} 

На самом деле, здесь все traceba ck во всей его красоте:

Traceback (most recent call last): 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
File "/server/flask/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "/server/issuesite/views/base.py", line 14, in login 
    if create_session(): 
File "/server/issuesite/session_handler/__init__.py", line 29, in create_session 
    'datetime': 'now' 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/table.py", line 821, in put_item 
    return item.save(overwrite=overwrite) 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/items.py", line 455, in save 
    returned = self.table._put_item(final_data, expects=expects) 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/table.py", line 835, in _put_item 
    self.connection.put_item(self.table_name, item_data, **kwargs) 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 1510, in put_item 
    body=json.dumps(params)) 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 2842, in make_request 
    retry_handler=self._retry_handler) 
File "/server/flask/lib/python2.7/site-packages/boto/connection.py", line 954, in _mexe 
    status = retry_handler(response, i, next_sleep) 
File "/server/flask/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 2885, in _retry_handler 
data) 

Есть ли у кого-нибудь идеи относительно того, что здесь происходит?

Заранее благодарен! :)

+0

'Недействительный токен безопасности, включенный в запрос.' Я бы предположил, что вам нужно включить действительный токен безопасности. Вам нужно пройти аутентификацию с помощью Amazon, но я не вижу этого в вашем коде. – davidism

+0

Как указано в моем сообщении, я аутентифицируюсь в «Динамо», используя роль IAM. В этом случае для аутентификации не требуется код. – mickzer

+0

В сообщении об ошибке указано иное. Однако вы проверяете подлинность, эта библиотека и вызываемые ею вызовы ожидают маркер безопасности в запросе. – davidism

ответ

0

Из кода, который вы опубликовали, вы используете обычные методы соединения Boto, в то время как вы должны использовать те, которые предназначены для IAM (http://boto.readthedocs.org/en/latest/ref/iam.html).

Надеюсь, это поможет.

0

Это похоже на вопрос о полномочиях. Используете ли вы правильные учетные данные? Похож на это issue. Возможно, стоит установить debug logger, чтобы увидеть, откуда/какие данные вытягиваются.

0

Я попытался использовать фактические учетные данные AWS вместо роли IAM, и в конце концов я принимаю AMI экземпляра и запускаю из него еще один экземпляр с той же ролью IAM, и, как интересно, у него не было проблем с динамо.

Я закончил с заменой экземпляра.

Однако я не могу быть уверен, что именно вызвало проблему.

Смежные вопросы