使用 Ruby AWS SDK 访问 Ceph RGW S3 接口:桶与对象操作完整指南

发布时间:2026/9/24 0:05:21

使用 Ruby AWS SDK 访问 Ceph RGW S3 接口:桶与对象操作完整指南 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载导读Ceph Object GatewayRGW对外提供与 Amazon S3 API 兼容的 RESTful 接口任何遵循 S3 协议的客户端包括 Ruby 生态中的aws-sdk与aws-s3两个 gem都可以直接对接。本文以 Ceph 官方文档 doc/radosgw/s3/ruby.rst 为骨架系统讲解用 Ruby 完成连接配置、桶的增删查、对象的上传下载与 ACL 管理、签名/未签名 URL 生成等完整操作并结合仓库中的 RGW 源码如 src/rgw/rgw_acl_s3.cc与配套文档如 doc/radosgw/s3/authentication.rst、doc/radosgw/s3/commons.rst补充底层原理与实操细节。读完本文你将能够用两种主流 Ruby SDK 快速接入 Ceph RGW并理解其认证、ACL 与路径访问模式的实现机制。适用前提本文示例面向 Ceph RGW 的 S3 兼容接口文中出现的objects.dreamhost.com为官方文档沿用的示例主机名实际使用时请替换为你的 RGW 网关地址如rgw.example.com并替换为自己的access_key_id/secret_access_key。两种 SDK 的适用版本分别为aws-sdk gem ~2与aws-s3 gem老一代 gem。一、Ceph RGW 的 S3 兼容接口与 Ruby 生态选型Ceph 通过 RGW 组件暴露一套与 Amazon S3 API 基本数据访问模型兼容的 RESTful API其功能支持清单List Buckets、Create/Delete Bucket、Put/Get/Delete Object、Object ACL、Multipart Uploads、Object/Bucket Tagging、Bucket Policy、S3-select 等详见 doc/radosgw/s3.rst 中的特性支持表。Ruby 开发者对接 RGW 主要有两条技术路线路线gem适用场景现代 SDKaws-sdk~ 2官方文档 doc/radosgw/s3/ruby.rst 前半部分示例面向Aws::S3::Client接口推荐新项目使用经典 gemaws-s3官方文档后半部分示例面向AWS::S3命名空间接口更贴近早期 S3 REST 语义两种 SDK 均通过 HTTP 调用 RGW 的 S3 端点认证依赖 AWS 签名Signature v2/v4因此只要是合法的 S3 凭据即可工作无需任何 Ceph 专用客户端库。二、现代 SDKaws-sdk gem ~2连接配置与客户端初始化2.1 全局连接设置官方推荐使用Aws.config.update进行全局配置一次性声明端点、凭据与访问模式Aws.config.update( endpoint: https://objects.dreamhost.com., access_key_id: my-access-key, secret_access_key: my-secret-key, force_path_style: true, region: us-east-1 )参数含义与注意事项endpointRGW 网关地址。必须显式指定否则 SDK 会默认指向 AWS 官方 S3 服务。access_key_id/secret_access_keyS3 凭据可由radosgw-admin user create创建用户时生成详见下文准备凭据小节。force_path_style: true强制使用path-style访问模式GET /mybucket。这几乎总是对接 RGW 的正确选择——因为 RGW 默认并未为每个桶分配子域名virtual-hosted-styleGET /Host: mybucket.cname.domain.com需要额外配置rgw_dns_name或 zonegroup 的hostnames。两种访问模式的差异与配置方法参见 doc/radosgw/s3/commons.rst。regionRGW 对 region 值不做强制校验填写任意值如us-east-1即可满足签名计算要求。2.2 实例化客户端s3_client Aws::S3::Client.new之后所有桶与对象操作均通过s3_client完成。2.3 准备凭据对接 RGW 前的账号准备在真实环境中你需要先在 RGW 中创建 S3 用户并获取访问密钥这属于 RGW 管理面操作可参考 doc/radosgw/adminops.rst 中的用户管理章节典型命令形如radosgw-admin user create --uidruby-user --display-nameRuby User --gen-access-key --gen-secret-key创建成功后命令会返回access_key与secret_key将其填入上面的Aws.config.update即可。RGW 对请求的认证基于 AWS 签名v2/v4SDK 会自动完成签名计算只有手工构造原始 HTTP 请求时才需要自行计算签名详见 doc/radosgw/s3/authentication.rst。三、桶操作列出、创建、清空与删除3.1 列出自己拥有的桶List Owned Bucketss3_client.list_buckets.buckets.each do |bucket| puts #{bucket.name}\t#{bucket.creation_date} end输出形如mahbuckat1 2011-04-21T18:05:39.000Z mahbuckat2 2011-04-21T18:05:48.000Z mahbuckat3 2011-04-21T18:07:18.000Z该操作对应 S3 的GET /服务级请求Service Ops在 RGW 侧由s3:ListAllMyBuckets权限控制。3.2 创建桶Create Buckets3_client.create_bucket(bucket: my-new-bucket)若希望桶默认为私有可显式传入acl选项s3_client.create_bucket(bucket: my-new-bucket, acl: private)acl选项canned ACL支持以下取值private仅所有者可读写默认public-read公开可读public-read-write公开读写慎用authenticated-read仅已认证用户可读这四个 canned ACL 值与 RGW 服务端实现一一对应见 src/rgw/rgw_acl_s3.cc 中的解析逻辑private/public-read/public-read-write/authenticated-read。需要注意的是官方文档 doc/radosgw/s3.rst 明确指出 RGW 对桶的 canned ACL 集合与 AWS 存在差异Different set of canned ACLs。3.3 列出桶内容List a Buckets Contents3_client.get_objects(bucket: my-new-bucket).contents.each do |object| puts #{object.key}\t#{object.size}\t#{object.last-modified} end输出形如myphoto1.jpg 251262 2011-08-08T21:35:48.000Z myphoto2.jpg 262518 2011-08-08T21:38:01.000Z注意官方文档此处写的是get_objects实际现代aws-sdkv2中列出对象的标准方法是list_objects或list_objects_v2返回结构均为contents数组字段key、size、last_modified一致。若你的 SDK 版本提示找不到get_objects请改用s3_client.list_objects(bucket: my-new-bucket).contents.each do |object| puts #{object.key}\t#{object.size}\t#{object.last_modified} end3.4 删除桶Delete Bucket⚠️ 注意桶必须为空才能删除成功否则操作会失败s3_client.delete_bucket(bucket: my-new-bucket)3.5 非空桶的强制删除删除非空桶前必须先清空桶SDK 提供了便捷方法Aws::S3::Bucket.new(my-new-bucket, client: s3_client).clear!清空之后即可删除桶s3_client.delete_bucket(bucket: my-new-bucket)clear!会遍历桶内对象并逐个调用delete_object等效于先list_objects再循环删除因此数据量极大时建议评估耗时与请求配额。四、对象操作上传、ACL 管理、下载与删除4.1 创建对象Put Object在桶my-new-bucket中创建hello.txt内容为字符串Hello World!s3_client.put_object( key: hello.txt, body: Hello World!, bucket: my-new-bucket, content_type: text/plain )content_type显式指定Content-Type元数据若省略SDK 会根据body类型推断。上传大文件时可改用put_object的文件流形式或使用 Multipart UploadRGW 支持见 doc/radosgw/s3.rst 功能表。4.2 修改对象 ACL使hello.txt公开可读、secret_plans.txt私有s3_client.put_object_acl(bucket: my-new-bucket, key: hello.txt, acl: public-read) s3_client.put_object_acl(bucket: my-new-bucket, key: private.txt, acl: private)RGW 的 ACL 模型包含READ、WRITE、READ_ACP、WRITE_ACP、FULL_CONTROL五种权限作用于桶与对象时语义不同例如READ在桶上表示可列出桶内对象在对象上表示可读取该对象完整权限对照与 S3 操作到 ACL 权限的映射表见 doc/radosgw/s3/authentication.rst。4.3 下载对象到本地文件Get Object将对象poetry.pdf下载并保存到本地目录s3_client.get_object( bucket: my-new-bucket, key: poetry.pdf, response_target: /home/larry/documents/poetry.pdf )response_target指定本地保存路径SDK 会以文件流方式落盘避免将大对象整体读入内存。4.4 删除对象Delete Objects3_client.delete_object(key: goodbye.txt, bucket: my-new-bucket)RGW 侧由s3:DeleteObject权限控制对应WRITE级 ACL 权限。五、生成对象下载 URL未签名公开与预签名限时对于公开对象已通过 ACL 设为public-read可以生成无需签名的直接访问 URLputs Aws::S3::Object.new( key: hello.txt, bucket_name: my-new-bucket, client: s3_client ).public_url对于私有对象如secret_plans.txt生成预签名 URLpresigned URL在有效期内任何人都可通过该 URL 下载即使对象本身是私有的有效期过后 URL 立即失效puts Aws::S3::Object.new( key: secret_plans.txt, bucket_name: hermes_ceph_gem, client: s3_client ).presigned_url(:get, expires_in: 60 * 60)expires_in单位为秒上例为 1 小时60 * 60。输出形如http://objects.dreamhost.com/my-bucket-name/hello.txt http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?SignatureXXXXXXXXXXXXXXXXXXXXXXXXXXXExpires1316027075AWSAccessKeyIdXXXXXXXXXXXXXXXXXXX预签名 URL 的本质是将签名作为查询参数Signature、Expires、AWSAccessKeyId附加到 URL 上RGW 在收到请求时会校验签名与有效期。这是临时授权下载最常用的手段适合限时分享私有文件场景。小提示示例中第二个 URL 的桶名为hermes_ceph_gem这是官方文档的历史笔误实际应为你自己的桶名如my-new-bucket请按需替换。六、经典 gemaws-s3老一代 SDK 的对应操作aws-s3gem 提供与aws-sdk平行的操作集合接口风格更接近早期 S3 REST 语义适合维护旧项目。以下逐一给出对应实现。6.1 建立连接AWS::S3::Base.establish_connection!( :server objects.dreamhost.com, :use_ssl true, :access_key_id my-access-key, :secret_access_key my-secret-key )establish_connection!建立全局连接use_ssl决定是否走 HTTPS。注意该接口没有force_path_style参数若 RGW 未配置桶子域名需要注意主机名与路径的解析方式。6.2 列出自己拥有的桶AWS::S3::Service.buckets.each do |bucket| puts #{bucket.name}\t#{bucket.creation_date} end输出同上mahbuckat1 ...。6.3 创建桶AWS::S3::Bucket.create(my-new-bucket)6.4 列出桶内容new_bucket AWS::S3::Bucket.find(my-new-bucket) new_bucket.each do |object| puts #{object.key}\t#{object.about[content-length]}\t#{object.about[last-modified]} endobject.about返回对象的元数据哈希包含content-length字节数与last-modified。6.5 删除桶⚠️ 同样要求桶为空否则失败AWS::S3::Bucket.delete(my-new-bucket)6.6 非空桶强制删除aws-s3直接支持:force true一步完成清空与删除AWS::S3::Bucket.delete(my-new-bucket, :force true)这是与aws-sdk实现先clear!再delete_bucket最明显的 API 差异。6.7 创建对象AWS::S3::S3Object.store( hello.txt, Hello World!, my-new-bucket, :content_type text/plain )6.8 修改对象 ACL通过 Grant 列表改写 ACL公开hello.txt、私有化secret_plans.txtpolicy AWS::S3::S3Object.acl(hello.txt, my-new-bucket) policy.grants [ AWS::S3::ACL::Grant.grant(:public_read) ] AWS::S3::S3Object.acl(hello.txt, my-new-bucket, policy) policy AWS::S3::S3Object.acl(secret_plans.txt, my-new-bucket) policy.grants [] AWS::S3::S3Object.acl(secret_plans.txt, my-new-bucket, policy)这里先读取对象当前 ACL再整体替换grants列表空列表即私有最后回写。6.9 下载对象到本地文件aws-s3以流式分块方式下载并写入文件open(/home/larry/documents/poetry.pdf, w) do |file| AWS::S3::S3Object.stream(poetry.pdf, my-new-bucket) do |chunk| file.write(chunk) end end6.10 删除对象AWS::S3::S3Object.delete(goodbye.txt, my-new-bucket)6.11 生成下载 URL签名/未签名# 未签名公开对象URL puts AWS::S3::S3Object.url_for( hello.txt, my-new-bucket, :authenticated false ) # 预签名限时 1 小时URL puts AWS::S3::S3Object.url_for( secret_plans.txt, my-new-bucket, :expires_in 60 * 60 ):authenticated false生成不带签名的公开 URL:expires_in生成带签名的限时 URL。输出格式与aws-sdk示例一致。七、两种 SDK 操作对照一览操作aws-sdk~2aws-s3连接配置Aws.config.updateAws::S3::Client.newAWS::S3::Base.establish_connection!列出桶s3_client.list_buckets.bucketsAWS::S3::Service.buckets创建桶s3_client.create_bucket(bucket: ...)AWS::S3::Bucket.create(...)列出桶内容list_objects(bucket: ...).contentsBucket.find(...)后迭代删除桶空s3_client.delete_bucket(bucket: ...)AWS::S3::Bucket.delete(...)强制删除Bucket.new(...).clear!后删除AWS::S3::Bucket.delete(..., :force true)创建对象put_object(key:, body:, bucket:, content_type:)S3Object.store(key, value, bucket, :content_type ...)修改 ACLput_object_acl(bucket:, key:, acl:)读写S3Object.aclpolicy.grants下载对象get_object(bucket:, key:, response_target:)S3Object.stream分块写文件删除对象delete_object(key:, bucket:)S3Object.delete(key, bucket)未签名 URLObject#public_urlurl_for(..., :authenticated false)预签名 URLObject#presigned_url(:get, expires_in:)url_for(..., :expires_in ...)八、背后的实现要点结合 RGW 源码canned ACL 的服务端解析create_bucket与put_object_acl传入的acl字符串在 RGW 服务端由 src/rgw/rgw_acl_s3.cc 解析并映射为具体的 grant 集合支持private、public-read、public-read-write、authenticated-read四种取值非法取值会返回参数错误。认证机制RGW 支持 AWS Signature v4 与 v2 两种签名算法SDK 自动完成签名x-amz-content-sha256头支持实际负载校验值、UNSIGNED-PAYLOAD以及多种流式负载模式详见 doc/radosgw/s3/authentication.rst。访问模式force_path_style: true对应 path-style 请求GET /mybucket是 RGW 部署的常见形态如需 virtual-hosted-styleHost: mybucket.cname.domain.com需通过rgw_dns_name配置或在 zonegroup 中声明hostnames参见 doc/radosgw/s3/commons.rst。签名 URL 的校验预签名 URL 通过查询参数携带签名与过期时间RGW 校验通过后放行匿名下载因此时效性与签名完整性由 RGW 统一保障客户端无需额外处理。九、常见问题与排错建议endpoint忘记配置SDK 会默认连向 AWS 官方 S3请求将失败或指向错误服务务必显式设置 RGW 地址。桶删除失败检查桶是否为空。非空桶需先clear!或:force true。403 AccessDenied确认access_key_id/secret_access_key正确且该用户对目标桶/对象拥有相应 ACL 或桶策略权限RGW 支持桶策略与 ACL 两种授权模型官方建议优先使用桶策略见 doc/radosgw/s3/authentication.rst 末尾说明。URL 上出现异常主机名检查是否启用了 virtual-hosted-style 而 RGW 未配置桶子域名保持force_path_style: true通常是更稳妥的选择。对象上传大文件put_object直接上传适合中小文件超大对象建议使用 Multipart Upload APIRGW 支持见 doc/radosgw/s3.rst 特性表。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐使用 C AWS SDK 对接 Ceph RGW S3 网关从连接建立、桶与对象操作到预签名 URL 的完整实践使用 C AWS SDK 对接 Ceph RGW S3 网关从连接建立、桶与对象操作到预签名 URL 的完整实践 本文以 Ceph RADOS Gateway存储分布式文件系统对象存储后端高可用如何用 start-cluster.sh 为 LibreChat 本地搭建三节点 Redis Cluster 并通过 .env 连接验证如何用 start cluster.sh 为 LibreChat 本地搭建三节点 Redis Cluster 并通过 .env 连接验证 LibreChat 本存储分布式文件系统对象存储后端高可用Ceph 对象存储 Java S3 开发实战基于 AWS Java SDK 2.17 的完整操作指南Ceph 对象存储 Java S3 开发实战基于 AWS Java SDK 2.17 的完整操作指南 本指南以 Ceph 对象网关RADOS Gateway存储分布式文件系统对象存储后端高可用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/24 0:05:21

Python深度学习回归实战:从Keras基线到物理约束网络

简介:这份资源面向具备一定Python基础、希望系统实践深度学习回归与序列建模的学习者,围绕神经网络在连续变量预测中的应用展开,涵盖全连接网络、循环神经网络及LSTM等模型在时间序列预测、股票与汇率走势预测、气候变化预测等场景下的实现思…

2026/9/24 0:00:21

Windows系统安装全指南:从U盘启动盘制作到UEFI/GPT分区方案

不管是给老电脑续命,还是给新装的机器做首次引导,Windows系统的安装都属于那种“看着简单,做起来全是细节”的活儿。我前前后后帮同事、朋友装了不下几十台机器,自己也因为手贱删错分区、改了引导方式导致安装失败过好多次&#x…

2026/9/24 0:00:21

齿轮箱故障诊断中的传递路径分析:原理、Matlab实现与工程应用

前阵子有朋友拿来一组齿轮箱振动数据,说频谱图上能看到好几个啮合频率边带,但就是说不清振动到底是从啮合点直接传出来的,还是先传到轴承、再经过箱体共振放大出来的。这个问题其实特别典型——齿轮箱故障诊断里,传感器只能装在箱…

2026/9/24 1:00:23

Spring Task定时任务:原理、优化与分布式实践

1. Spring Task 项目概述Spring Task 是 Spring 框架中用于实现定时任务调度的核心模块。作为 Java 开发者最常用的定时任务解决方案之一,它通过简单的注解配置就能实现复杂的任务调度逻辑。我在多个电商系统和数据报表项目中深度使用过 Spring Task,其轻…

2026/9/24 1:00:23

程序员兼职2025平台清单:从接单到交付全流程避坑指南

写这篇东西之前,我先交代一下背景:我从2020年开始在各类程序员兼职平台接单,做过企业官网、小程序迭代、后台管理系统,也接过连需求文档都写不清楚的“一句话单子”。这几年下来,赚到过钱,也被项目拖到怀疑…

2026/9/24 1:00:23

YOLOv5红外车辆检测实战:数据校准、模型改造与部署优化

简介:本资源是一套基于YOLOv5实现的红外车辆检测与识别完整方案,面向计算机视觉初学者、智能交通系统开发者及红外图像处理研究者,解决夜间或低光照环境下车辆实时检测难题。压缩包共128个文件,含24个Python训练/推理脚本&#xf…

2026/9/24 1:00:23

基于SSM框架的农产品电商系统开发实践

1. 项目概述:基于SSM的助农特色农产品销售系统作为一名深耕Java领域多年的开发者,我最近完成了一个具有社会价值的毕业设计项目——基于SSM框架的助农特色农产品销售系统。这个系统专为解决农产品销售渠道单一、信息不对称等问题而设计,通过数…

2026/9/24 1:00:23

Java Agent技术:从原理到生产实践全解析

1. 为什么Java开发者需要关注Agent技术?在Java生态中,Agent技术一直是个既神秘又强大的存在。记得我2016年第一次接触Java Agent时,花了整整两周才搞明白如何实现一个简单的类转换。如今在阿里云原生团队带架构师岗位,发现90%的P7…

2026/9/24 0:55:23

AI视频总结工具实测:2小时视频如何5分钟学完

一次看两小时的网课,是很多人年初立的flag,到了年底发现进度条还是停在10%。我从去年开始集中用AI视频总结工具处理各种长视频,从机构课、技术分享到发布会录像,实测下来,2小时的视频压缩成5分钟阅读笔记完全是能做到的…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码