概要
タイトルの通りですが、これまで作成してきた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本ノック実施中