有一些示例可以用来对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库比上面的代码容易得多,因为我不需要提供该功能的凭据。
答案 0 :(得分:0)
您发送了一个空的帖子请求。您应该将数据添加到请求中:
import requests
r = requests.post(response, data = params)
答案 1 :(得分:0)
我认为您有this issue,这就是为什么您收到404的原因。 他们建议在这种情况下使用Cognito进行身份验证,而不是使用IAM。