👏

Cloudflare Calls TURN Serviceを使ってみた

2024/06/25に公開

CloudflareのTURNサービスを使ってWebRTCで通信してみました。

https://developers.cloudflare.com/calls/turn/

動作確認のために作ったコードはGitHubにあります。

はじめに

TURNとはWebRTCの他、ゲームのオンライン通信でも使われており、通信をリレーする役割を持ちます。
NATや企業ネットワークの制限などで直接ピアが通信できない場合にTURNを経由することでより広い範囲でWebRTCなどが利用できるようになります。
Cloudflare Calls[1]ではWebRTCで利用されるSFUも提供されていますが、今回は割愛します。

トークンの取得

Callsのページの右上にあるCreateからTURN service tokenを選びます。

名前さえつければトークンが出力されます。
トークンの内API Tokenは再表示されないらしいので確実に保存しておきましょう。

Credentialの取得

ドキュメントにあるように以下のAPIを叩くことでJSONが返ってきます。
見た感じ有効期限が設定できそうです。

curl -X POST \
	-H "Authorization: Bearer $TURN_KEY_API_TOKEN" \
	-H "Content-Type: application/json" -d '{"ttl": 86400}' \
	https://rtc.live.cloudflare.com/v1/turn/keys/$TURN_KEY_ID/credentials/generate

叩くと以下のようなAPIで返ってきます。

{
  "iceServers": {
    "urls": [
      "stun:stun.cloudflare.com:3478",
      "turn:turn.cloudflare.com:3478?transport=udp",
      "turn:turn.cloudflare.com:3478?transport=tcp",
      "turns:turn.cloudflare.com:5349?transport=tcp"
    ],
    "username": "bc91b63e2b5d759f8eb9f3b58062439e0a0e15893d76317d833265ad08d6631099ce7c7087caabb31ad3e1c386424e3e",
    "credential": "ebd71f1d3edbc2b0edae3cd5a6d82284aeb5c3b8fdaa9b8e3bf9cec683e0d45fe9f5b44e5145db3300f06c250a15b4a0"
  }
}

このままだとRTCPeerConnectionに渡せないので以下のようにします。

const iceServers = urls.map(url => ({urls: url, username, credential}));

const configuration = {iceServers, iceTransportPolicy: 'relay'};

const offer = new RTCPeerConnection(configuration);

これでCloudflareのTURNを使うようにできました。
この設定の状態でWebRTC internalsを見ると以下のようにTURN経由で接続されている事が分かります。
IP Rangesのページを見ると、これらのIPアドレスが含まれていることが確認できます。

このように自分でサーバを用意せずに簡単にTURNを使うことができました。

その他

このように簡単に使うことができたCloudflare Calls TURN Serviceですが、FAQによると1000GBの無料枠があります。
TURNの無料枠でSkyWayの500GB/月を上回る所が出てくるとは思いませんでした。
ただし、月毎とは書いてないように見えるのでもしかしたら初回の1000GBなのかもしれません。
Billingのページなどで現在の利用量は見えなかったので使いすぎには注意が必要かもしれません。

脚注
  1. まだベータ版である点には注意が必要です ↩︎

Discussion