Существует несколько примеров способа предварительной подписи 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 намного проще, чем приведенный выше код, поскольку мне не нужно предоставлять учетные данные для функции.