R2は開発者にオブジェクトストレージを提供しますが、エグレス料金は発生しません。R2以前、私たちがクラウドプロバイダーから言われていたことは、利用者が当社に保存したデータを実際に使用するたびに、データ転送料金を要求するというものでした。決して読み取らないことを前提にデータを保存する人などいるでしょうか?そんな人はいないでしょう。とはいえ、データを読み取るたびに「エグレス料金」は適用されます。R2では、開発者はデータに自由にアクセスできるようになり、アプリケーション開発者を長く縛ってきたエコシステムのロックインを解消します。
2022年5月、当社はR2のオープンベータ版をリリースしました。わずか4か月の短い期間で、12,000を超える開発者(急速に増加中)がR2を使い始めたことに圧倒されています。ポッドキャストアプリケーションからビデオプラットフォーム、Eコマースウェブサイトまで、幅広いユースケースを持った開発者、そしてVecteezyのような6桁(米ドル)ものエグレス料金を費やしているユーザーも当社を訪れました。私たちは学習を急速に進め、素晴らしいフィードバックを得て、本日R2の一般公開を発表できる運びとなったことを嬉しく思います。
当社はお客様に対して、自分たちが賭けることのできなかった技術に賭けてくださいとは言いません。オープンベータ期間中は、自社製品をR2に移行するために時間を費やしました。多数の顧客に本番環境でサービスを提供していることを誇りにしているCloudflare Imagesはその中の一例であり、現在R2で稼働しています。
R2に期待できることは?
S3との互換性
R2は開発者に、オブジェクトストレージのための使い慣れたインターフェースであるS3 APIを提供します。S3との互換性により、アプリケーションの移行が容易で、R2が提供する機能をすぐに利用することができます。
JavaScriptでの基本的なデータ操作を見てみましょう。これをお客様自身で試すには、アクセスキーを生成する必要があります。
S3 APIは、Go、Java、PHP、Rubyなどを例にしても、言語を問わずに親和性があります。
// 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以上の拠点に自動的にデプロイされます。WorkersとR2の組み合わせによって、開発者はパフォーマンスのオーバーヘッドなしで、データに関するカスタムロジックを追加することができます。Workersはコンテナではなく独立した環境で構築されるため、長時間のコールドスタートに悩まされることはありません。
R2バケット用の簡単なREST APIを作成してみましょう。まず、バケットを作成し、次に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,
});
}
},
};
Presigned URL(署名付き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のデータの上でAccess、Cache、ボット管理などのCloudflareの他の機能をシームレスに有効にすることが可能です。
結論として、公開バケットは、ドメイン指向のCloudflare機能とR2のバケットとの間にあるギャップを埋めるのに役立ちます。
透明性のある価格設定
R2がエグレスに課金することはありません。価格モデルは、ストレージ容量、クラスA操作(書き込み、リスト)、クラスB操作(読み取り)の3つの要因のみで決定されます。
ストレージ 月額 $0.015 / GB
クラスA操作 $4.50/ 100万回。
クラスB操作 $0.36/ 100万回
ただし、R2への支払いを開始する前に、まったくコストをかけずに立ち上げて運用することができます。含まれる使用方法は次のとおりです:
データ保存 10GB / 月
クラスA操作 100万回 / 月
クラスB操作 1000万回 / 月
今後の展開は?
R2の一般リリースは、オブジェクトストレージの旅の始まりに過ぎません。今後の当社の構築計画をお知らせします。
オブジェクトのライフサイクル
将来的には、R2によって開発者はオブジェクトにポリシーを設定できるようになります。たとえば、最後にアクセスされてから60日後にオブジェクトを削除するポリシーを設定します。オブジェクトのライフサイクルを使用すると、オブジェクト管理をオブジェクトストアにまで引き下げます。
法域の制限
リージョンを明示的にサポートする計画はありませんが、多くのコンプライアンスのユースケースにおいて、データの局所性が重要であることは認識しています。法域の制限により、開発者が「EU」のような法域を設定することで、データが法域を離れることを防ぐことができます。
ダウンタイムのないライブマイグレーション
大規模なデータセットの場合、データの移動に時間がかかるため、移行はライブで継続的に行われます。キャッシュリザーブは、ボタン1つでお客様のアセットをマネージドR2インスタンスに素早く移行してエグレスコストを削減する簡単な方法です。今後、既存のS3オブジェクトストレージバケットをすべてR2に移行できるように、このメカニズムを拡張する予定です。今すぐR2にサインアップして、使用を開始してください。Cloudflareを基盤とする成長を続ける開発者コミュニティに参加してください。ご意見やご質問がございましたらこちらからDiscord serverをご覧ください。あなたが構築なさるものを見ることを楽しみにしています。