Closed5

Cloudflare WorkersでPython Workerを試す

kun432kun432

今回はMac上のdevcontainerで。VSCodeで適当なワークスペースを開いて、以下の.devcontainer/devcontainer.jsonを作成する。

.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
wrangler.toml
name = "hello-python"
main = "src/entry.py"
compatibility_flags = ["python_workers"]
compatibility_date = "2024-03-29"
src/entry.py
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へのデプロイを確認できた。

kun432kun432

モジュールに変更してみる。

src/hello.py
def hello(name):
    # 変更されたことを確認するために大文字にした
    return "HELLO, " + name.upper() + "!"
src/entry.py
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を修正。

wrangler.toml
(snip)

[vars]
FROM = "kun432"

コードから環境変数にアクセスしてみる。

src/entry.py
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
kun432kun432

今気づいたんだけど、

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.

まだだめなのかー

使えるようになったら再開するかも。

このスクラップは28日前にクローズされました