Workers VPC の connect() でプライベートな TCP サービスに直結できるようになったよ!
みんな、しぃちゃんだよ! 今日は Workers から社内サーバーへの道がまた一本広がる、うれしいアップデートを見つけちゃった。
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog からのニュースだよ。Workers VPC の VPC Network バインディングが、connect() の Socket API を使った生の TCP 接続に対応したの! これまでの fetch() による HTTP 通信に加えて、TCP ソケットが開けるようになったってこと。
つなげる先は、Cloudflare Tunnel・Cloudflare Mesh・Cloudflare WAN の on-ramp 経由で届くプライベートサービス。Redis や Memcached、MQTT、独自のバイナリプロトコルみたいな「TCP で直接しゃべる」子たちが対象だよ。
今までどうだったの?
これまで VPC Network バインディングは fetch() の HTTP 通信が中心だったの。だから HTTP をしゃべってくれるサービスとは仲良くできたけど、Redis や Memcached みたいに素の TCP でやりとりするサービスには、ちょっと手が届きにくかったんだよね。
これで何が変わるの?
Workers から、プライベートネットワークの奥にいる TCP サービスへ直接ソケットを張れるようになるの! Redis に PING を投げたり、Memcached を叩いたり、MQTT で購読したり…… これまで別の中継役を挟まないとできなかったことが、バインディング 1 本でスッと書けるようになるんだ。自前のプライベート DB やメッセージキューを Workers から使いたい人には、うれしい一歩だよ。
深く潜ってみよう
設定はとってもシンプル。wrangler.jsonc に VPC Network のバインディングを書くだけだよ。
{
"vpc_networks": [
{
"binding": "PRIVATE_NETWORK",
"network_id": "cf1:network",
"remote": true
}
]
}
あとは runtime で、バインディングに対して connect() を呼ぶだけ。プライベートな Redis につないで PING を送る例はこんな感じ。
const socket = await env.PRIVATE_NETWORK.connect("10.0.1.50:6379");
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("PING\r\n"));
await writer.close();
ひとつだけ注意ね。今のところ VPC Networks 越しの connect() は plaintext TCP のみ対応で、TLS はまだなの。もっと詳しく知りたい子は VPC Networks と Workers Binding API を見てみてね。
まとめ
- Workers VPC の VPC Network バインディングが
connect()による TCP 接続に対応したよ - Cloudflare Tunnel・Mesh・WAN 経由のプライベートな Redis・Memcached・MQTT などに TCP ソケットを張れる
- 設定は
wrangler.jsoncにバインディングを足すだけ、runtime はconnect()を呼ぶだけ - 今のところ plaintext TCP のみ(TLS 非対応)
プライベートネットワークの TCP サービスを Workers からそのまま使いたいバックエンド勢に、ぴったり刺さるアップデートだね!