バックエンドエンジニアがReactとGatsbyに入門して2日間で独自ドメインの静的サイトをAWSにホストしてみました。

普段はサーバー系のプログラミング作業や、インフラ構築＆運用系の作業がメインなのですが、[こちらの記事](https://qiita.com/poly_soft/items/39bde910f813fc9ab84a)でも書きましたが現在Vue.jsとTypeScriptを使ったフロントエンドの作業も担当させてもらってまして、良い機会なのでついでにReactも勉強してしまおうということで週末にざっと取り組んでみました。

また、[こちらの記事](https://levelup.gitconnected.com/a-recap-of-front-end-development-in-2017-7072ce99e727)で知ったのですが、フロントエンドではここ数年[静的サイトジェネレータ](https://www.netlify.com/blog/2017/05/25/top-ten-static-site-generators-of-2017/)というものが結構使われるようになってきているらしく、その中でも[Gatsby](https://www.gatsbyjs.org/)というジェネレータが最近人気があり、それがReactを使って作られている＆それを使ってポートフォリオサイトを作ってる人が結構いるようなので、自分もちょっとその流れに乗ってReact+Gatsbyでプロフィールサイトを作ってみることにしました。

学習に使ったリソースと所要時間、引っかかった部分等を、これからReactやGatsbyを勉強しようとしている方たち向けの情報として残しておきたいと思います。

# 静的サイトジェネレータとは

私と同様に普段サーバーサイドがメインの方は「なにそれ？」という方も多いと思いますが、下記の記事を読めば大体のことは分かると思います。

[static site generator のメリットとデメリット - 解き放たれしソフトウェア](http://gnu.hatenablog.com/entry/2016/12/03/045836)

[Top Ten Static Site Generators of 2017 | Netlify](https://www.netlify.com/blog/2017/05/25/top-ten-static-site-generators-of-2017/)

一番有名なのは[jekyll](https://jekyllrb.com/)というジェネレータで、Rubyで作られているそうです。

# Gatsby

Reactを使用して作られている静的サイトジェネレータ。[Reactのドキュメント自体](https://reactjs.org/)もGatsbyで生成されているそうです。

[GatsbyJS](https://www.gatsbyjs.org/)

[Gatsby is a static site generator using React and GraphQL | React, etc. Tech Stack](https://react-etc.net/entry/gatsby-is-a-static-site-generator-using-react-and-graphql)

# GraphQL

Facebookの作ったAPI仕様というかSQL的なクエリ言語。下記等を参照すると大体の雰囲気は掴めると思われます。Gatsby内では、設定ファイルに記載されているjsonを読み込んだり、マークダウン形式で記述された記事を読み込む際に使われているようです。(私もまだあまり理解出来ていません)

[アプリ開発の流れを変える「GraphQL」はRESTとどう違うのか比較してみた - WPJ](https://www.webprofessional.jp/rest-2-0-graphql/)

[GraphQL入門 - 使いたくなるGraphQL - Qiita](https://qiita.com/bananaumai/items/3eb77a67102f53e8a1ad)

# Reactの学習

とりあえずReact公式サイトの「Quick Start」と「Tutorial」の2つだけやりました。ES6とかフロントエンド周りの最近の技術に関してはVue.jsの勉強で大体キャッチアップ出来ていた＆Vue.jsとReactで共通している箇所が結構ある感じなのでそんなに躓くところはなく、所要時間は両方合わせて1日〜1日半程度という感じでした。(ちなみにエディタはVSCodeを使っています)

Reactの学習ソースとしては他にも色々あると思いますが、英語ではあるものの公式サイトのQuick StartとTutorialは非常に分かりやすくて良く出来ているので、入門としてはこの2つだけやっておけば十分のような気がします。

じっくりやりたい方は「Advanced Guides」をやっておくのもの良いかと。

[Quick Start - React](https://reactjs.org/docs/)

[Tutorial: Intro To React - React](https://reactjs.org/tutorial/tutorial.html)

# Gatsbyの学習

とりあえず「Getting Started」を読んでみたところ、`Starter`というテンプレートキット群の存在を知り、それを使えばブログサイトとかが簡単に作れるとのことだったので、座学よりもとりあえずコードをいじっちゃった方が早いなということで[gatsby-starter-blog](https://github.com/gatsbyjs/gatsby-starter-blog)というスターターをローカルにインストールして、プロフィール写真をいじったりトップ画面の文言を変更したりしてみました。

[GatsbyJS](https://www.gatsbyjs.org/docs/)

[gatsby-starter-blog](https://github.com/gatsbyjs/gatsby-starter-blog)をインストールするにあたっての注意点ですが、MacのPython3の環境だと、このstarterが依存している[sharp](https://github.com/lovell/sharp)というnpmパッケージのインストールに失敗するようなので、`pyenv`とか`virtualenv`とかで普段Python3の環境を使っている方は、gatsby-starter-blogのインストール後(インストール失敗後)に、`node_modules`ディレクトリを一旦削除して、Python2用の隔離環境を作ってから`npm install`するようにしてみてください。(なにげにここで結構時間を浪費してしまいました・・・)

# S3 + CloudFront環境へのアップロードとRoute53による独自ドメインの設定

ホスティングサービスとしては[Netlify](https://www.netlify.com/)にも興味があったのですが、とりあえず自分が慣れてる環境でさくっとホストしたかったのでS3とCloudFront、そしてRoute53を使って独自ドメインでホストしてみました。

ここら辺に関しては下記の情報等が参考になると思います。

[[CloudFront + S3]特定バケットに特定ディストリビューションのみからアクセスできるよう設定する ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/cloudfront-s3-origin-access-identity/)

[Amazon Route 53のALIASレコード利用のススメ ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/)

独自ドメインでZone Apexを使用する場合は、Route53でAliasレコードを使用する必要があるのでご注意ください。

また、実はここが一番引っかかった箇所なのですが、東京リージョンでS3にバケットを作成した後すぐにCloudFrontのディストリビューションを作成すると、`307 REDIRECT`が延々と返されるという現象が発生してしまう場合があります。下記に情報がありますが、デフォルトリージョンであるバージニア北部リージョン(`us-east-1`)でS3バケットを作成する場合はこの現象は発生しないらしいので、どうしても東京リージョンを使いたいという理由が無ければバージニア北部リージョンを使っておくのが無難かもしれません。

[amazon web services - AWS Cloudfront redirecting to S3 bucket - Stack Overflow](https://stackoverflow.com/questions/38735306/aws-cloudfront-redirecting-to-s3-bucket)

[AWS Developer Forums: Cloudfront domain redirects to S3 ...](https://forums.aws.amazon.com/thread.jspa?threadID=216814)

[リクエストのリダイレクトと REST API - Amazon Simple Storage Service](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Redirects.html#TemporaryRedirection)

> Amazon S3 が持つ分散型の特質により、リクエストが誤った施設に一時的にルーティングされる場合があります。このエラーは、大半の場合にバケットが作成または削除された直後に発生します。例えば、新しいバケットを作成し、ただちにバケットへのリクエストを実行する場合、バケットのロケーションの制約によっては一時的にリダイレクトされる可能性もあります。米国東部 (バージニア北部) リージョン (s3.amazonaws.com エンドポイント) にバケットを作成した場合は、リダイレクトされません。このリージョンがデフォルトのエンドポイントであるためです。これに対し、その他のリージョンにバケットを作成した場合、バケットに対するリクエストはこのデフォルトのエンドポイントに転送されますが、バケットの DNS エントリは伝播されます。デフォルトのエンドポイントは、HTTP 302 レスポンスを表示すると共に、リクエストを正しいエンドポイントにリダイレクトします。

# 成果物

とりあえず下記のようなトップ画面を表示するところまでは辿り着きました。

![スクリーンショット 2017-12-19 09.48.11.png](https://qiita-image-store.s3.amazonaws.com/0/22932/cb0e9da7-aa77-d69f-95cf-37ff26f21b8b.png)


[Polyglot Engineer's Playgrounds](http://kentakatsumata.net/)

# 振り返り

とりあえずReactに入門するという主目的は達成出来たのと、賛否両論あるJSXがどういう感じなのかはおおよそ把握出来たので、週末に取り組む個人プロジェクトとしては丁度良かったかなと。

今後は、[こちらの記事](https://www.gatsbyjs.org/blog/2017-10-05-portfolio-site-gatsby-wordpress/)を参考にして、GraphQLを使って`バックエンドにWordPress、フロントエンドにGatsby`という構成のサイトにしてみたりとか、デザインの勉強にも関心があるのでレイアウトやcssをいじったりとか、ReactとGatsbyを使って色々と遊んでみようと思っております。