使用Boto3预签名DynamoDB PutItem URL遇404问题求助
解决DynamoDB预签名URL返回404的问题
核心原因
DynamoDB的PutItem API是POST请求,且要求请求体为符合AWS JSON格式的内容,同时预签名过程需要包含请求体的哈希值。你的代码存在两个关键问题:
- 没有指定
HttpMethod='POST',默认生成的是GET请求的URL,而DynamoDB不支持用GET调用PutItem - 错误地将
TableName和Item放在Params参数中(这会把它们作为URL查询参数),但DynamoDB要求这些参数在请求体里
修正后的代码
首先,生成预签名URL时要正确指定请求方法、请求体和必要的Headers:
import boto3 import json import requests # 初始化DynamoDB客户端 ddb_client = boto3.client('dynamodb') # 构造PutItem的请求体(符合DynamoDB JSON格式) request_body = json.dumps({ 'TableName': 'mutes', 'Item': { 'email': {'S': 'g@g.c'}, 'until': {'N': '1234'} } }) # 生成预签名URL,指定POST方法、请求体和Content-Type头 presigned_url = ddb_client.generate_presigned_url( 'put_item', HttpMethod='POST', Body=request_body, Headers={'Content-Type': 'application/x-amz-json-1.0'} ) # 使用requests发送请求,注意要传递相同的请求体和Content-Type头 response = requests.post( presigned_url, data=request_body, headers={'Content-Type': 'application/x-amz-json-1.0'} ) # 检查响应 print(response.status_code) print(response.text)
关键注意事项
- 请求体必须完全匹配:预签名URL是基于请求体的哈希值生成的,所以发送请求时的请求体必须和生成URL时的
Body参数完全一致,不能有任何修改(包括空格、换行符等) - Content-Type头必须正确:DynamoDB的API要求使用
application/x-amz-json-1.0作为Content-Type,这个头也会被包含在签名中,发送请求时不能省略或修改 - IAM权限验证:确保生成预签名URL的IAM用户/角色拥有
dynamodb:PutItem权限(你已经确认全访问,这部分没问题)
为什么不用Params参数?
Boto3的Params参数在生成POST请求的预签名URL时,是用来设置URL查询参数的,但DynamoDB的PutItem API不使用查询参数传递请求数据,所有操作参数都必须放在请求体中,所以不能用Params传递TableName和Item。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

