概要
タイトルの通りですが、これまで作成してきたWebアプリをVercelにデプロイして完了したいと思います。
これまで
Hasuraにユーザーのデータと仮定してデータを作成し
データを外部APIとして取得できるようにして、Next.js(apollo)を使ってgraphQLを通じてHasuraにクエリやミューテーションができるようにしました。
Hasuraから取得したユーザーデータの一覧ページと詳細ページを作りながら、SGとISRを学んできました
リファクタリングぽい内容ですが、React customHooks を利用してロジックとUIを切り離すこともやりました。
この記事でデプロイまでを完了させて最終的なゴールを達成したいと思います。
目的(最終的なゴールを達成する)
- 仕事で使っている技術のキャッチアップと復習
- 使う可能性がある技術の理解度向上
Hasuraのエンドポイントにアクセスコントロールをつける
これまで使ってきたHasuraのエンドポイントは誰でもアクセス可能な状態です。なので、Vercelデプロイ前にアクセスコントロールをしたいと思います。
JWTトークンを用いた認証もありますが、今回はHasura admin secretのkeyを使った認証をやりたいと思います。
ENV vars > New Env Varまで行って
Valueはなんでもいいです。そしてAddをクリックします。Launch Consoleをクリックします。
x-hasura-admin-secretがセットされていますね。これが有効になっている限り、APIにアクセスする際にkey: x-hasura-admin-secretとvalue(セットしたヤツ)を合わせないとアクセスできなくなります。
Next.jsでもHasuraから作成した、x-hasura-admin-secretのvalueを環境変数として持たせます。
NEXT_PUBLIC_HASURA_KEY="xxxxxxxxxxxxxxxx"
NEXT_PUBLIC_HASURA_URL="https://ryosuketter-hasura-test.hasura.app/v1/graphql"
アクセスする際に、headerにkey: x-hasura-admin-secretの指定が必要なのでセットしましょう。
ついでに、NEXT_PUBLIC_HASURA_URLも環境変数化してます。
valueは.env.localから持ってきます。
const createApolloClient = () => {
return new ApolloClient({
ssrMode: typeof window === 'undefined',
link: new HttpLink({
uri: process.env.NEXT_PUBLIC_HASURA_URL,
headers: {
'x-hasura-admin-secret': process.env.NEXT_PUBLIC_HASURA_KEY,
},
}),
cache: new InMemoryCache(),
})
}
yarn buildしてyarn startすれば確認できると思います。
Vercelにデプロイ
github上にレポジトリ作成
ローカル上のコードをコミットして、今度はgithub
画像の通りじゃなくてもOK。リモートレポジトリ作ってpushしましょう。
Vercel
今度はVercel側に行きます。Githubの認証が終わったらログインできます。
githubと紐づけたら作成したレポジトリと紐づけます。
Vercelはpush(branch: main)したら自動デプロイされるので、その前に動かしたいコマンドを設定します。
テスト書いてたら、テストがパスするかなどもできます(今回はテスト書いてませんが)。
テスト書いてたら、これを記載してもいいと思います。
yarn testしてパスしたらビルドが走ります。という意味です。
Vercel に 環境変数をセット
ローカルで作成した2つの環境変数をセットしましょう。
では、Deployをクリックします。
こんな感じになると思います。デプロイできたらこうなります👇
何かしらURLが生成されデプロイできたので、アクセスして今まで作った機能を検証してみてください。
Hasuraとの通信もできていると思います。
また、ユーザーを作成して、SGされたページを見ると、最初は新規作成ユーザーが反映されていなくて、2回目みたら反映されていることを確認できると思います。
![]()
さいごに
下記のような構成を学ぶ旅も本記事で完結です。
めっちゃ触りだけな内容なので、これから深く学んでいこうと思います。
アウトプット100本ノック実施中











