DynamoDB put_item的预签名URL

时间:2019-02-19 11:53:02

标签: amazon-web-services amazon-dynamodb boto3

有一些示例可以用来对S3请求的URL进行预签名,但是我找不到任何有效的示例来对AWS中的其他服务进行预签名。

我正在尝试使用Python SDK botos将项目写入DynamoDB。 SDK包含用于生成预签名URL here的选项。我正在尝试使其正常运行,并且获取了URL,但是该URL响应为404,并且Item没有出现在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提供了完全访问权限。

请注意,您可以使用python对DynamoDB进行请求签名,如此处所示:https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html#sig-v4-examples-post。但是由于某些原因,boto3库中的实现无法做到这一点。使用boto3库比上面的代码容易得多,因为我不需要提供该功能的凭据。

2 个答案:

答案 0 :(得分:0)

您发送了一个空的帖子请求。您应该将数据添加到请求中:

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

答案 1 :(得分:0)

我认为您有this issue,这就是为什么您收到404的原因。 他们建议在这种情况下使用Cognito进行身份验证,而不是使用IAM。