Cloudflare R2 入门指南:全面了解对象存储新选择
前言:对象存储的困境与 R2 的出现
在当今数据爆炸的时代,对象存储已成为存储非结构化数据(如图片、视频、文档、备份、日志等)的首选方式。相较于传统的文件存储或块存储,对象存储具有极高的可扩展性、成本效益和全球访问能力。亚马逊S3、Google Cloud Storage、Azure Blob Storage等是市场上的主要玩家,它们为全球开发者和企业提供了强大的存储基础设施。
然而,这些主流云服务提供商的对象存储服务,虽然在存储容量和功能上表现出色,却普遍存在一个让许多用户头疼的问题:出站流量费用(Egress Fees)。当你需要从对象存储中读取数据并传输到外部网络(例如,用户访问你的网站加载存储在S3上的图片,或者你将备份数据下载到本地),都需要支付昂贵且通常难以预测的出站流量费用。对于拥有大量用户访问静态资源、进行数据分发或频繁进行数据迁移的业务来说,这笔费用可能占据其云账单的很大一部分,甚至超过存储本身的成本。
正是在这样的背景下,Cloudflare 推出了 Cloudflare R2 Storage。作为一家以全球分布式网络、CDN、安全和边缘计算著称的公司,Cloudflare 利用其遍布全球的数据中心网络和技术积累,打造了一个兼容S3 API、高可用、高持久性,且最核心的特点是没有出站流量费用的对象存储服务。R2 的出现,为开发者和企业提供了一个新的、极具吸引力的对象存储选择,尤其适合那些对出站流量成本敏感的应用场景。
本文将带你全面了解 Cloudflare R2,从基础概念到实际操作,帮助你快速入门,并探索它如何成为你的对象存储新选择。
第一部分:对象存储基础知识回顾
在深入了解 R2 之前,我们先快速回顾一下对象存储的基础概念,以便更好地理解 R2 的价值。
1. 什么是对象存储?
对象存储是一种管理和存储非结构化数据的架构。与传统的文件存储(将数据组织在文件夹和文件系统中)或块存储(将数据分割成固定大小的块并存储在硬盘上)不同,对象存储将每一份数据都视为一个独立的“对象”。
每个对象通常包含三个部分:
* 数据 (Data): 实际的原始数据,例如图片文件、视频文件、文本文件等。
* 元数据 (Metadata): 描述对象本身的信息,例如文件类型、创建日期、修改日期、权限设置,还可以包含用户自定义的标签或其他属性。
* 唯一标识符 (Unique Identifier): 一个全局唯一的名称或ID,用于在整个存储系统中引用该对象。
对象存储系统通过扁平的地址空间来管理对象,而不是传统的层次结构(文件夹)。你可以想象它是一个巨大的储物柜系统,每个柜子(对象)都有一个唯一的编号,你可以通过这个编号直接访问柜子里的物品,而无需知道它位于哪个楼层或哪个房间。
2. 对象存储的优势
- 高可扩展性: 可以轻松存储从几个GB到数PB甚至EB级别的数据,无需预先规划容量。
- 成本效益: 通常按实际使用的存储容量付费,成本低于块存储,且没有文件系统的管理开销。
- 持久性和可用性: 数据通常在多个设备和地理位置之间进行复制,以确保数据不会丢失(高持久性)并且随时可以访问(高可用性)。
- 简单性: 基于HTTP/HTTPS协议访问,API接口简洁,易于开发和集成。
- 通过元数据进行管理: 可以利用元数据对数据进行分类、搜索和分析。
3. 对象存储的典型应用场景
- 静态网站托管: 存储HTML、CSS、JavaScript文件、图片等。
- 媒体库: 存储图片、音频、视频文件,用于网站、应用或流媒体服务。
- 备份与归档: 存储数据库备份、文件系统快照、历史记录等长期不访问但需要保留的数据。
- 数据湖: 存储原始、半结构化或结构化数据,用于大数据分析和机器学习。
- 云原生应用: 作为微服务或无服务器应用的后端存储。
- 软件分发: 存储安装包、更新文件等。
第二部分:为什么选择 Cloudflare R2?核心优势解析
了解了对象存储的基础,我们来看看 Cloudflare R2 为什么是一个值得考虑的新选择。
1. 无出站流量费用 (No Egress Fees) – R2 的杀手级特性
这是 R2 最具颠覆性的特点。如前所述,传统云服务商的对象存储在数据“出”的时候收费,这对于数据读取量大的应用来说是一个巨大的成本负担。Cloudflare R2 则完全免除这部分费用。无论你存储了多少数据,无论你的用户或应用从 R2 读取了多少数据,你都无需支付额外的流量费用。
这对于以下场景尤其有利:
* 静态网站或应用资源托管: 图片、视频、脚本、CSS文件等被大量用户访问。
* 软件或游戏更新分发: 需要向全球用户分发大文件。
* 数据分析平台: 需要频繁从存储中读取大量数据进行处理。
* 跨区域数据复制或迁移: 将数据从 R2 传输到任何地方都不产生流量费。
* API 后端: API 需要从 R2 读取数据并返回给客户端。
消除出站流量费用,不仅显著降低了运营成本,还使得成本结构变得更加简单和可预测。你可以更自由地设计你的应用架构,无需总是担心流量费用。
2. S3 API 兼容性
Cloudflare R2 完全兼容 Amazon S3 API。这意味着如果你当前正在使用 AWS S3 或任何其他兼容 S3 API 的存储服务,你可以非常容易地将你的应用、工具和工作流程迁移到 R2,或者同时与 R2 和其他 S3 兼容服务协同工作。
大多数支持 S3 协议的工具和库(如 AWS CLI、各种编程语言的 SDK、数据同步工具 rclone 等)都可以通过简单地修改配置(主要是修改端点 URL、Access Key ID 和 Secret Access Key)来与 R2 对接。这极大地降低了迁移和集成的门槛。
3. Cloudflare 全球网络集成
Cloudflare R2 建立在 Cloudflare 遍布全球的边缘网络之上。虽然 R2 本身主要是一个存储服务,但它与 Cloudflare 的其他服务无缝集成,尤其是 Cloudflare Workers 和 Cloudflare CDN。
- 与 Workers 集成: 你可以在 Cloudflare Workers(无服务器函数)中直接访问和操作 R2 存储桶。这使得构建边缘计算应用变得非常方便,你可以直接在靠近用户的边缘处理数据,或者利用 Worker 作为 R2 的代理层,实现复杂的业务逻辑(如权限控制、数据转换、生成临时访问链接等),而无需搭建传统的服务器。
- 与 CDN 集成(通过 Workers 或其他方式): 虽然 R2 本身不直接作为 Cloudflare CDN 的源站(CDN 通常需要 HTTP/HTTPS 源站),但你可以通过 Cloudflare Workers 将 R2 中的对象暴露为 HTTP 端点,然后让 Cloudflare CDN 缓存这些 Workers 生成的响应。这样,静态资源就可以通过 Cloudflare 的全球 CDN 加速分发,提供极低的延迟和极高的吞吐量,同时结合 R2 的无 egress 费用优势。你也可以通过 Workers Sites 功能直接将 Workers 部署在 R2 存储桶上,实现高性能的静态网站托管。
4. 高持久性与可用性
Cloudflare R2 承诺 11 个 9 的数据持久性(99.999999999%),这意味着在一百万年内,每存储一千万个对象,平均只会丢失一个。这得益于 R2 在 Cloudflare 全球分布式网络中的冗余存储策略。同时,R2 也提供了高可用性,保证在任何时候都能可靠地访问你的数据。
5. 简单的定价模型
R2 的定价非常简单透明,主要分为两部分:
* 存储容量费用: 按实际存储的数据量付费,价格具有竞争力。
* 操作请求费用: 对数据操作请求(如 Put, Get, List, Delete 等)收取少量费用。
核心是没有出站流量费用。
这种简单的定价模型使得用户可以轻松预测和控制成本,尤其是在数据读取量大的情况下。
6. 其他优势
- 多部分上传 (Multipart Upload): 支持上传大型文件,提高上传效率和可靠性。
- 自定义域名 (Custom Domains): 可以将你的自定义域名指向 R2 存储桶(通常需要通过 Workers 或 Pages 实现)。
- CORS 支持: 支持跨域资源共享,方便网页应用直接访问 R2 中的资源。
- 生命周期规则 (Lifecycle Policies): 可以设置规则自动删除旧对象,管理存储成本。
第三部分:Cloudflare R2 入门实操:创建存储桶与基础操作
现在,我们开始动手,学习如何在 Cloudflare 仪表板中创建 R2 存储桶并进行基础操作。
1. 前提条件
你需要一个 Cloudflare 账号。如果你还没有,请前往 Cloudflare 官网注册。R2 提供免费层级,你可以先免费试用。
2. 创建 R2 存储桶
- 登录 Cloudflare 仪表板: 访问 dash.cloudflare.com 并登录你的账号。
- 导航到 R2 Storage: 在左侧导航栏中,找到并点击 “R2” 或 “R2 Storage”。
- 创建存储桶: 进入 R2 页面后,点击 “Create Bucket” (创建存储桶) 按钮。
- 命名存储桶: 输入一个唯一的存储桶名称。存储桶名称在 Cloudflare R2 中是全局唯一的,一旦创建后不能修改。选择一个有意义且易于记忆的名称。例如:
my-website-assets
,app-backups-production
,user-uploaded-files
。 - 选择存储桶类型 (可选但建议):
- Standard (标准): 适用于频繁访问的数据,延迟较低。
- Infrequent Access (不频繁访问): 适用于访问频率较低的数据,存储成本更低,但操作费用可能稍高。选择适合你数据访问模式的类型可以优化成本。对于入门和大多数Web资产,Standard 是一个不错的开始。
- 确认创建: 点击 “Create bucket” 按钮。
恭喜你!你已经成功创建了你的第一个 Cloudflare R2 存储桶。
3. 了解存储桶信息
创建完成后,你会在 R2 页面看到你创建的存储桶列表。点击存储桶名称,进入存储桶详情页。在这里你可以看到:
- 存储桶名称: 你设定的名称。
- 存储桶 ID: Cloudflare 分配的一个内部 ID。
- 端点 URL (S3 API Endpoint): 这是最重要的信息之一。这是你通过 S3 API 访问这个存储桶的地址。它通常是
https://<your_bucket_id>.r2.cloudflarestorage.com
或https://<your_bucket_name>.<account_id>.r2.cloudflarestorage.com
(注意:账户 ID 形式的端点是推荐的,它更稳定且不依赖存储桶名称的唯一性)。这个 URL 将在后面配置 S3 客户端时使用。 - 存储量: 当前存储桶中数据的总大小。
- 对象数量: 存储的对象总数。
- 存储类型: 你选择的标准或不频繁访问类型。
4. 通过 Cloudflare 仪表板进行基础操作
在存储桶详情页,你可以直接通过 Web 界面进行一些基础操作:
- 上传对象 (Upload Objects): 点击 “Upload” 按钮,你可以选择文件从本地上传到存储桶。
- 创建文件夹 (Create Folder): R2 虽然是扁平结构,但在仪表板中可以通过创建带有斜杠结尾名称的对象来模拟文件夹层级,方便管理。点击 “Create folder” 按钮。
- 浏览对象: 你可以看到存储桶中的对象列表。
- 下载对象: 点击对象名称,进入对象详情页,可以下载对象。
- 删除对象: 选中对象,点击 “Delete” 按钮。
- 管理公共访问 (Manage Public Access): 默认情况下,R2 存储桶是私有的。你可以通过这里设置,但更推荐通过 Workers 来控制公共访问,或者使用 R2 的公共桶功能(见后)。
- 设置 CORS 规则: 配置跨域资源共享规则。
- 设置生命周期规则: 配置对象的自动删除策略。
仪表板操作适合进行少量文件的管理或快速查看,但对于自动化和批量操作,你需要使用 S3 API。
第四部分:通过 S3 API 访问 R2
通过 S3 API 访问 R2 是其核心使用方式,也是集成到你的应用和工作流中的关键。你需要获取 API 凭证,并配置你的 S3 客户端。
1. 获取 R2 API 凭证
- 导航到 R2 Storage: 在 Cloudflare 仪表板左侧导航栏点击 “R2″。
- 进入 API 凭证页面: 在 R2 页面上方找到并点击 “API Tokens” 或 “Manage R2 API Tokens”。
- 创建 API 令牌: 点击 “Create API Token” (创建 API 令牌)。
- 配置令牌权限:
- 给令牌一个描述性的名称,例如
my-app-r2-access
。 - 选择权限。为了入门和测试,你可以选择 “Edit” 或 “Object Read & Write” (对象读写) 权限。在生产环境中,建议根据最小权限原则,只赋予必要的读写权限。
- 可以设置令牌的过期时间(可选)。
- 给令牌一个描述性的名称,例如
- 生成令牌: 点击 “Create API Token”。
- 记录 Access Key ID 和 Secret Access Key: 非常重要! 令牌创建成功后,Cloudflare 会显示 Access Key ID 和 Secret Access Key。Secret Access Key 只会显示一次,请务必立即复制并妥善保存。 如果丢失了 Secret Access Key,你需要删除当前的令牌并重新创建一个。
Access Key ID 和 Secret Access Key 就是你通过 S3 API 访问 R2 时使用的凭证。
2. 使用 AWS CLI 访问 R2 (推荐)
AWS Command Line Interface (CLI) 是一个强大的工具,可以方便地与任何 S3 兼容的服务(包括 R2)进行交互。
- 安装 AWS CLI: 如果你还没有安装 AWS CLI,请按照官方文档进行安装 (v2 版本推荐)。
- 配置 AWS CLI for R2: 你可以使用
aws configure
命令或通过环境变量来配置。使用aws configure
更常见。
运行命令aws configure
。会提示你输入信息:
bash
$ aws configure
AWS Access Key ID [None]: <粘贴你的 R2 Access Key ID>
AWS Secret Access Key [None]: <粘贴你的 R2 Secret Access Key>
Default region name [None]: auto # 或任意字符串,如 us-east-1。R2 的 region 概念不同,但 CLI 需要一个值。使用 'auto' 是 Cloudflare 推荐的。
Default output format [None]: json # 或 text, table -
指定 R2 端点: AWS CLI 默认与 AWS S3 交互。你需要通过
--endpoint-url
参数告诉 CLI 使用 R2 的端点。为了避免每次输入,可以在配置文件中设置默认端点。
找到你的 AWS CLI 配置文件。通常位于~/.aws/credentials
(存放凭证) 和~/.aws/config
(存放配置) 目录下。
编辑~/.aws/config
文件,添加或修改你的配置profile(默认为[default]
):
ini
[default]
region = auto
output = json
# 添加这一行指定 R2 端点
endpoint_url = https://<你的账户ID>.r2.cloudflarestorage.com # 替换 <你的账户ID>
你的账户 ID 可以在 Cloudflare 仪表板首页 URL 中找到,或者在 R2 存储桶详情页的端点 URL 中找到。例如,如果你的端点是https://abcd1234efgh5678.r2.cloudflarestorage.com
,那么你的账户 ID 就是abcd1234efgh5678
。 -
常用的 AWS CLI for R2 命令示例:
-
列出所有存储桶:
bash
aws s3api list-buckets --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
或者,如果你在配置文件中设置了默认端点,可以简化为:
bash
aws s3api list-buckets
(注意:s3api
命令通常用于管理桶和服务级别操作,而s3
命令用于文件级别的操作。) -
创建存储桶:
bash
aws s3api create-bucket --bucket my-new-r2-bucket --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
(注意:通过 API 创建的存储桶名称仍然需要在 Cloudflare R2 全局唯一) -
列出存储桶中的对象:
bash
aws s3 ls s3://my-existing-r2-bucket --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
简化版 (如果配置了默认端点):
bash
aws s3 ls s3://my-existing-r2-bucket -
上传文件 (复制本地文件到 R2):
bash
aws s3 cp /path/to/local/file.txt s3://my-existing-r2-bucket/destination/file.txt --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
简化版:
bash
aws s3 cp /path/to/local/file.txt s3://my-existing-r2-bucket/destination/file.txt
你可以用aws s3 cp . s3://my-existing-r2-bucket/myfolder/ --recursive
来上传整个本地文件夹。 -
下载文件 (复制 R2 文件到本地):
bash
aws s3 cp s3://my-existing-r2-bucket/path/to/remote/file.txt /path/to/local/destination/file.txt --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
简化版:
bash
aws s3 cp s3://my-existing-r2-bucket/path/to/remote/file.txt /path/to/local/destination/file.txt
同样支持--recursive
下载整个文件夹。 -
删除对象:
bash
aws s3 rm s3://my-existing-r2-bucket/path/to/object.txt --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
简化版:
bash
aws s3 rm s3://my-existing-r2-bucket/path/to/object.txt
使用--recursive
删除整个文件夹:
bash
aws s3 rm s3://my-existing-r2-bucket/myfolder/ --recursive -
同步文件夹 (本地与 R2 保持同步):
bash
aws s3 sync /path/to/local/folder s3://my-existing-r2-bucket/destination/folder --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
或反向同步:
bash
aws s3 sync s3://my-existing-r2-bucket/source/folder /path/to/local/destination/folder --endpoint-url https://<你的账户ID>.r2.cloudflarestorage.com
sync
命令非常强大,它会比较源和目标,只复制、删除或更新必要的文件以使两者内容一致。
-
3. 使用 S3 SDKs (以 Python 为例)
大多数编程语言都有成熟的 S3 SDK,你可以用它们来与 R2 交互。这里以 Python 的 boto3
库为例。
- 安装 boto3:
bash
pip install boto3 -
Python 代码示例:
“`python
import boto3
import os替换为你的 R2 凭证和账户 ID
R2_ACCESS_KEY_ID = os.environ.get(“R2_ACCESS_KEY_ID”)
R2_SECRET_ACCESS_KEY = os.environ.get(“R2_SECRET_ACCESS_KEY”)
R2_ACCOUNT_ID = os.environ.get(“R2_ACCOUNT_ID”) # 从你的 R2 端点 URL 或 Cloudflare 仪表板获取
R2_BUCKET_NAME = “my-existing-r2-bucket”R2 端点 URL 格式
R2_ENDPOINT_URL = f”https://{R2_ACCOUNT_ID}.r2.cloudflarestorage.com”
创建 S3 客户端
s3_client = boto3.client(
“s3″,
endpoint_url=R2_ENDPOINT_URL,
aws_access_key_id=R2_ACCESS_KEY_ID,
aws_secret_access_key=R2_SECRET_ACCESS_KEY,
region_name=”auto” # 或任意字符串,如 ‘us-east-1’
)print(f”连接到 R2 端点: {R2_ENDPOINT_URL}”)
try:
# 1. 列出所有存储桶
# 注意:boto3 的 list_buckets 方法通常需要 endpoint_url 在 client 创建时指定
response = s3_client.list_buckets()
print(“\n存储桶列表:”)
for bucket in response[‘Buckets’]:
print(f”- {bucket[‘Name’]}”)# 2. 上传一个文件 file_to_upload = "hello_r2.txt" with open(file_to_upload, "w") as f: f.write("Hello, Cloudflare R2!") object_key = "my_folder/hello.txt" # 文件在 R2 中的路径和名称 print(f"\n正在上传文件 {file_to_upload} 到 {R2_BUCKET_NAME}/{object_key}...") s3_client.upload_file(file_to_upload, R2_BUCKET_NAME, object_key) print("上传成功!") # 3. 列出存储桶中的对象 (在指定的路径下) print(f"\n列出存储桶 '{R2_BUCKET_NAME}' 中的对象:") response = s3_client.list_objects_v2(Bucket=R2_BUCKET_NAME, Prefix="my_folder/") if 'Contents' in response: for obj in response['Contents']: print(f"- {obj['Key']} ({obj['Size']} bytes)") else: print("指定路径下没有对象。") # 4. 下载一个文件 download_dest = "downloaded_hello.txt" print(f"\n正在从 {R2_BUCKET_NAME}/{object_key} 下载到 {download_dest}...") s3_client.download_file(R2_BUCKET_NAME, object_key, download_dest) print("下载成功!") with open(download_dest, "r") as f: print(f"下载内容: {f.read()}") # 5. 删除一个文件 print(f"\n正在删除对象 {R2_BUCKET_NAME}/{object_key}...") s3_client.delete_object(Bucket=R2_BUCKET_NAME, Key=object_key) print("删除成功!") # 清理本地文件 os.remove(file_to_upload) os.remove(download_dest)
except Exception as e:
print(f”发生错误: {e}”)``
R2_ACCESS_KEY_ID
将上面的代码中的占位符替换为你实际的 R2 凭证、账户 ID 和存储桶名称,并确保你已经设置了环境变量,
R2_SECRET_ACCESS_KEY,
R2_ACCOUNT_ID` 或直接硬编码到脚本中(不推荐,环境变量更安全)。运行此脚本,即可通过 Python 与 R2 进行交互。
4. 通过 Cloudflare Workers 访问 R2
Cloudflare Workers 是在 Cloudflare 全球网络边缘运行的无服务器函数。它与 R2 的集成非常紧密和便捷。
- 安装 Wrangler CLI: Cloudflare 的开发者工具 Wrangler 用于管理 Workers 和 Pages。
bash
npm install -g wrangler -
绑定 R2 存储桶到 Worker: 在 Workers 项目的
wrangler.toml
配置文件中,添加一个[[r2_buckets]]
配置块来绑定 R2 存储桶。
“`toml
name = “my-r2-worker” # Worker 的名称
main = “src/index.ts” # 入口文件[[r2_buckets]]
binding = ‘MY_R2_BUCKET’ # 在 Worker 代码中引用此 R2 桶的变量名
bucket_name = ‘my-existing-r2-bucket’ # 你的 R2 存储桶名称
``
MY_R2_BUCKET` 会在 Worker 的运行时环境中作为一个 R2Bucket 对象暴露出来。
这里的
3. Worker 代码示例 (JavaScript/TypeScript):“`javascript
// src/index.ts
interface Env {
MY_R2_BUCKET: R2Bucket; // 在 wrangler.toml 中绑定的 R2 桶变量名
}export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise{
const url = new URL(request.url);
const objectKey = url.pathname.slice(1); // 获取路径作为对象 keyif (request.method === 'PUT') { // 示例:上传文件 (PUT 请求) if (!request.body) { return new Response('Request body required', { status: 400 }); } try { await env.MY_R2_BUCKET.put(objectKey, request.body); return new Response(`Object '${objectKey}' uploaded successfully`, { status: 201 }); } catch (error) { return new Response(`Error uploading object: ${error}`, { status: 500 }); } } else if (request.method === 'GET') { // 示例:下载文件 (GET 请求) if (!objectKey) { return new Response('Object key required', { status: 400 }); } const object = await env.MY_R2_BUCKET.get(objectKey); if (object === null) { return new Response('Object Not Found', { status: 404 }); } // 返回 R2 对象作为响应 const headers = new Headers(); object.writeHttpMetadata(headers); // 将 R2 对象的元数据写入 HTTP 头 headers.set('ETag', object.etag); // 设置 ETag return new Response(object.body, { headers, }); } else if (request.method === 'DELETE') { // 示例:删除文件 (DELETE 请求) if (!objectKey) { return new Response('Object key required', { status: 400 }); } try { await env.MY_R2_BUCKET.delete(objectKey); return new Response(`Object '${objectKey}' deleted successfully`, { status: 200 }); } catch (error) { return new Response(`Error deleting object: ${error}`, { status: 500 }); } } else { return new Response('Method Not Allowed', { status: 405 }); }
},
};
``
env.MY_R2_BUCKET
这个简单的 Worker 示例演示了如何通过 Worker 的 fetch 方法处理 HTTP 请求,并根据请求方法(PUT/GET/DELETE)调用绑定的对象上的相应方法 (
put,
get,
delete) 来操作 R2 存储桶。你可以部署这个 Worker,并通过 Worker 的 URL 来上传、下载和删除对象,例如
PUT /path/to/your/file会将文件上传到 R2 的
path/to/your/file` 位置。通过 Workers 访问 R2 的优势在于:
* 极低的延迟: Worker 和 R2 都在 Cloudflare 的边缘网络上运行,访问速度快。
* 灵活控制: 可以在 Worker 中实现复杂的逻辑,如权限检查、数据格式转换、自定义响应头等。
* 无服务器: 无需管理服务器基础设施。
* 利用 Cloudflare 生态: 可以结合 Cloudflare CDN、Cache API 等进一步优化性能。
第五部分:Cloudflare R2 高级应用与考量
1. 公共访问与静态资源托管
虽然 R2 默认是私有的,并且通过 Workers 控制访问更灵活,但 R2 也支持将存储桶配置为公开访问。
- 设置公共桶: 在 Cloudflare 仪表板的 R2 存储桶详情页,找到 “Settings” 或相关选项,可以找到 “Bucket Access” 或 “Public Access” 的设置。启用公共访问后,R2 会为你生成一个公共访问域名,例如
https://pub-<random-id>.r2.dev/<bucket-name>/
。通过这个 URL,任何人都可以直接通过 HTTP GET 请求访问存储桶中的对象。 - 使用公共桶托管静态网站: 你可以将静态网站文件上传到公共 R2 存储桶,并访问相应的公共 URL 来浏览网站。
- 考量: 虽然公共桶方便,但请谨慎使用,确保不会意外暴露敏感信息。对于大多数生产环境的静态网站,更推荐结合 Workers/Pages 和 R2 来实现,可以获得更好的性能(通过 CDN 缓存)和更灵活的控制。Cloudflare Pages 可以直接绑定 R2 存储桶作为资产存储,这是托管静态网站的推荐方式。
2. 集成 Cloudflare Pages / Workers Sites
Cloudflare Pages 和 Workers Sites 提供了构建和托管静态网站及单页应用的完整工作流程。它们可以将构建后的静态资源直接部署到 Cloudflare 的全球网络中,并可以选择将部分或全部静态资产存储在 R2 中。这种集成方式可以利用 R2 的低成本存储和无 egress 费用优势,同时享受 Pages/Workers Sites 提供的构建、版本控制、自定义域名、SSL 以及 Cloudflare CDN 的加速能力。
3. 生命周期规则 (Lifecycle Policies)
你可以为 R2 存储桶设置生命周期规则,以便根据预设的策略自动删除对象。这对于管理日志文件、备份版本或任何有时效性的数据非常有用,可以帮助你控制存储成本。
- 常见规则:
- 在对象创建一定天数后删除。
- 删除对象的旧版本(如果启用了版本控制)。
- 设置方法: 在 Cloudflare 仪表板的 R2 存储桶设置中找到 “Lifecycle Rules” 进行配置。
4. CORS (跨域资源共享)
如果你的网页应用(运行在 domain-a.com
)需要直接从 R2 存储桶(公共访问或通过 Workers 代理,其源可能被视为 domain-b.r2.dev
或 your-worker.workers.dev
)中加载资源(如图片、字体、API数据),可能会遇到跨域问题。通过在 R2 存储桶上配置 CORS 规则,你可以允许特定的源(domain-a.com
)访问存储桶中的资源。
- 设置方法: 在 Cloudflare 仪表板的 R2 存储桶设置中找到 “CORS Rules” 进行配置,指定允许的来源、HTTP 方法和头部等。
5. 数据迁移工具 – rclone
rclone
是一个命令行程序,用于同步文件和目录到各种云存储提供商,包括 Cloudflare R2。如果你需要从 AWS S3、Google Cloud Storage 或其他地方迁移大量数据到 R2,rclone
是一个非常方便且强大的工具。
- 配置 rclone: 你需要创建一个 rclone 配置文件,指定 R2 的类型 (
s3
)、端点 URL、Access Key ID 和 Secret Access Key。 - 使用 rclone: 使用
rclone sync
或rclone copy
命令将数据从源同步或复制到 R2。例如:
bash
rclone sync source-remote:source-path r2-remote:my-r2-bucket --progress
6. 安全考量
- 最小权限原则: 创建 R2 API 令牌时,只赋予完成任务所需的最小权限。避免使用具有所有存储桶所有权限的令牌。
- 妥善保管凭证: Access Key ID 和 Secret Access Key 等同于你的身份,务必安全存储,避免泄露。不要将它们直接硬编码到公共可见的代码中,使用环境变量或 secrets 管理工具。
- 谨慎设置公共访问: 除非绝对必要,否则不要将存储桶设置为完全公共访问。对于需要公开访问的静态资源,考虑通过 Workers/Pages + R2 的方式提供服务,可以更好地控制缓存、安全策略和访问权限。
- 定期审计访问日志: 如果有需要,可以查看 R2 的访问日志(尽管可能不如 AWS S3 的详细日志功能丰富),监控异常访问行为。
第六部分:R2 与其他对象存储服务的比较
R2 最显著的优势是其零出站流量费用。这是它与其他主要云服务商的对象存储服务(如 AWS S3, Google Cloud Storage, Azure Blob Storage)的核心差异点。
- AWS S3: 功能最丰富,生态系统最庞大,提供多种存储级别(Standard, IA, Glacier 等)、复杂的权限管理、事件通知、数据分析集成等。但出站流量费用较高。
- Google Cloud Storage (GCS): 也提供多种存储级别和丰富的功能。同样存在出站流量费用。
- Azure Blob Storage: Microsoft Azure 的对象存储服务,提供不同的访问层级。也收取出站流量费用。
何时选择 R2:
* 你的应用有大量的读操作(用户下载、API 读取、数据分析读取)。
* 你希望降低或消除不可预测的出站流量成本。
* 你正在使用或计划使用 Cloudflare 的其他服务(Workers, Pages, CDN),希望获得紧密的集成优势。
* 你需要 S3 API 兼容性以便轻松迁移或集成。
* 你对简单的定价模式有偏好。
何时可能优先考虑其他服务 (或结合使用):
* 你的工作负载主要是写入操作,读取很少。
* 你需要特定地域的存储(目前 R2 是全球分布的,没有像 S3 那样选择特定区域存储数据的选项,尽管数据会存储在靠近用户或写入源的边缘)。
* 你需要一些 R2 目前尚未提供的特定高级功能(例如,S3 Glacier 的超低成本归档层、S3 Batch Operations 的复杂批量处理、高度细致的 IAM 策略、深入的监控和分析集成等)。
* 你的整个基础设施都在某个特定的云服务商上,并且高度依赖其内部网络和集成服务。
很多情况下,结合使用不同的服务可能是最优解。例如,你可以将读写频繁、对外分发的数据存储在 R2 以节省流量费,而将用于内部处理、归档或与其他云服务紧密集成的少量读取数据存储在 S3 或 GCS。
第七部分:定价概览
Cloudflare R2 的定价模型非常简单,主要包括两项:
- 存储费用: 按月存储的数据量计费,通常以 GB 为单位。标准存储和不频繁访问存储的单价不同。
- 操作费用: 对执行的对象操作(如 GET 请求、PUT 请求等)按类别和数量计费。不同操作类型的单价不同。Class A Operations (如 PUT, POST, COPY) 通常比 Class B Operations (如 GET, HEAD) 贵。列表操作 (ListObjects) 也单独计费。
- 出站流量费用: $0。这是 R2 最关键的成本优势。
Cloudflare 提供了免费层级,通常包含一定量的免费存储容量和操作请求数量,这对于测试和小型项目非常友好。详细且最新的价格信息应参考 Cloudflare 官方网站的 R2 定价页面。
简单的定价结构和零出站费用使得 R2 的成本更容易预测,尤其是在数据读取量大的情况下,通常能带来显著的成本节约。
结语:R2 – 对象存储的新篇章
Cloudflare R2 Storage 的出现,无疑给对象存储市场带来了新的活力。它以 S3 兼容性和极具吸引力的零出站流量费用为核心卖点,结合 Cloudflare 强大的全球网络和边缘计算能力,为开发者和企业提供了一个强大且成本效益高的选择。
无论你是正在寻找降低云存储成本的途径,还是希望利用 Cloudflare 生态构建现代化应用,R2 都值得你深入了解和尝试。从简单的静态资源托管,到复杂的边缘数据处理和分发,R2 都能扮演重要的角色。
通过本文的入门指南,你应该对 Cloudflare R2 有了全面的认识,并掌握了创建存储桶、通过 S3 API 和 Workers 进行基础操作的方法。立即开始你的 R2 之旅吧,探索它如何为你的业务开启对象存储的新篇章!
希望这篇文章详细且全面,满足你的要求!