🐱

Next.js + Vercelでステージング環境を構築

2021/10/25に公開

概要

Vercelでホスティングしているアプリケーションに独自ドメインを追加してステージング環境を構築するための手順を解説します。

この記事を書こうと思った動機

VercelはコミットごとにPreview環境のURLを作成してくれますが、固定ドメインでの開発環境やステージング環境が必要なケースも多々あるので、やり方をまとめてました。

対象読者

  • Vercelを利用したことがある人
  • Next.jsの知識がある人

前提条件

独自ドメインを所持していて利用できる状態になっている必要があります。

この記事では exmple.com というドメインのホストゾーンがAWSのRoute 53上に作成されている前提で話を進めます。

具体的な手順

以下に具体的な手順を示します。

Vercel側で独自ドメインを作成

Project Settings → Domainsから独自ドメインを作成する。

stg-frontend.exmple.com とします。

vercel-domain1

このままだとProduction環境として扱われてしまうので、Git Brunchを staging に指定します。

vercel-domain2

vercel-domain3

この設定を行なうことでPreview環境として扱われるようになります。

Route 53 にCNAMEレコードを追加

Vercelの指示に従い、以下のようにCNAMEレコードを追加します。

レコード名: stg-frontend
レコードタイプ: CNAME
値: cname.vercel-dns.com

Terraformを利用している場合は下記のようになります。

resource "aws_route53_record" "stg_frontend" {
  name    = "stg-frontend"
  type    = "CNAME"
  zone_id = "hosted zone id を措定"
  ttl     = "5"
  records = ["cname.vercel-dns.com"]
}

成功すると以下の状態になり https://stg-frontend.exmple.com でアクセスできるようになります。

vercel-domain4

Production、Stagingそれぞれに環境変数の追加

各環境ごとに環境変数を持たせる事ができるか確認します。

Project Settings → Environment Variablesから環境変数を追加します。

STAGEという環境変数を Production, Preview に追加します。

add-env1

Preview を選択する際に staging brunchを指定します。

add-env2

これによって追加したステージング環境のみ値を変えることが可能になります。

add-env3

環境ごとに環境変数の値が変わっているか確認

追加した環境変数 STAGE が以下のように各環境ごとで異なることが確認できます。

プレビュー環境

preview

ステージング環境(今回作成した独自ドメイン)

staging

本番環境

production

注意事項

VercelのPreview環境は通常であれば、x-robots-tag: noindex というHTTPヘッダーが自動で追加されます。

これによって検索エンジンでの検索結果から除外されておりSEO的なリスクに対して対策が行なわれています。

しかし今回作成したステージング環境のように独自ドメインのPreview環境は x-robots-tag: noindex が付与されないので、独自に対策を行なう必要があります。

  • HTTPヘッダー x-robots-tag: noindex を自分で付与する
  • Production環境以外は何らかの手段でアクセス制限をかける

アクセス制限に関してはSEOの問題以外にもセキュリティ要件的にステージング環境はIP制限などで関係者以外の人間以外はアクセス不可としている組織が多いと思います。

Vercelは追加料金を支払えば パスワードによるアクセス制限 を行なうことができます。

しかし月額150$の追加料金が必要です。

その為 nextjs-basic-auth などを使って自前でベーシック認証を導入するのが現実的かと思いますが、このpackageは現在、Next.js 11系だとVercel上で動作しませんでした。

https://github.com/jchiatt/nextjs-basic-auth/issues/6 が解決すれば正常動作するようになると思いますが、それまでは何らかの手段でアクセス制限を行なう必要があります。

個人的には nextjs-basic-auth を使った方法がシンプルだと思ったので、https://github.com/jchiatt/nextjs-basic-auth/issues/6 が解決することが一番望ましいと思っています。

もしも長期間解決しないようであれば nextjs-basic-auth を参考に別packageの作成なども検討しようと思います。

2021年10月31日 追記

Next.js 12がリリースされたことにより Middleware を利用できるようになりました。

ベーシック認証を利用する場合は Middleware を利用することをオススメします。

あとがき

Next.jsを使っている場合は現状Vercelがもっとも無難な選択だと思っていますが、本番環境以外の環境のアクセス制限周りがもう少し充実してくれると嬉しいなと感じています。

以上になります。最後まで読んでいただきありがとうございました。

Discussion