WorkersからFetchで外部にアクセス
Cloudflare Workers(Rust)でFetch APIつかって別サイトにアクセスしようとしたんですが、
任意のポートでアクセスしようとしたらダメだったというメモ。
↓みたいに外部サーバ立ててFetchでアクセスしようとした。
use url::Url;
use worker::*;
・・・
let mut init = RequestInit::new();
let url = "http://xxxxxxxxx:3000";
init.with_method(worker::http::Method::Get.clone());
let external_request = worker::request::Request::new_with_init(&url, &init);
let res = Fetch::Request(external_request?).send().await?;
実際はEC2立てて、IP制限なしで3000番ポートを開放。
curlでローカルからアクセスして問題ない状態でした。
しかし、実際にWorkersにデプロイして動かすと、
「Error 521: web server is down」
のエラーが発生。
下記のようにMiniflare使ってローカルでテストしたときは
80/443以外のポートでも動いたからてっきり動くものかと。
import { Miniflare } from "miniflare";
import { fileURLToPath } from "url";
let server = null;
const serverUrl = 'http://localhost:3000';
// Miniflare
let mf = new Miniflare({
scriptPath: scriptPath,
modules: true,
modulesRules: [
{ type: "CompiledWasm", include: ["**/*.wasm"], fallthrough: true }
],
verbose: true
});
// test(use ava)
test("test", async (t) => {
const res = await mf.dispatchFetch("http://localhost:8787");
t.is(await res.text(), "hogehoge");
});
ここなどによると、
Cloudflare WorkersのFetch APIを使用する際、
80番ポート(HTTP)と443番ポート(HTTPS)以外のポートを
指定できない様子。
勝手にHTTPかHTTPSで接続するらしい。
特定のポートでアクセスしたい場合、
普通にサーバ側で80/443で待ち受けるか、
リバースプロキシ使うかなどをする必要があるとのことです。
テスト用サーバはnodeで動くシンプルなhttpサーバだったので
80/443で起動させようとしたけど、なんかそれもいろいろ面倒だったので、
EC2で80番ポートあけてiptablesで3000番ポートにリダイレクトさせました。
% sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
WorkersでFetchするとき、接続先はHTTP/HTTPSであること。
覚えておきましょう。