Deno で、Cloudflare Workers やってみる

Denoflare という、Deno で Cloudflare Workers を開発、テスト、デプロイをするツールを見つけたので、試してみる

参考

Denoflare

導入

インストール

ドキュメントに従い、以下コマンドでインストール。

1
2
3
4
$ deno install --unstable --allow-read --allow-net --allow-env --allow-run --name denoflare https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/cli/cli.ts

$ which denoflare
/usr/local/bin/denoflare

最初のワーカー作成

my-worker/src/index.ts を作成。

my-worker/src/index.ts
1
2
3
4
5
export default {
async fetch(request: Request): Promise<Response> {
return new Response("Hello World!");
},
};

Denoflare 構成ファイル .denoflare を作成。

.denoflare
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"$schema": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/common/config.schema.json",
"scripts": {
"my-worker": {
"path": "my-worker/src/index.ts",
"localPort": 8080
}
},
"profiles": {
"account1": {
"accountId": "[アカウントID]",
"apiToken": "[APIトークン]"
}
}
}

これらを作成し、以下コマンドでローカル実行できる。

1
2
3
4
5
6
7
8
$ denoflare serve my-worker
Compiling https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/cli-webworker/worker.ts into worker contents...
Bundled https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/cli-webworker/worker.ts (process) in 1074ms
runScript: my-worker/src/index.ts
Bundled my-worker/src/index.ts (process) in 415ms
worker: start
Started in 1526ms (isolation=isolate)
Local server running on http://localhost:8080

起動出来たので、localhost:8080 にアクセスすると、Hello World! が返ってくるのを確認できる。

cloudflare にプッシュする

以下コマンドで push できる。

1
denoflare push my-worker

展開された URL にアクセスすると、もちろん Hello World! が返ってくるのを確認できる。

denoflare tail

どうも動作が確認できなかった。

denoflare cfapi

これは便利だった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ denoflare cfapi --help
denoflare-cfapi 0.5.2

Call the Cloudflare REST API

USAGE:
denoflare cfapi <subcommand> <args> <options>

SUBCOMMANDS:
list-scripts List Worker scripts
get-worker-account-settings Get worker account settings
put-worker-account-settings Set worker account settings
list-flags List account-level flags
list-zones List zones

put-key-value Set KV value
get-key-value Get KV value

list-workers-domains List Workers domains
put-workers-domain Create a Workers domain
delete-workers-domain Delete a Worker domain

list-buckets List R2 buckets
create-bucket Create a new R2 bucket
delete-bucket Delete a R2 bucket

verify-token Verify an api token
list-memberships List memberships
list-accounts List accounts
get-user Get user info
list-durable-objects-namespaces List Durable Objects namespaces
list-durable-objects List Durable Objects for a given namespace

list-pubsub-namespaces List Pub/Sub namespaces
create-pubsub-namespace Create a Pub/Sub namespace
delete-pubsub-namespace Delete a Pub/Sub namespace
list-pubsub-brokers List Pub/Sub brokers
create-pubsub-broker Create a Pub/Sub broker
delete-pubsub-broker Delete a Pub/Sub broker
generate-pubsub-credentials Generate credentials for a Pub/Sub broker
revoke-pubsub-credentials Revoke credentials for a Pub/Sub broker
list-pubsub-revocations List revocations for a Pub/Sub broker
delete-pubsub-revocations Delete revocations for a Pub/Sub broker

For subcommand-specific help: denoflare cfapi <subcommand> --help

ということで、先にデプロイしたワーカーを参照してみると、次のようになった。

1
2
3
4
5
6
7
8
9
10
11
12
$ denoflare cfapi list-scripts
[
{
id: "my-worker",
etag: "d1109f01d5545087345aeae9afe8f3397a6a74e79c287c14cc9a10f32f99f85e",
handlers: [ "fetch" ],
modified_on: "2022-06-24T15:23:11.723771Z",
created_on: "2022-05-14T16:01:16.154757Z",
usage_model: "bundled",
routes: null
}
]

denoflare r2

Cloudflare が、aws の s3 互換のオブジェクトストレージ R2 を発表した。
これを、denoflare で操作できる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# バケット作成
$ denoflare r2 create-bucket my-bucket

# 画像ファイルをアップロード
$ denoflare r2 put-object my-bucket image1 --file image.jpg
prep took 27ms
put 230808 bytes in 2542ms

# オブジェクトのリストを取得
$ denoflare r2 list-objects my-bucket
{
"name": "my-bucket",
"isTruncated": false,
"maxKeys": 1000,
"keyCount": 1,
"contents": [
{
"key": "image1",
"size": 230808,
"lastModified": "2022-06-24T15:56:46.318Z",
"etag": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"",
"storageClass": "STANDARD"
}
],
"commonPrefixes": []
}

# 画像ファイルをダウンロードして、image2.jpgとして保存
$ denoflare r2 get-object my-bucket image1 --file image2.jpg

# 画像ファイルを削除
$ denoflare r2 delete-object my-bucket image1

# ファイルが消えているのを確認できる
$ denoflare r2 list-objects my-bucket
{
"name": "my-bucket",
"isTruncated": false,
"maxKeys": 1000,
"keyCount": 0,
"contents": [],
"commonPrefixes": []
}

# その他コマンド多数。

さっと使えていい感じ。

Cloudflare R2 へのパブロックアクセス

Cloudflare R2 におかれたファイルは、パブリックアクセスができないが、Cloudflare Worker を介して実現できる。

サンプルが有るのでそのまま使ってみる。

.denoflare
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"$schema": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/common/config.schema.json",
"scripts": {
"my-worker": {
"path": "my-worker/src/index.ts",
"localPort": 8080
},
"public-r2": {
"path": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/examples/r2-public-read-worker/worker.ts",
"bindings": {
"bucket": { "bucketName": "my-bucket" },
"flags": { "value": "disallowRobots,emulatePages" },
"directoryListingLimit": { "value": "20" }
}
}
},
"profiles": {
"account1": {
"accountId": "[アカウントID]",
"apiToken": "[APIトークン]"
}
}
}

用意できたらプッシュする。

1
$ denoflare push public-r2

image1 としてファイルをアップロードし、[デプロイ先のドメイン]/image1 アクセスして見るとファイルにアクセスできる。

署名付き URL で R2 にアクセスを試みる

こちらも用意されたものが有るので試してみます。

クレデンシャルの生成

以下コマンドでクレデンシャルを作成。

1
2
3
4
5
$ denoflare r2 generate-credentials
{
"accessKeyId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"secretAccessKey": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}

作成したクレデンシャルを .denoflare に反映。

.denoflare
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
"$schema": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/common/config.schema.json",
"scripts": {
"my-worker": {
"path": "my-worker/src/index.ts",
"localPort": 8080
},
"public-r2": {
"path": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/examples/r2-public-read-worker/worker.ts",
"bindings": {
"bucket": { "bucketName": "my-bucket" },
"flags": { "value": "disallowRobots,emulatePages" },
"directoryListingLimit": { "value": "20" }
}
},
"signed-r2": {
"path": "https://raw.githubusercontent.com/skymethod/denoflare/v0.5.2/examples/r2-presigned-url-worker/worker.ts",
"bindings": {
"bucket": { "bucketName": "my-bucket" },
"flags": { "value": "disallowRobots,emulatePages" },
"directoryListingLimit": { "value": "20" },
"credentials": {
"secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
},
"maxExpiresMinutes": { "value": "60" }
}
}
},
"profiles": {
"account1": {
"accountId": "[アカウントID]",
"apiToken": "[APIトークン]"
}
}
}

maxExpiresMinutes が URL の有効期間の設定だそう、デフォルトは 7 日なのだが長すぎたので 60 分に修正している。
(50 などにすると途端に動かなくなったが深いところは今回は追いかけなかった。)

プッシュする。

1
$ denoflare push public-r2

以下のコマンドで、URL を生成する

1
$ AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy aws s3 presign s3://b/video.mp4 --endpoint-url https://signed-r2.test000100001.workers.dev

出力された URL にブラウザでアクセスするとファイルが表示できる。

public URL も、署名付き URL も追々 R2 の標準機能になるので、これ自体は暫定策である。


今回は、Denoflare を触ってみました。比較的マメにメンテもされていそうなのでこちら積極的に使えると良さそう。

ではでは。