Cloudflare Workersのwrangler.tomlを見てみる
記事の概要
Cloudflare Workersの開発に便利なwrangler.tomlについてまとめてみました。
最初にそもそもWrangler(ラングラー)の解説をしていますが、既知でしたら飛ばしていただいても大丈夫です🙆♂️
私はラングラーと聞いて、最初は車?と思ってました🚘
対象読者としては「Cloudflare Workersって何?」を理解している方に向けておりますので、Cloudflare Workersをそもそも知らない方は一度以下の記事を覗いてみるといいかもしれません。
前提)Wranglerとは?
Cloudflare Workersの開発、ビルド、デプロイなど、コマンドラインからWorkerを操作できるCLIツールです。これを使うだけでローカル開発とデプロイがかなり簡単になるのでWorkers開発には必須くらいです。
Wrangler, the Cloudflare Developer Platform command-line interface (CLI), allows you to manage Worker projects.
Wrangler Commands
$ wrangler help
でできることをざっと見てみます。
COMMANDS
wrangler docs [search..] 📚 Open Wrangler's command documentation in your browser
wrangler init [name] 📥 Initialize a basic Worker
wrangler dev [script] 👂 Start a local server for developing your Worker
wrangler deploy [script] 🆙 Deploy a Worker to Cloudflare [aliases: publish]
wrangler deployments 🚢 List and view the current and past deployments for your Worker
wrangler rollback [version-id] 🔙 Rollback a deployment for a Worker
wrangler versions 🫧 List, view, upload and deploy Versions of your Worker to Cloudflare
wrangler triggers 🎯 Updates the triggers of your current deployment
wrangler delete [script] 🗑 Delete a Worker from Cloudflare
wrangler tail [worker] 🦚 Start a log tailing session for a Worker
wrangler secret 🤫 Generate a secret that can be referenced in a Worker
wrangler types [path] 📝 Generate types from bindings and module rules in configuration
wrangler kv 🗂️ Manage Workers KV Namespaces
wrangler queues 🇶 Manage Workers Queues
wrangler r2 📦 Manage R2 buckets & objects
wrangler d1 🗄 Manage Workers D1 databases
wrangler vectorize 🧮 Manage Vectorize indexes [open beta]
wrangler hyperdrive 🚀 Manage Hyperdrive databases
wrangler pages ⚡️ Configure Cloudflare Pages
wrangler mtls-certificate 🪪 Manage certificates used for mTLS connections
wrangler pubsub 📮 Manage Pub/Sub brokers [private beta]
wrangler dispatch-namespace 🏗️ Manage dispatch namespaces
wrangler ai 🤖 Manage AI models
wrangler workflows 🔁 Manage Workflows [open-beta]
wrangler login 🔓 Login to Cloudflare
wrangler logout 🚪 Logout from Cloudflare
wrangler whoami 🕵️ Retrieve your user information
GLOBAL FLAGS
-c, --config Path to Wrangler configuration file [string]
-e, --env Environment to use for operations and .env files [string]
-h, --help Show help [boolean]
-v, --version Show version number [boolean]
よく使う系のコマンドは以下になります。
-
wrangler dev
- ローカルサーバーを立ち上げる
-
wrangler deploy
- Cloudflare Workerにデプロイ
-
wrangler delete
- Cloudflare WorkerやWorkerが持っている設定情報(環境変数など)を削除
-
wrangler login
- 登録しているCloudflareアカウントにログイン(OAuthトークンの作成)
-
wrangler logout
- Wranglerで使用していたCloudflareアカウントからログアウト(OAuthトークンの削除)
-
wrangler whoami
- ログインしているアカウント情報の確認
-
wrangler secret
- Worker内で使用する環境変数周りの操作
- アップロード、確認など
本題)wrangler.tomlとは?
上記で説明したWranglerですが、Wranglerはオプションでwrangler.toml
というファイルを使ってWorkerの開発・デプロイ設定をカスタマイズすることができます。
環境設定をソースコード管理できるとチーム開発の際にも便利なのと、環境ごとの設定も書けるので諸々と融通が効きます。
ちなみに、TOMLは設定ファイルを記述するフォーマットの一種なので、記法は以下の資料などを参考にしてみてください。
wrangler.toml内を見てみる
wrangler.toml
内では以下のように設定ができます。
name = "worker_name" ## Workerの名前
main = "src/index.js" ## Workerが実行するメインのjsファイル
compatibility_date = "2024-12-24" ## 互換性の日付
account_id = "000000000000" ## Wranglerで連携しているCloudflareのアカウントID
route = "example.com/*" ## Workerアクセスドメイン
# カスタムビルド設定
[build]
command = "make build"
# 環境変数(機密性が低いもの)
[vars]
API_ENDPOINT = "https://example.com/*****"
API_KEY = "*******"
# ログ設定
[observability]
enabled = true
head_sampling_rate = 0.1 # 10%のログを記録する
# CRON設定
[triggers]
crons = ["* * * * *"]
# R2バケット連携設定
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "r2_sample_bucket"
補足: Bindings
Worker内で他のCloudflareサービスと連携したいときには、Bindingを設定するだけで簡単にできます。先ほどの例のコードにもR2バケットとのバインディングを記載をしておりますが、
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "r2_sample_bucket"
このように設定するだけで、Worker内からMY_BUCKET
という名称を使用して、r2_sample_bucket
の操作をできるようになってます。
Worker内のコードを見るとイメージしやすいと思うので、以下に載せておきます。(処理としては、オブジェクトをバインディングしたR2に保存しています)
export default {
async fetch(request, env) {
const url = new URL(request.url);
const key = url.pathname.slice(1);
switch (request.method) {
case "PUT":
await env.MY_BUCKET.put(key, request.body);
return new Response(`Put ${key} successfully!`);
default:
return new Response(`${request.method} is not allowed.`, {
status: 405,
headers: {
Allow: "PUT",
},
});
}
},
};
補足: Compatibility Dates
Compatibility Datesを指定すると、Workerのランタイムを指定することができ、後方互換への対策をすることができます。
compatibility_date = "2024-12-24"
Workerのランタイムは、指定したCompatibiliti Datesの日付になるので、最新の修正を適用を適切なタイミングで行えたり、柔軟な対応が可能になります。
プロジェクトの開始タイミングには必ず現在の日付を設定する必要があります。
wrangler.tomlを触る際の注意点
Source of truth
設定ファイル触ったり、IaCなどを使用している方は馴染みがあるかもしれませんが、wrangler.toml
もSource of truth(信頼できる情報源)であることが推奨されています。
Worker上のコンソールからポチポチ設定を変えると設定ファイルと差分が出てしまい、設定ファイルの信頼できなくなってくるので、Workerの設定を変えたい時は必ずwrangler.toml
から触るようにしましょう。
We recommend treating your Wrangler configuration file as the source of truth for your Worker configuration, and to avoid making changes to your Worker via the Cloudflare dashboard if you are using Wrangler.
もしコンソールから変える必要がある時は、設定情報をコンソールからコピーして、設定ファイルと差分がない状態にする。
If you need to make changes to your Worker from the Cloudflare dashboard, the dashboard will generate a TOML snippet for you to copy into your Wrangler configuration file, which will help ensure your Wrangler configuration file is always up to date.
セキュアな情報はwrangler.tomlに直接書かない
セキュアな情報を扱うときにも注意が必要です。
wrangler.toml
に環境変数など、漏洩してはいけない情報を書くのではなく、プロジェクトのルートに.dev.vars
ファイルを作成して、そこにSecretsを定義していくことが推奨されています。
When developing your Worker or Pages Function, create a .dev.vars file in the root of your project to define secrets that will be used when running wrangler dev or wrangler pages dev, as opposed to using environment variables in wrangler.toml. This works both in local and remote development modes.
環境が複数ある場合は、.dev.vars.<environment-name>
のようにして環境を分ける。
/
├─ .dev.vars.stg // staging環境用の環境変数
├─ .dev.vars.prd // 本番環境用の環境変数
├─ wrangler.toml
├─ .gitignore // .dev.vars.*を除外
└─ ...
記述方法は、よくあるKEY="VALUE"
のような形で書けばokです。
SECRET_KEY="value"
API_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
また、wrangler secret put <KEY>
のような形で、wrangler cliから直接Workerのコンソール上に環境変数を作成することも可能です。ですが、.dev.vars
が存在する場合は、.dev.vars
を優先してWorkerのSecretに登録をする仕様なので注意が必要そうです。
環境ごとのデプロイ管理
実際に開発を進めていくときに本番環境と開発環境用でWorkerをデプロイしたいことは往々にしてあると思います。そのような場合はデプロイ時に--env
フラグを使用します。
# dev環境のWorkerにデプロイ
$ wrangler deploy --env development
すると、自動でWorkerのnameのpreffixに--env
で指定した環境名が付いた状態のWorkerが作成されます。
development環境で独自の設定などを行いたい場合は、wrangler.toml
で[env.<env_name>]
で設定を書くとdeploy時に自動で反映をしてくれます。
name = "my-worker"
main = "src/index.js"
compatibility_date = "2022-07-12"
[env.development]
name = "my-worker-development"
route = { pattern = "development.example.org/*", zone_name = "example.org" }
kv_namespaces = [
{ binding = "<MY_NAMESPACE>", id = "<DEVELOPMENT_KV_ID>" }
]
WorkerってJavaScriptで書かないといけないの?
WorkerはそもそもJavascriptのランタイム環境なのでJavaScriptで書かないといけないと思いがちですが、他の言語でも書くことは可能です。
本記事執筆時点(2024年12月)でサポートされている言語は以下になります。
- Javascript
- TypeScript
- Python
- Rust
また、WebAssemblyもサポートしているので、WebAssemblyにコンパイルできるC、C++、Kotlin、Goを始め様々な言語で書くことができます。
最後に
最近の業務でWokerを使用していることもあり、今回のタイミングで設定周りの情報をキャッチアップして記事を書くことにしました。現在は@__syumaiさんが作成したライブラリを使用して、GoでWorkerを開発をしております。
自分自身もまだまだCloudflare Workersについて知らないこともたくさんありますのでこれからもっとキャッチアップしていく予定です。
本記事に関しても修正点や指摘箇所などあればコメントなどしていただけると助かります!
Discussion