PythonアプリケーションをCloudflare Workersにデプロイしてみた
この記事は、PythonアプリケーションをWranglerでCloudflare Workersへデプロイする方法や注意点をまとめた記事です。利用できるライブラリの制限などが2024/10時点ではある様子なので、試される方はそこにご注意ください。
目次
この記事は、PythonアプリケーションをWranglerでCloudflare Workersへデプロイする方法や注意点をまとめた記事です。利用できるライブラリの制限などが2024/10時点ではある様子なので、試される方はそこにご注意ください。
試そうとした背景
個人的に作ろうとしていたものに、Pythonで公開されているライブラリが必要だったので、WorkersのPython版を試してみる事にしました。
Create Cloudflare CLIでセットアップする
Pythonで実装する場合も、npm create cloudflareが使えます。
npm create cloudflare@latest -- my-python-worker
作成時のウィザードを進めると、言語を選択するステップが出てきます。ここでPythonを選びましょう。
╰ Which language do you want to use?
  ○ TypeScript
  ○ JavaScript
  ● Python (beta)
  ◁ Go backあとはコマンドがセットアップを進めてくれますので、下のような完了メッセージが出るまで待ちましょう。
────────────────────────────────────────────────────────────
🎉  SUCCESS  Application created successfully!
💻 Continue Developing
Change directories: cd weather-forcast
Start dev server: npm run start
Deploy: npm run deploy
📖 Explore Documentation
https://developers.cloudflare.com/workers
💬 Join our Community
https://discord.cloudflare.com
────────────────────────────────────────────────────────────Pythonでもローカル開発はWranglerを使う
ローカルでのアプリケーション開発には、こちらもWranglerを使います。
> wrangler dev
 ⛅️ wrangler 3.81.0
-------------------
▲ [WARNING] The entrypoint src/entry.py defines a Python worker, support for Python workers is currently experimental. Python workers with a requirements.txt file can only be run locally and cannot be deployed.
⎔ Starting local server...
[wrangler:inf] Ready on http://localhost:8787
╭───────────────────────────╮
│  [b] open a browser       │
│  [d] open devtools        │
│  [l] turn off local mode  │
│  [c] clear console        │
│  [x] to exit              │
╰───────────────────────────╯
Wranglerがコンテナ?を利用してアプリを立ち上げる様子なので、Pythonが入っていないPCでも動きます。
 % python
zsh: command not found: pythonPythonまわりの環境セットアップが不要なのはありがたいですね。
2024/10時点では、デフォルトでバンドルされているライブラリのみ使える様子?
Beta提供だからだとは思いますが、次のような注意書きがあります。どうやらpipを使ってライブラリをインストールすることに制限がある様子です。
Currently, you can only deploy Python Workers that use the standard library. Packages cannot be deployed and will only work in local development for the time being.
試しにrequirements.txtにライブラリを追加したところ、エラーが出ました。
Attaching additional modules:
┌──────────────────┬────────────────────┬──────────┐
│ Name             │ Type               │ Size     │
├──────────────────┼────────────────────┼──────────┤
│ eorzeaenv        │ python-requirement │          │
├──────────────────┼────────────────────┼──────────┤
│ Total (1 module) │                    │ 0.00 KiB │
└──────────────────┴────────────────────┴──────────┘
⎔ Starting local server...
[wrangler:inf] Ready on http://localhost:8787
✘ [ERROR] service core:user:weather-forcast: Uncaught Error: It appears that a package ("eorzeaenv") you requested is not available yet in workerd. 
  If you would like this package to be included, please open
  an issue at
  https://github.com/cloudflare/workerd/discussions/new?category=python-packages.
    at null.<anonymous>
  (pyodide-internal:setupPackages:203:15) in
  addPackageToLoad
    at null.<anonymous>
  (pyodide-internal:setupPackages:185:9) in
  recursiveDependencies
    at null.<anonymous>
  (pyodide-internal:setupPackages:141:26) in
  getTransitiveRequirements
    at null.<anonymous>
  (pyodide-internal:setupPackages:212:40)使えるライブラリリストがドキュメントにありますので、これをみて導入判断する必要がありそうです。
LangChainはぶんまわせる
ちなみにリストを見るとLangChain系が一通り入っています。生成AI方面での利用を想定しているのかもしれませんね。他にもfastapiやnumpy / openaiなども入っている様子です。
使いたいライブラリがある場合は、requirements.txtファイルを作成して列挙します。
langchain
langchain-core
langchain_openai
langsmith
openai
あとはnpm run devでWranglerから開発サーバーを立ち上げると、自動でバンドルしてくれます。
> wrangler dev
 ⛅️ wrangler 3.81.0
-------------------
▲ [WARNING] The entrypoint src/entry.py defines a Python worker, support for Python workers is currently experimental. Python workers with a requirements.txt file can only be run locally and cannot be deployed.
Attaching additional modules:
┌───────────────────┬────────────────────┬──────────┐
│ Name              │ Type               │ Size     │
├───────────────────┼────────────────────┼──────────┤
│ langchain         │ python-requirement │          │
├───────────────────┼────────────────────┼──────────┤
│ langchain-core    │ python-requirement │          │
├───────────────────┼────────────────────┼──────────┤
│ langchain_openai  │ python-requirement │          │
├───────────────────┼────────────────────┼──────────┤
│ langsmith         │ python-requirement │          │
├───────────────────┼────────────────────┼──────────┤
│ openai            │ python-requirement │          │
├───────────────────┼────────────────────┼──────────┤
│ Total (5 modules) │                    │ 0.00 KiB │
└───────────────────┴────────────────────┴──────────┘
⎔ Starting local server...
[wrangler:inf] Ready on http://localhost:8787
╭───────────────────────────╮
│  [b] open a browser       │
│  [d] open devtools        │
│  [l] turn off local mode  │
│  [c] clear console        │
│  [x] to exit              │
╰───────────────────────────╯ちょっとだけ触ってみた感想
まだまだBeta提供のため、使える場所使えない場所の判断は難しそうです。ただ、LangChain系が使えるので、VectorizeやWorkers AI・AI Gatewayなどを使った開発で試してみる分には良さそうかなと思います。
個人的には、Pythonのインストール・バージョン管理やvenvまわりを省略できるところが、Pythonをメインで使わない人たちにとって優しいかも?と感じました。