service bindingsについて
service bindingsを使えば同じアカウント内のworkers同士を呼び出せるらしい?
多分普通にfetchで呼び出せないの?とは思ったけどそっちよりレイテンシ小さいんだろう。・
手元にあるもの
- rustで書かれたworker
- tsで書かれたworker
とりあえずやりたいこと
- ローカルでservice bindingsを使って連携する
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は通っている。
もう一つのworker起動すらしてないけど動くんかこれ。
動くわけないと思うけどなあ
When you use Service Bindings, there is zero overhead or added latency.
オーバーヘッドいらんらしい
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.
これは大きいね。
認証系とかログとかを切り出すことも可能なわけね
limit はworker単位でかかったと思うのでサービスのスケールもしやすいのかも
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の設定とかに頭を悩ませなくてい言い訳ですね
services = [
{binding = "MAIL_WORKER",service = "mail-worker"}
]
wrangler.tomlに付け足して起動すると上記のログが出たのでservice bindingsが作られてはいるみたい。
worker entrypoint が推奨されてるらしい。
今回普通にapiとして書いちゃったしhttpで一回やろかな。動かせることが目的だし。
ローカルでどうやって動くのかがわからない
そもそもrustから使えるかわからないし、、、、
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起動する必要があるみたいやな
[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しくじってない??
これはworkerをローカルで起動したら湯おく出てくるいつものやつかなあ
起動しなおしたらなくなった
コードは書いたがメール飛ばないどころかタブのworkerにrequest飛んでない気がするなあ。。
コミュニティに聞いてみた
なんでリクエスト届かない??
#[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よんでるだけなんだけどなあ
ローカルではできないものとして扱う。
workersにあげてみて検証する
workersにあげてhttpで通信(curl)はできた。
ただし認証つきエンドポイントとかにしてないのでinactiveにした。
rpcでservice bindingsにできればpublicに公開されないので安全だよね
⚡ 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がうまくいってなさそうだな??
存在しないworkerを指定してたからで
[[services]]
binding = "mail-worker-rpc"
service = "mail-worker-rpc"
存在するやつ指定しなおしたら通った
デプロイしたが
status404..?
ローカルでservice bindingsはうまくいかなかったが、rust + typescriptでrpcコールうまくいった。