📖

wrangler.tomlとの付き合い方を考える

2025/02/16に公開1

株式会社スーパーハムスターでエンジニアをしているお茶です。
今回はCloudflareWorkersのCLI、wranglerで ん??となっていたこととその解決について書きたいと思います。

はじめに

HonoなどCloudflare Workersのプロジェクトを作成したときにwrangler.tomlというファイルが作成されます。
こちらのファイル、環境変数をプロジェクトに渡したり他のCloudflareのサービスとの連携などにも使用しwranglerの恩恵を受けるには必要不可欠なファイルです。

wrangler.tomlにはセキュアな情報を直接書き込まなくてもいいように.dev.varsのような別の環境変数を定義するファイルを配置することでwrangler.tomlからプロジェクトに渡す環境変数を上書きすることができます。

なのでwrangler.tomlは基本的にデフォルトでgit管理するファイルとして扱われています。
しかしD1 DatabaseやR2 StorageなどCloudflareの提供するサービスの接続情報は別ファイルでの上書きが出来ないようになっています。

wrangler.toml
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での自動デプロイを次のように実装しました。

package.json
"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