Open28

service bindingsについて

yuunag1yuunag1

多分普通にfetchで呼び出せないの?とは思ったけどそっちよりレイテンシ小さいんだろう。・

yuunag1yuunag1

手元にあるもの

  • rustで書かれたworker
  • tsで書かれたworker

とりあえずやりたいこと

  • ローカルでservice bindingsを使って連携する
yuunag1yuunag1

Your worker has access to the following bindings:
- D1 Databases:
  - DB_LOCAL: ssssdb (idididid)
- Services:
  - MAIL_WORKER: mail-worker
▲ [WARNING] ⎔ Support for service bindings in local mode is experimental and may change.


[wrangler:inf] Ready on http://0.0.0.0:8787
[wrangler:inf] - http://127.0.0.1:8787
[wrangler:inf] - http://172.19.0.4:8787

bindingsは通っている。

yuunag1yuunag1

もう一つのworker起動すらしてないけど動くんかこれ。
動くわけないと思うけどなあ

yuunag1yuunag1

When you use Service Bindings, there is zero overhead or added latency.
オーバーヘッドいらんらしい

yuunag1yuunag1

Provide a shared internal service to multiple Workers. For example, you can deploy an authentication service as its own Worker, and then have any number of separate Workers communicate with it via Service bindings.

これは大きいね。
認証系とかログとかを切り出すことも可能なわけね

yuunag1yuunag1

limit はworker単位でかかったと思うのでサービスのスケールもしやすいのかも

yuunag1yuunag1

Isolate services from the public Internet. You can deploy a Worker that is not reachable via the public Internet, and can only be reached via an explicit Service binding that another Worker declares.

public networkを介さない。
gcpとかでvpcの設定とかに頭を悩ませなくてい言い訳ですね

yuunag1yuunag1

ローカルでどうやって動くのかがわからない

yuunag1yuunag1

そもそもrustから使えるかわからないし、、、、

yuunag1yuunag1

Local development
Local development is supported for Service bindings. For each Worker, open a new terminal and use wrangler dev in the relevant directory or use the SCRIPT option to specify the relevant Worker’s entrypoint.

なるほど?
そりゃそうだけどworker起動する必要があるみたいやな

yuunag1yuunag1
 [WARNING] Failed to get worker definitions TypeError: fetch failed

      at fetch
  (/app/workers/main-worker/node_modules/wrangler/wrangler-dist/cli.js:17227:19)
      at async getRegisteredWorkers
  (/app/workers/main-worker/node_modules/wrangler/wrangler-dist/cli.js:173250:22)
      at async getBoundRegisteredWorkers
  (/app/workers/main-worker/node_modules/wrangler/wrangler-dist/cli.js:173273:58) {
    cause: SocketError: other side closed
        at Socket.onSocketEnd
  (/app/workers/main-worker/node_modules/wrangler/wrangler-dist/cli.js:7457:27)
        at Socket.emit (node:events:532:35)
        at Socket.emit (node:domain:488:12)
        at endReadableNT (node:internal/streams/readable:1696:12)
        at process.processTicksAndRejections
  (node:internal/process/task_queues:90:21) {
      code: 'UND_ERR_SOCKET',
      socket: {
        localAddress: '127.0.0.1',
        localPort: 56454,
        remoteAddress: undefined,
        remotePort: undefined,
        remoteFamily: undefined,
        timeout: undefined,
        bytesWritten: 1246,
        bytesRead: 2820
      }
    }
  }


╭──────────────────────────────────────────────────────────────────────────────────╮
│ [b open a browser[d open Devtools[l turn off local    [c] clear       [x] to     │
│                                    mode,                 console,        exit    │
╰──────────────────────────────────────────────────────────────────────────────────╯

fetchしくじってない??

yuunag1yuunag1

これはworkerをローカルで起動したら湯おく出てくるいつものやつかなあ

yuunag1yuunag1

コードは書いたがメール飛ばないどころかタブのworkerにrequest飛んでない気がするなあ。。

yuunag1yuunag1
#[wasm_bindgen(method, catch, js_name=fetch)]
pub fn fetch_with_init(
    this: &Fetcher,
    input: &web_sys::Request,
    init: &web_sys::RequestInit,
    ) -> Result<js_sys::Promise, JsValue>;

    #[wasm_bindgen(method, catch, js_name=fetch)]
    pub fn fetch_with_str_and_init(
        this: &Fetcher,
        input: &str,
        init: &web_sys::RequestInit,
    ) -> Result<js_sys::Promise, JsValue>;
}

wasm-bindgenでfetchよんでるだけなんだけどなあ

yuunag1yuunag1

ローカルではできないものとして扱う。
workersにあげてみて検証する

yuunag1yuunag1

workersにあげてhttpで通信(curl)はできた。
ただし認証つきエンドポイントとかにしてないのでinactiveにした。

yuunag1yuunag1

rpcでservice bindingsにできればpublicに公開されないので安全だよね

yuunag1yuunag1
Done in 67ms
Total Upload: 1285.89 KiB / gzip: 426.64 KiB
Your worker has access to the following bindings:
- D1 Databases:
  - DB: db (<id>)
- Services:
  - MAIL_WORKER: mail-worker

✘ [ERROR] A request to the Cloudflare API (/accounts/9b27ecf5e1ff3ebebc210811c8bfbb78/workers/scripts/quick-main-worker) failed.

  workers.api.error.service_binding_error: could not resolve binding "MAIL_WORKER": script
  "mail-worker" not found [code: 10143]
  
  If you think this is a bug, please open an issue at:
  https://github.com/cloudflare/workers-sdk/issues/new/choose

デプロイしようとしたら落ちた。
そもそもbindingsがうまくいってなさそうだな??

yuunag1yuunag1

存在しないworkerを指定してたからで

[[services]]
binding = "mail-worker-rpc"
service = "mail-worker-rpc"

存在するやつ指定しなおしたら通った

yuunag1yuunag1

ローカルでservice bindingsはうまくいかなかったが、rust + typescriptでrpcコールうまくいった。