Предопределенный URL для DynamoDB put_item - PullRequest
0 голосов
/ 19 февраля 2019

Существует несколько примеров способа предварительной подписи URL-адреса запроса S3, но я не смог найти ни одного рабочего примера для предварительной подписи других служб в AWS.

Я пытаюсь записать элемент в DynamoDB с помощью Python SDK botos.В SDK включена возможность создания предварительно подписанного URL здесь .Я пытаюсь заставить это работать, и я получаю URL, но URL отвечает 404, и Элемент не появляется в таблице DynamoDB.

import json
ddb_client = boto3.client('dynamodb')

response = ddb_client.put_item(
    TableName='mutes',
    Item={
        'email': {'S':'g@g.c'},
        'until': {'N': '123'}
        }
    )

print("PutItem succeeded:")
print(json.dumps(response, indent=4))

Этот код работает напрямую.Но когда я пытаюсь назначить его:

ddb_client = boto3.client('dynamodb')

params = {
    'TableName':'mutes', 
    'Item':
        {
            'email': {'S':'g@g.c'}, 
            'until' : {'N': '1234'}
        }

}

response = ddb_client.generate_presigned_url('put_item', Params = params)

и проверить URL:

import requests
r = requests.post(response)
r

Я получаю: Ответ [404]

Любой намек на то, какзаставить его работать?Я проверил разрешения IAM, и они дают полный доступ к DynamoDB.

Обратите внимание, что вы можете подписать запрос к DynamoDB, используя python, как вы можете видеть здесь: https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html#sig-v4-examples-post.Но по некоторым причинам реализация в библиотеке boto3 этого не делает.Использовать библиотеку boto3 намного проще, чем приведенный выше код, поскольку мне не нужно предоставлять учетные данные для функции.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я думаю, что у вас эта проблема , поэтому вы получаете 404. Они рекомендуют использовать Cognito для аутентификации вместо IAM для этих случаев.

0 голосов
/ 27 февраля 2019

Вы отправляете пустой почтовый запрос.Вы должны добавить данные к запросу:

import requests
r = requests.post(response, data = params)
...