wrangler.tomlとの付き合い方を考える
株式会社スーパーハムスターでエンジニアをしているお茶です。
今回はCloudflareWorkersのCLI、wranglerで ん??となっていたこととその解決について書きたいと思います。
はじめに
HonoなどCloudflare Workersのプロジェクトを作成したときにwrangler.tomlというファイルが作成されます。
こちらのファイル、環境変数をプロジェクトに渡したり他のCloudflareのサービスとの連携などにも使用しwranglerの恩恵を受けるには必要不可欠なファイルです。
wrangler.tomlにはセキュアな情報を直接書き込まなくてもいいように.dev.vars
のような別の環境変数を定義するファイルを配置することでwrangler.tomlからプロジェクトに渡す環境変数を上書きすることができます。
なのでwrangler.tomlは基本的にデフォルトでgit管理するファイルとして扱われています。
しかしD1 DatabaseやR2 StorageなどCloudflareの提供するサービスの接続情報は別ファイルでの上書きが出来ないようになっています。
name = "worker_name"
main = "src/index.ts"
compatibility_date = "YYYY-MM-DD"
account_id = "000000000000"
route = "example.com/*"
# 環境変数(.dev.varsなど外部ファイルで上書きできる)
[vars]
API_ENDPOINT = "https://example.com/*****"
API_KEY = "*******"
// こういうのは外部ファイルで上書き出来ない
# D1データベース接続情報
[[d1_databases]]
binding = "DB"
database_name = "DATABASE_NAME"
database_id = "DB_ID"
# R2バケット接続情報
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "r2_sample_bucket"
Cloudflareの認証を通っていないとそもそもデプロイが出来ないようになっているのと、そもそもこのファイルがないとCDでデプロイなども出来ないので比較的みんな平気でgit管理していますが、個人的には外部公開を避けるよう推奨されているdatabase_id
などのセキュアな情報が平気で晒されているのが少し引っかかってました。
今回は自分が対応した方法について紹介したいと思います。
結論:gitignoreする。
身も蓋も無いですが、gitの管理対象から外しました。
個人的にはこれまでの.env
などと同じ扱いで管理しています。
しかし、手元でwranglerのコマンドを叩く分にはいいもののCI/CDで利用したいとなるとwrangler.tomlがないので実行できないです。
.envなどではsecretsでワークフロー実行時にsecretsで値を渡すことが可能でしたがwrangler.tomlの接続情報だとそうも行きません。
ignoreした上でCI/CDで利用する
正直腕力です。Hono + D1 + drizzleで利用したプロジェクトで利用したときCDでの自動デプロイを次のように実装しました。
"scripts": {
"dev": "wrangler dev",
"deploy": "wrangler deploy --minify",
"generate": "drizzle-kit generate",
"local:migration": "wrangler d1 migrations apply DB_NAME --local",
"remote:migration": "wrangler d1 migrations apply DB_NAME",
"studio": "drizzle-kit studio"
},
wrangler系のスクリプトをこんな感じに設定しました。
GitHubActionsでデプロイのCDを書いていきます。
結論としてはwrangler.tomlを丸ごとsecretsで渡します。
GHAのsecretsにWRANGLER_TOMLを作成しwrangler.tomlの内容を丸ごとコピペします
あとはそれを吐き出して強引に実行時にファイルを作成し、CI/CDを走らせます。
name: deploy osaisen backend
on:
push:
branches:
- main
paths:
- apps/backend/src/**
jobs:
deploy:
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/backend
steps:
- name: Checkout Repo
uses: actions/checkout@v4
- name: Setup Wrangler.toml
run: |
printf "%s" '${{ secrets.WRANGLER_TOML }}' > wrangler.toml
- name: Check Wrangler.toml
run: cat wrangler.toml
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 9.0.0
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 20
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Drizzle Generate
run: pnpm generate
- name: Drizzle Migration
run: pnpm remote:migration
env:
NODE_ENV: production
CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
- name: Deploy
run: pnpm deploy
env:
NODE_ENV: production
CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
今回はgenerateとmigrationもワークフローに組み込んでデプロイを自動化しました。
これでwrangler.tomlをgitignoreした上で安全にデプロイできるようになりました。
結論
ベストプラクティスはなんなんでしょうか????
Discussion
ベストプラクティスとは言い切れないですが、IDの類の値は Git 管理下に置いても問題ないかと思っています。
下記のやりとりでは KV の Namespace ID については問題ないとされているので、Database ID についても同様に考えて良いのかなと。