Cloudflare WorkersでPython Workerを試す
Get startedはこれ
今回はMac上のdevcontainerで。VSCodeで適当なワークスペースを開いて、以下の.devcontainer/devcontainer.json
を作成する。
{
"name": "Node.js & TypeScript",
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
"forwardPorts": [
8787,
8976
]
}
ポートフォワーディングは以下のために設定している。
- 8787: ローカルでworkerを立ち上げてアクセスするため
- 8976: Cloudflareデプロイ時のOAuth認証後のリダイレクトを受けるため
作成したら「コンテナで再度開く」。
コンテナに入ったらまずバージョン確認。
$ node -v
v20.11.1
$ npm -v
10.2.4
公式のサンプルレポジトリをクローン
$ git clone https://github.com/cloudflare/python-workers-examples examples && cd examples
01-helloのディレクトリに移動
$ cd 01-hello
中身はこんな感じ。
$ tree
.
├── README.md
├── src
│ └── entry.py
└── wrangler.toml
2 directories, 3 files
name = "hello-python"
main = "src/entry.py"
compatibility_flags = ["python_workers"]
compatibility_date = "2024-03-29"
from js import Response
async def on_fetch(request, env):
return Response.new("Hello world!")
では、python workerをローカルで立ち上げる。
$ npx wrangler@latest dev
wranglerのインストール確認。ENTERで進む。
Need to install the following packages:
wrangler@3.44.0
Ok to proceed? (y)
使用状況の共有に同意するか聞かれるので、適当に。
? Would you like to help improve Wrangler by sending usage metrics to Cloudflare? › (Y/n)
ローカルでworkerが立ち上がる。
⎔ Starting local server...
[wrangler:inf] Ready on http://0.0.0.0:8787
╭────────────────────────────────────────────────────────────────────────────────────────────────╮
│ [b] open a browser, [d] open Devtools, [l] turn off local mode, [c] clear console, [x] to exit │
╰────────────────────────────────────────────────────────────────────────────────────────────────╯
本来なら"b"でブラウザを立ち上げることになるけど、devcontainer(docker)経由なので立ち上がらない。以下のダイアログが表示されるのでクリック。
"Hello World"が表示された。
では"x"でローカルのworkerを止めて、今度はCloudflareにデプロイする。
$ npx wrangler@latest deploy
認証用のURLにアクセス。
Attempting to login via OAuth...
Opening a link in your default browser: https://dash.cloudflare.com/oauth2/auth?response_type=code&client_id=....
▲ [WARNING] Failed to open
CloudflareにログインしていればWranglerにデプロイを許可するか?を聞かれる。「Allow」をクリック。
許可した。
ターミナルに戻ると、デプロイが行われる。デプロイ完了したらURLが表示される。
Successfully logged in.
Total Upload: 0.10 KiB / gzip: 0.11 KiB
Uploaded hello-python (9.86 sec)
Published hello-python (6.46 sec)
https://hello-python.XXXXXXXXX.workers.dev
Current Deployment ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
ブラウザでアクセスしてCloudflareへのデプロイを確認できた。
モジュールに変更してみる。
def hello(name):
# 変更されたことを確認するために大文字にした
return "HELLO, " + name.upper() + "!"
from js import Response
from hello import hello
def on_fetch(request):
return Response.new(hello("World"))
デプロイ。
$ npx wrangler@latest deploy
こんな感じで出力もされる。
Attaching additional modules:
┌──────────┬────────┬──────────┐
│ Name │ Type │ Size │
├──────────┼────────┼──────────┤
│ hello.py │ python │ 0.06 KiB │
└──────────┴────────┴──────────┘
ブラウザでアクセスして変更されていればOK。
POSTリクエストを受けるようにしてみる。
from js import Response
from hello import hello
async def on_fetch(request):
name = (await request.json()).name
return Response.new(hello(name))
デプロイ。
$ npx wrangler@latest deploy
curlでデータをPOSTしてみる。
$ curl \
-H "Content-Type: application/json" \
-X POST \
--data '{"name": "Python"}' \
https://hello-python.XXXXXXXXXX.workers.dev
HELLO, PYTHON!
環境変数を使う。wrangler.toml
を修正。
(snip)
[vars]
FROM = "kun432"
コードから環境変数にアクセスしてみる。
from js import Response
from hello import hello
# ハンドラにenvを渡す
async def on_fetch(request, env):
name = (await request.json()).name
return Response.new(hello(name) + " from " + env.FROM)
デプロイ。
$ npx wrangler@latest deploy
デプロイ時に環境変数がセットされていることが出力されている。
Attaching additional modules:
┌──────────┬────────┬──────────┐
│ Name │ Type │ Size │
├──────────┼────────┼──────────┤
│ hello.py │ python │ 0.08 KiB │
└──────────┴────────┴──────────┘
Your worker has access to the following bindings:
- Vars:
- FROM: "kun432"
curlで。
$ curl \
-H "Content-Type: application/json" \
-X POST \
--data '{"name": "Python"}' \
https://hello-python.XXXXXXXXXX.workers.dev
HELLO, PYTHON! from kun432
今気づいたんだけど、
Python Workers are in open beta. You can currently only use built-in packages in local development. Support for deploying Workers with a requirements.txt file is coming soon.
まだだめなのかー
使えるようになったら再開するかも。