Radosgw未应用Lua存储类分层脚本问题求助(Ceph)
Radosgw Lua脚本未正确设置S3对象存储类的排查与解决
问题概述
使用s3cmd put ti s3://totodash上传1024字节的对象时,Lua脚本逻辑应将其存储类设为DEEP_ARCHIVE,但实际对象存储类为STANDARD。日志显示存在IAM策略隐式拒绝,且Lua后台缓存命中负条目。
排查与解决方案
1. 修复IAM策略的隐式拒绝
日志中的s3:put_obj evaluate_iam_policies: implicit deny from identity-based policy表明当前用户的IAM策略可能阻止了存储类的设置:
- 执行
radosgw-admin policy get --uid=<你的用户UID>查看身份策略 - 确保策略允许
s3:PutObject操作,并包含指定目标存储类的权限,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::totodash/*", "Condition": { "StringEquals": { "s3:x-amz-storage-class": ["STANDARD", "STANDARD_IA", "DEEP_ARCHIVE"] } } } ] }
- 若策略存在隐式拒绝(比如未明确允许存储类设置),更新后执行
radosgw-admin policy put --uid=<你的用户UID> --policy-file=updated-policy.json生效。
2. 确认Lua脚本的执行类型
日志中的lua background: cache get: name=rdc.rgw.log++script.background. : hit (negative entry)说明脚本可能被配置为后台异步脚本,这类脚本无法修改当前请求的参数:
- 检查
ceph.conf中的配置:- 确保使用
rgw_lua_script = /path/to/your/script.lua(请求阶段执行,可修改Request) - 避免使用
rgw_lua_background_script(后台脚本,仅用于异步任务)
- 确保使用
- 修改配置后重载Radosgw服务:
systemctl reload ceph-radosgw@<你的实例名>
3. 验证脚本中文件大小的获取逻辑
脚本依赖Request.ContentLength判断大小,若该值未正确获取会导致逻辑分支错误:
- 在脚本中添加调试日志,确认大小值:
-- 在判断大小前添加 RGWDebugLog("Request ContentLength: " .. tostring(Request.ContentLength)) RGWDebugLog("Request Object Size: " .. tostring(Request.Object.Size))
- 上传对象后查看Radosgw日志,若
Request.ContentLength为nil或错误值,改用Request.Object.Size作为判断依据(部分场景下该值更可靠)。
4. 确认集群支持目标存储类
若Radosgw未配置对应存储类的placement,设置会失败并回退到STANDARD:
- 执行
radosgw-admin zone get查看zone配置 - 确保
storage_classes中包含DEEP_ARCHIVE和STANDARD_IA,示例配置:
"storage_classes": { "STANDARD": { "placement": "default-placement" }, "STANDARD_IA": { "placement": "ia-placement" }, "DEEP_ARCHIVE": { "placement": "deep-archive-placement" } }
- 若缺少配置,执行
radosgw-admin zone modify --zone=<你的zone> --storage-class-mapping='{"DEEP_ARCHIVE": "deep-archive-placement", "STANDARD_IA": "ia-placement"}',然后更新zone map:radosgw-admin zone map update,最后重启Radosgw服务。
5. 验证脚本是否被执行
在脚本开头添加日志,确认脚本是否被触发:
RGWDebugLog("Lua script executed for op: " .. tostring(Request.RGWOp))
上传对象后若未在日志中看到该条目,检查脚本路径是否正确、文件权限是否允许Radosgw读取,并重载服务。
内容的提问来源于stack exchange,提问作者koni
相关产品推荐
相关产品推荐

