どうも、AWS事業本部オペレーション部の西村祐二です。
最近、Cloudflareに注目しており、今日、以下のようなブログが公開されました。
Cloudflare Workersは、ServiceWorkerのAPIがCDNエッジ上で動作するコンピューティングリソースであるため(間違っていたら指摘してください)、Node.js APIが使用されるライブラリなどを利用する場合は、polyfillを利用してバンドルしてデプロイする必要がありました。
しかしながら、Cloudflare Workersには多くの制限があり、複雑なことは現状では難しいとされています。
Limits · Cloudflare Workers docs
しかし、今回のアップデートによりAsyncLocalStorage、EventEmitter、Buffer、assert、そしてutilの一部のNode.js APIはバンドルせずにCloudflare Workers上で利用できるようになりました。
どうやってNode.jsのAPIを利用できるようにするか
wrangler.toml
に下記フラグを設定することでNode.jsのAPIが利用できるようになります。
compatibility_flags = [ "nodejs_compat" ]
試してみた
Workersを作成
wranglerを使ってmy-worker
というWorkersを作成していきます。
※wranglerのバージョンは2.13.0
$ wrangler init my-worker -y
$ cd my-worker
wrangler.tomlを編集
wrangler.toml
にNode.jsを有効化するためのフラグを追加します。
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2023-03-24"
compatibility_flags = [ "nodejs_compat" ]
BufferのAPIを試してみる
今回は簡単に試せそうなBufferを使って対応したNode.jsのAPIが動作するか確認していきます。
最初に生成されたsrc/index.ts
にブログに記載されていたサンプルコードを貼り付けます。
import時にはnode:
を付ける必要があるようです。
import { Buffer } from 'node:buffer';
const buf = Buffer.from('hello world', 'utf8');
console.log(buf.toString('hex'));
// Prints: 68656c6c6f20776f726c64
console.log(buf.toString('base64'));
// Prints: aGVsbG8gd29ybGQ=
export interface Env {
// Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/
// MY_KV_NAMESPACE: KVNamespace;
//
// Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
// MY_DURABLE_OBJECT: DurableObjectNamespace;
//
// Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
// MY_BUCKET: R2Bucket;
//
// Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/
// MY_SERVICE: Fetcher;
}
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext
): Promise<Response> {
return new Response("Hello World!");
},
};
ローカルで動作確認
wranglerを使ってローカルで動作確認できるか試してみます
$ npm start
> my-worker@0.0.0 start
> wrangler dev
⛅️ wrangler 2.13.0
--------------------
⬣ Listening at http://0.0.0.0:8787
- http://127.0.0.1:8787
- http://xxx.xxx.xxx.xxx:8787
Total Upload: 0.49 KiB / gzip: 0.30 KiB
68656c6c6f20776f726c64
aGVsbG8gd29ybGQ=
╭──────────────────────────────────────────────────────────────────────────╮
│ [b open a [d open [l turn on local clear [x to │
│ browser, Devtools, mode, console, exit │
╰──────────────────────────────────────────────────────────────────────────╯
問題なく動作していそうですね。
ローカルで簡単に動作確認できるのはとても嬉しいですね。
Workersにデプロイ
デプロイする前に
export default
外のconsole.log
だとログ出力されなかったので、中でconsole.log
を記載するように修正します。
...snip
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext
): Promise<Response> {
console.log(buf.toString('hex'));
// Prints: 68656c6c6f20776f726c64
console.log(buf.toString('base64'));
// Prints: aGVsbG8gd29ybGQ=
return new Response("Hello World!");
},
};
下記コマンドでデプロイします。
$ npm run deploy
> my-worker@0.0.0 deploy
> wrangler publish
⛅️ wrangler 2.13.0
--------------------
Total Upload: 0.53 KiB / gzip: 0.30 KiB
Uploaded my-worker (1.56 sec)
Published my-worker (0.28 sec)
https://xxxxxxxxxxxxx.workers.dev
Current Deployment ID: xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx
ログ確認するためにtailコマンドを打っておきます。
$ wrangler tail --format=pretty
払い出されたURLにアクセスすると下記のようなログが流れてきました。
問題なくNode.jsのBufferが動作してそうですね。
--------------------
Successfully created tail, expires at 2023-03-24T13:43:42Z
Connected to my-worker, waiting for logs...
GET https://xxxxxxx.workers.dev/ - Ok @ 2023/3/24 16:50:15
(log) 68656c6c6f20776f726c64
(log) aGVsbG8gd29ybGQ=
GET https://xxxxxxx.workers.dev/favicon.ico - Ok @ 2023/3/24 16:50:16
(log) 68656c6c6f20776f726c64
(log) aGVsbG8gd29ybGQ=
さいごに
簡単ではありますが、対応されたNode.jsのAPIをCloudflare Workers上で試してみました。
コンフィグに一行設定を追加するだけで、とても簡単にNode.jsのAPIを利用することができました。
あと、公開されたブログの最後のほうに
"We currently have implementations of the string decoder, streams and crypto APIs in active development."
以下、機械翻訳
"現在、文字列デコーダ、ストリーム、および暗号化 API の実装が活発に開発してます。"
と記載があって今後のアップデートもとても楽しみです。