Cloudflare R2 の周辺機能も紹介できるようにまとめてみる

# 目的

Cloudflare R2 といっても、使う人にとっては様々なユースケースがある。
画像や動画などの非構造化データの保管、ログの出力先、バックアップデータの保管先、データ分析用ストレージなど、幅広くあってしかるべきという認識があり、一度現状を一目で確認できるように整理したい。

![object-storage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/a01fbae4-40a2-0a1c-faa6-9c435c725fd4.png)

# R2 とは
よくこのスライドを使います。

![r2-one-pager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/6334a4d4-2d3e-9462-f781-30fb77ba5117.png)


# R2 の周辺機能
`mermaid` でまとめると、こうなった。

https://github.com/kyouheicf/cloudflare-mermaid-diagrams/blob/main/r2-feature-and-integration.md

```mermaid:
graph TB

subgraph Cloudflare
subgraph Workers
CacheAPI[Cache API]
IR[Transform images]
end
subgraph Websites
subgraph Domain[Zone]
direction LR
Access
Caching
end
end
WDEV[xxx.workers.dev]
Logpush
LE[Log Explorer]
Token[R2 API Token]
PDEV[xxx.pages.dev]
subgraph R2
subgraph R2Bucket [Bucket]
direction LR
subgraph Location
direction LR
subgraph Automatic
Hint["Location Hints<br>(a best effort and not a guarantee)"]
end
Jurisdiction["Jurisdictional Restrictions<br>(guaranteed option)"]
end
subgraph storageClass [Storage Class]
direction LR
Standard
Infrequent["Infrequent Access"]
end
subgraph Settings[Other Settings]
direction LR
CORS[CORS Policy]
Lifecycle[Object lifecycle rules]
Event[Event Notification]
end
Location ~~~ storageClass ~~~ Settings
end
subgraph R2Bucket2 [Bucket]
end
Sippy["Sippy<br>(incremental migration)"]
Slurper["Super Slurper<br>(one-time migration)"]
R2DEV[xxx.r2.dev]
Custom[Custom Domains]
presigned["Presigned URLs<br>(xxx.r2.cloudflarestorage.com)"]
S3API["S3 API<br>(xxx.r2.cloudflarestorage.com)"]
end
end

subgraph AWS
subgraph S3
S3Bucket1[Bucket]
end
end

subgraph GCP [Google Cloud]
subgraph GCS [Google Cloud Storage]
GCSBucket1[Bucket]
end
end

S3Bucket1 ------ Slurper & Sippy --> R2Bucket
GCSBucket1 ------ Slurper & Sippy
R2Bucket2 --- Slurper

R2Bucket ~~~ LE --> |HTTP Requests Logs<br>Firewall Event Logs|R2Bucket
LE ~~~ R2Bucket

cli[CLI tools<br>like aws CLI or rclone] & sdk[SDK or Library] ---> Token --> S3API --- R2Bucket
Token -..-> |Generate|presigned
Public --> |Temporary<br>and<br>Conditional<br>Access|presigned --- R2Bucket
WDEV --> Workers ----> |Binding|R2Bucket
Public --> PDEV --> |Pages Functions|Workers
Public[Public Access] --> Domain ----- Custom --- R2Bucket
Domain --> |Workers Routes<br>or<br>Pages Functions|Workers
Public --> WDEV
Workers --> |fetch & cache.put|presigned
Public --> |Allow Access|R2DEV --- R2Bucket
Logpush --> |Zero Trust Network Session Logs,<br>HTTP Requests Logs, etc.|R2Bucket

```

以下、補足。

## 移行ツール
S3 および GCS を利用中の場合は、Cloudflare が提供する移行ツール <a href='https://developers.cloudflare.com/r2/data-migration/super-slurper/'>Super Slurper</a> または <a href='https://developers.cloudflare.com/r2/data-migration/sippy/'>Sippy</a> を適用できる。
使用感はいくつかブログがあるので、参照していただきたい。

https://zenn.dev/kameoncloud/articles/542c0c9b8f9b2d

https://accelia.xsrv.jp/column/cloudflaretips/7265/

## S3 API 
S3 互換であるため、既存ツール群は安心して使い続けられます。

![s3-compatibility.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/616f7560-9c59-875d-9766-34275c1e42ed.png)

## 接続オプション
以下のまとめも参考になります。

https://zenn.dev/oymk/articles/17c894e24100be

## Logpush + Log Explorer

<a href='https://developers.cloudflare.com/logs/get-started/enable-destinations/r2/'>Logpush</a> + <a href='https://developers.cloudflare.com/logs/log-explorer/'>Log Explorer</a> は非常に便利な組み合わせのため、推奨したい。
外部サービスに依存することなく、Cloudflare サービスだけでログの保管・検索までが実現できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/937cdcda-9d6b-4315-b1f5-3cbec2c577c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/ffaa9222-4c2b-15f6-a0f4-4f3f51b34583.png)

# まとめ

やはり一度こういったランドスケープを整理して持っておくと、それぞれの位置付けもよくわかり、今後の話にも使えそうです。