You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Boto3预签名DynamoDB PutItem URL遇404问题求助

解决DynamoDB预签名URL返回404的问题

核心原因

DynamoDB的PutItem API是POST请求,且要求请求体为符合AWS JSON格式的内容,同时预签名过程需要包含请求体的哈希值。你的代码存在两个关键问题:

  1. 没有指定HttpMethod='POST',默认生成的是GET请求的URL,而DynamoDB不支持用GET调用PutItem
  2. 错误地将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:51:36