引き続き Cloudflare Workers を使用して、本番環境とはアプリ・DBの異なるステージング環境を作ってみます。 Environments があり、ステージング環境のような異なるバージョンのアプリをデプロイすることができます。

今回もこちらのリポジトリを使います。

まずは、本番用のDBとステージング用のDBを作成します。

npx wrangler d1 create my-app-db
npx wrangler d1 create my-app-db-staging

前回同様設定ファイルに追加しておいてから、以下のように編集します。

"d1_databases": [
	{
		"binding": "DB",
		"database_name": "my-app-db",
		"database_id": "b8c35192-3b91-463a-8a38-d3515169b832",
		"migrations_dir": "drizzle/migrations",
	},
],
"env": {
	"staging": {
		"d1_databases": [
			{
				"binding": "DB",
				"database_name": "my-app-db-staging",
				"database_id": "de8b088a-ba8f-423d-928c-8677adcd1f5d",
				"migrations_dir": "drizzle/migrations",
			},
		],
	},
},

wrangler.jsonc

先に本番用のデータベースの初期化とリリースを済ませておきましょう。

npx wrangler d1 migrations apply my-app-db --remote
npx wrangler d1 execute my-app-db --remote --command "PRAGMA table_info(todos);"

デプロイ

npm run deploy

動作確認

curl https://cf-db-test.xxx.workers.dev/api/todos

staging 用のデータベースを初期化します。

npx wrangler d1 migrations apply my-app-db-staging --remote --env staging
npx wrangler d1 execute my-app-db-staging --remote --env staging --command "PRAGMA table_info(todos);"
npx wrangler d1 execute my-app-db-staging \
  --remote \
  --env staging \
  --command "INSERT INTO todos (title) VALUES ('タスクA'), ('タスクB');"
npx wrangler d1 execute my-app-db-staging --remote --env staging --command "select * from todos;"

ステージング環境のデプロイを実行します。 package.json にステージング環境用のデプロイコマンドを追加します。

"deploy:staging": "opennextjs-cloudflare build && opennextjs-cloudflare deploy --env staging",

実行

npm run deploy:staging

このコマンドを実行すると、本番アプリとは別のアプリケーションが作成され、 cf-db-test-staging.xxx.workers.dev のようなURLが発行されると思います。

動作確認

curl https://cf-db-test-staging.xxx.workers.dev/api/todos

本番環境とは異なり、insert したデータが取得できるはずです。

なお、コマンドからアプリを削除する際、

npx wrangler delete cf-db-test-staging

ではなく

npx wrangler delete cf-db-test --env staging

のように実行する必要がありました。

preview_database_id について

D1 Database の設定には preview_database_id というプロパティがあります。 preview_database_id はローカルのみ利用されるようで、ローカル開発の際にリモートDBにアクセスしたいケースで利用するもののようです。 通常は指定しなくてもよいかと思います。