订阅以接收新文章的通知:

R2 现已正式发布

2022-09-21

4 分钟阅读时间
这篇博文也有 EnglishDeutsch日本語EspañolРyсскийPolskiFrançais版本。

R2 为开发者提供零出口费用的对象存储。在 R2 出现以前,云提供商告诉我们,每次使用其中存储的数据时都要支付传输费用。谁会存储数据而打算永远不再读取?没有人会这样做。然而,每次读取数据时,您都要支付出口费用。R2 为开发人员提供了免费访问数据的能力,打破了长期束缚应用程序构建者的生态系统锁定。

R2 is now Generally Available

2022 年 5 月,我们发布了 R2 公测版。短短 4 个月时间,超过 1.2 万开发人员要开始使用 R2,而且人数还在不断增加,让我们应接不暇。这些开发者带着从播客应用到视频平台到电子商务网站的各种用例来找我们,还有像 Vecteezy 这样正在支出高达 6 位数出口费用的用户。我们快速学习,获得了很好的反馈,今天很高兴能宣布 R2 现已普遍可用。

我们不会要求您押注我们自己不愿意押注的技术。在公测阶段,我们花时间将自己的产品迁移到 R2 上。Cloudflare Images 就是这样一个例子,它为成千上万的客户在生产中提供服务,现在也使用了 R2。

R2 有何值得期待之处?

S3 兼容性

R2 为开发人员提供了熟悉的对象存储接口,S3 API。借助 S3 兼容性,客户可轻松地迁移应用程序,并立即开始利用 R2 的优势。

我们来看一下 JavaScript 中的一些基本数据操作。如果要亲自尝试,您将需要生成一个 Access Key

无论使用哪种语言,S3 API 都能提供熟悉的感觉。我们有这些语言的示例:GoJavaPHPRuby

// First we import our bindings as usual
import {
  S3Client,
  ListBucketsCommand,
} from "@aws-sdk/client-s3";

// Then we create a new client. Note that while R2 requires a region for S3 compatibility, only “auto” is supported
const S3 = new S3Client({
  region: "auto",
  endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: ACCESS_KEY_ID, //  fill in your own
    secretAccessKey: SECRET_ACCESS_KEY, // fill in your own
  },
});

// And now we can use our client to list associated buckets just like we would with any other S3 compatible object storage
console.log(
  await S3.send(
    new ListBucketsCommand('')
  )
);

区域:自动

我们不想活在这样的一个世界里:开发人员需要盯着水晶球,预测应用程序流量可能来自哪里。在应用程序开发的第一步选择区域,迫使开发人员在首批用户出现很久以前就做出优化决定。

虽然 S3 兼容性要求您指定区域,我们支持的唯一区域是“auto”。今天,R2 自动在最接近创建存储桶请求的可用区域中选择一个存储桶位置。如果我从位于奥斯汀的家中创建一个存储桶,这个存储桶将位于距离奥斯汀最近的可用 R2 区域中。  

日后,R2 将使用数据访问模式来自动优化数据存储的位置,以提供最佳用户体验。

Cloudflare Workers 集成

Workers 平台为开发人员提供了跨 Cloudflare 网络的强大计算能力。当您在 Workers 上部署时,您的代码会自动部署到 Cloudflare 全球 275 多个数据中心。当与 R2 配合使用时,Workers 允许开发人员围绕数据添加自定义逻辑,而没有任何性能开销。Workers 基于隔离而非容器构建,因此无需漫长的冷启动。

让我们尝试为 R2 存储桶创建一个简单的 REST API 吧。首先创建存储桶,然后 Worker 中添加一个 R2 绑定

通过这个 Workers API,我们可以将各种有用的逻辑添加到 R2 请求的热路径中。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const key = url.pathname.slice(1); // we’ll derive a key from the url path

    switch (request.method) {
      // For writes, we capture the request body and write that out to our bucket under the associated key
      case 'PUT':
        await env.MY_BUCKET.put(key, request.body);
        return new Response(`Put ${key} successfully!`);

      // For reads, we’ll use our key to perform a lookup
      case 'GET':
        const object = await env.MY_BUCKET.get(key);

        // if we don’t find the given key we’ll return a 404 error
        if (object === null) {
          return new Response('Object Not Found', { status: 404 });
        }

        const headers = new Headers();
        object.writeHttpMetadata(headers);
        headers.set('etag', object.httpEtag);

        return new Response(object.body, {
          headers,
        });
    }
  },
};

预签名 URL

有时,您需要向您的用户授予 R2 中特定对象的权限,而不需要他们通过重重障碍。通过预签名 URL,您可以将任何对象和动作的独特组合的权限委托给用户。创建一个预签名 URL,让用户上传文件或共享文件,而无需访问整个存储桶。

通过预签名 URL,开发人员可以轻松构建让终端用户直接安全地访问 R2 的应用程序。

import {
  S3Client,
  PutObjectCommand
} from "@aws-sdk/client-s3";

import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const S3 = new S3Client({
  region: "auto",
  endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: ACCESS_KEY_ID,
    secretAccessKey: SECRET_ACCESS_KEY,
  },
});

// With getSignedUrl we can produce a custom url with a one hour expiration which will allow our end user to upload their dog pic
console.log(
  await getSignedUrl(S3, new PutObjectCommand({Bucket: 'my-bucket-name', Key: 'dog.png'}), { expiresIn: 3600 })
)

公共存储桶

通过启用对一个 R2 存储桶的公共访问权限,您能够将该存储桶暴露给未经身份验证的请求。虽然这样做本身用途有限,当这些存储桶与您 Cloudflare 帐户下的某个域关联时,您可以对您在 R2 中的数据无缝启用其他 Cloudflare 功能,例如 Access、缓存和机器人管理。

底线是,公共存储桶帮助弥合面向域的 Cloudflare 功能与您的 R2 存储桶之间的空白。

透明定价

R2 绝不会收取出口费用。定价模式仅取决于三个因素:存储量,A 类操作(写入,列出)和 B 类操作(读取)。

  • 存储定价为 0.015 美元/GB/每月。

  • A 类操作费用为 4.50 美元/百万次

  • B 类操作费用为 0.36 美元/百万次。

但是,在您准备好开始为 R2 付费以前,我们允许您完全免费地启动并运行。包含的使用量如下:

  • 10 GB/月的存储数据

  • A 类操作 100 万次/月

  • B 类操作 1000 万次/月

接下来?

使 R2 普遍可用只是我们对象存储旅程的开端。我们很高兴能分享下一步的构建计划。

对象生命周期

未来,R2 将允许开发人员设置有关对象的策略。例如,设置一项策略来删除最后一次访问距今 60 天的对象。对象生命周期将对象管理向下延伸到对象存储。

司法管辖区限制

虽然我们没有计划显式地支持区域,但我们知道数据位置对于许多合规用例都很重要。司法管辖区限制将允许开发人员设置类似“欧盟”的司法管辖区,从而防止数据离开该司法管辖区。

不停机实时迁移

对于大型数据集而言,迁移是实时和持续进行的,因为移动数据需要时间。缓存储备是一键将资产迁移到托管 R2 示例以减少出口费用的简单方法。日后,我们将扩展这一机制,以便您能将任何现有 S3 对象存储桶迁移到 R2。

我们欢迎所有人立即注册并开始使用 R2。加入 Cloudflare 上不断扩大的开发人员社区。如有任何反馈或疑问,请点击这里通过我们的 Discord 服务器联系我们。我们迫不及待要看到您构建的应用!

在 Cloudflare TV 上观看

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
GA WeekGeneral AvailabilityCloudflare WorkersR2 Storage开发人员Developer Platform

在 X 上关注

Aly Cabral|@Aly_Cabral
Cloudflare|@cloudflare

相关帖子

2024年10月31日 13:00

Moving Baselime from AWS to Cloudflare: simpler architecture, improved performance, over 80% lower cloud costs

Post-acquisition, we migrated Baselime from AWS to the Cloudflare Developer Platform and in the process, we improved query times, simplified data ingestion, and now handle far more events, all while cutting costs. Here’s how we built a modern, high-performing observability platform on Cloudflare’s network. ...