AWS REST API无法删除S3文件夹内对象的问题排查
问题分析与解决方案
核心问题是API Gateway路径参数默认不支持包含斜杠的key:当对象位于文件夹内时,key里的/会被API Gateway解析成多级路径,导致请求未匹配到你定义的/{bucket}/{key}路由,进而触发“缺少认证令牌”的错误提示(这个报错信息有误导性,实际是路由不匹配)。
具体修复步骤:
修改Swagger路径配置,支持带斜杠的key
将原路径/{bucket}/{key}改为/{bucket}/{key+},其中+是API Gateway的路径参数通配符,表示匹配包含斜杠的任意后续路径片段。修改后的Swagger paths部分如下:"paths": { "/{bucket}/{key+}": { "delete": { "produces": ["application/json"], "parameters": [ {"name":"key","in":"path","required":true,"type":"string"}, {"name":"bucket","in":"path","required":true,"type":"string"} ], "responses": {"200":{"description":"200 response","schema":{"$ref":"#/definitions/Empty"}}} } } }修正IAM策略的资源ARN
你当前的策略资源arn:aws:s3:::my-bucket*/*存在匹配歧义(可能会匹配到my-bucket1这类名称的桶),如果你的桶名是my-bucket,应改为精准匹配的ARN:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": [ "arn:aws:s3:::my-bucket", // ListBucket需要桶级资源 "arn:aws:s3:::my-bucket/*" // 桶内所有对象(包括子文件夹) ] } ] }验证请求的URL编码
发送DELETE请求时,确保key中的斜杠已正确编码为%2F(大多数HTTP客户端会自动处理,但手动测试时需注意),例如删除docs/report.pdf时,请求路径应为/v1/my-bucket/docs%2Freport.pdf。
内容的提问来源于stack exchange,提问作者Atropin
相关产品推荐
相关产品推荐

