2015-07-04 1 views
0

Я использую продукт под названием Alteryx, и я пытаюсь написать макрос Alteryx, который использует API запросов Dynamodb, чтобы я мог обращаться к моим таблицам Dynamodb изнутри Alteryx. К сожалению, мне не разрешено использовать один из SDK Amazon, поэтому вам нужно закодировать запрос apaza амазонки, подписанный вручную/внутри Alteryx.Где я ошибаюсь в API-интерфейсе Амазонки DynamoDB? Процесс подписи

Я использую пример Python Post, который включен в документацию Amazon, чтобы помочь мне в этом процессе. Пример Python можно найти здесь: Python Post Example.

Я закончил каждой из задач, изложенных в примере:

  1. Define запроса Переменные
  2. Создать Canonical запрос
  3. Создать строку подписи
  4. Вычислить подпись,
  5. Добавьте информацию для подписи для запроса и получения запроса.

Изначально я получаю следующее сообщение об ошибке:

InvalidSignatureException","message":"Signature·expired:·20150704T101118Z·is·now·earlier·than·20150704T135625Z·(20150704T141125Z·-·15·min.) 

Хотя время на моем компьютере правильно и время: 101118Z включены в мой запрос был на самом деле правильно, сообщение об ошибке говорил мне, что подпись закончилась четыре часа назад. Моя работа для этой ошибки заключалась в том, чтобы добавить 4 часа к моей переменной времени/времени, и это, похоже, сделало трюк.

ВОПРОС 1. Кто-нибудь знает, что вызывает эту ошибку, и есть способ исправить ее, не добавляя 4 часа к моей переменной даты/времени. Может ли это вызвать дополнительные осложнения при подписании API-процессов подписи и запроса.

После применения моей даты/времени, обходной путь, я был вознагражден с новым сообщением об ошибке:

InvalidSignatureException","message":"The·request·signature·we·calculated·does·not·match·the·signature·you·provided.·Check·your·AWS·Secret·Access·Key·and·signing·method.·Consult·the·service·documentation·for·details.\n\nThe·Canonical·String·for·this·request·should·have·been\n'POST\n/\n\ncontent_type:\nhost:dynamodb.us-east-1.amazonaws.com\nx-amz-date:20150704T141834Z\nx-amz-target:DynamoDB_20120810.CreateTable\n\ncontent_type;host;x-amz-date;x-amz-target\n09a8bcdeea1d20631f887235820bbff0a614679080a2e74a89ceb1a1bcc71b44'\n\nThe·String-to-Sign·should·have·been\n'AWS4-HMAC-SHA256\n20150704T141834Z\n20150704/us-east-1/dynamodb/aws4_request\nec549e12e44faf7ee750e19b570eaf2389f82e722ae2978b535df6fd6f3df129'\n"} 

Так что в следующий я сравнил мой Canonical запрос к одному, представленной в сообщении об ошибке. Это что я нашел:

  1. Запрос информации были идентичны с одним исключением. Канонический запрос, указанный в сообщении об ошибке, имел заголовок content-type:, но исключал значение связанного содержимого.
  2. Мой канонический запрос включал как заголовок содержимого контента, так и значение.
  3. Хэш параметров запроса в конце канонического запроса идеально согласуется со всем остальным.

Это важно, потому что канонический запрос является входом для следующего шага процесса. Вы должны вычислить хэш-таблицу sha256 канонического запроса, чтобы создать String To Sign. Я пробовал два альтернативных подхода/обходные пути по этим вопросам:

  1. Сначала я использовал канонический запрос, который я получил (в том числе значение типа содержимого), чтобы вычислить строку для подписи. В этом случае все соответствует сообщениям об ошибках String To Sign, за исключением последнего элемента: хеш канонического запроса.
  2. Мой следующий подход состоял в том, чтобы вычислить канонический запрос, который исключил значение типа содержимого и, следовательно, точно соответствовал каноническому запросу, включенному в сообщение об ошибке. В этом случае выведенная строка String To Sign идеально сочетается, за исключением хэша канонического запроса.

ВОПРОС 2: Кто-нибудь сталкивался с этой ошибкой; вы знаете причину и/или у вас есть обходной путь.

Надеюсь, что когда-нибудь я смогу ответить на вопрос 3, я смогу успешно выполнить 4-ю задачу, вычислить подпись и успешно выполнить запрос api.

ВОПРОС 3: Кто-нибудь знает какие-либо другие ошибки в этом процессе или какие-либо дополнительные предложения или идеи.

+1

Вы знакомы с UTC? Это то, что означает «Z» в метке времени. Не по местному времени. Вы отправляете правильный и разумный заголовок Content-Type: 'с запросом? –

+0

Это для понимания UTC. 4-часовые настройки работают хорошо. Это то, что я использую для своего типа содержимого: application/x-amz-json-1.0 – Mutuelinvestor

+0

, поэтому для подписи необходимо время UTC. также проверьте правильность установки часов в вашей системе (при необходимости обновите через ntp) – Mircea

ответ

0

Если у вас нет особых причин для этого вручную, стандартным советом является использование boto для доступа AWS с Python.

EDIT: В общем, стандартным советом является использование доступных библиотек, где они подходят для вашего прецедента.

EDIT 2: Показать комментарии о sys.path и обходные пути для вашего случая.

+0

Понял, к сожалению, этот вариант недоступен для меня в этом случае. – Mutuelinvestor

+0

Если вы не возражаете, я спрашиваю, почему? Какие конкретные ограничения у вас есть в вашем текущем случае использования? – Ming

+0

Я использую программное обеспечение для хранения данных, называемое Alteryx, и я пытаюсь написать разъем Dynamodb для Alteryx. В результате я должен разработать коннектор через макрофункцию Alteryx. – Mutuelinvestor

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