Cloudflare PagesでRemixアプリを公開する場合、環境変数を.envと.dev.varsで管理できる
この記事では、CloudflareにRemixアプリをデプロイする際の環境変数の取り扱い方を紹介しています。開発時やビルド時には.envファイルを使用し、Cloudflare向けには.dev.varsファイルを利用します。公開可能な値は.envに、秘匿すべき値は.dev.varsに設定することで、セキュリティリスクを軽減できます。異なる環境用に設定する場合、.envファイルを分けて管理し、.dev.varsでCloudflare Pagesの環境変数を設定することがポイントです。
目次
この記事では、CloudflareにRemixアプリをデプロイする際に環境変数をどのように取り扱うかを自分なりにまとめて紹介します。
Cloudflare向けに作る場合、サーバー側とブラウザ側で環境変数を個別に管理できる
Remix(Vite)でアプリを開発している場合、環境変数を2種類のファイルから読み込みできます。1つ目はViteなどを使ったアプリケーション開発でお馴染みの.env
ファイルです。これを使うと、開発時やビルド時にRemixにimport.meta.env.XXX
のような形で変数を取り込むことができます。そしてもう1つはCloudflare向けアプリをローカル開発する際に利用する.dev.vars
ファイルです。ここで設定した値は、Wrangler
を使ったローカルサーバーを立ち上げた際に、リクエストのコンテキスト情報としてデータが取得できます。
import { LoaderFunctionArgs } from "@remix-run/cloudflare";
import { useLoaderData } from "@remix-run/react";
export async function loader(props: LoaderFunctionArgs) {
const {
STRIPE_SECRET_KEY,
} = props.context.cloudflare.env
...
}
export default function DemoApp() {
...
return (
<div className=`${import.meta.env.APP_MODE}`>...</div>
)
}
.dev.vars
側を使って全ての環境変数を管理しても良いのですが、両ファイルの特性を考えると次のような使い分けができそうです。
.env
に公開可能な環境変数を設定する(例: Stripeなどの公開可能APIキーやAlgoliaのインデックス名など).dev.vars
へはサーバー側でのみ使いたい、秘匿すべき環境変数を設定する(例: AWSのシークレットやStripeのシークレットAPIキーなど)
ファイルを分けて管理することで、公開してはいけない値を誤ってRemixのloader
などで露出させてしまうリスクをへらせます。
環境ごとに別の値を設定したい場合
公開可能なデータについては、.env
ファイルで管理しています。そのため、.env.development
や.env.production
のようにファイルを分けて管理したり、CIワークフローにて設定することができます。これらの値はRemixのビルド処理が実行されたタイミングでアプリケーションに取り込まれます。そのため、テスト環境と本番環境で利用するAPIキーが異なる場合は、ビルド時に取り込みたい方の値が設定できているかどうかを調べるようにしましょう。
.dev.vars
で設定している値は、Cloudflare Pagesの環境変数として設定しておきましょう。wrangler secret put XXX
コマンドを使うことで、値を簡単に取り込みさせることができます。
おわりに
あまり記事として紹介されているところを見ない方法でしたので、もしかするとベストプラクティスではないのかもしれません。(まだRemixに自信がない)ただ、体感として「ソースコードに含まれる。ユーザーに見られる可能性のあるものかどうか」が、一発でわかるのが良いので、明確な問題が見つかるまではこの方法でアプリケーション開発を進めたいと思っています。