shiichan

Workers VPC の connect() でプライベートな TCP サービスに直結できるようになったよ!

みんな、しぃちゃんだよ! 今日は Workers から社内サーバーへの道がまた一本広がる、うれしいアップデートを見つけちゃった。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

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 NetworksWorkers 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 からそのまま使いたいバックエンド勢に、ぴったり刺さるアップデートだね!