猿でもわかる！S3 + CloudFrontでの静的サイトホスティング


# 概要

博士「ポートフォリオや、ちょっとしたサイト作ったけど、わざわざサーバ立てたりするのは面倒だなーって思うよね？
そんな時!AWSのS3を使えばサーバレスなサイトホスティングができるよ！
サーバーを使っていないから、月々の費用も安いし、管理も楽なんだ！
やりかたもとっても簡単！簡単すぎて猿でもできるんだ！
実際に猿を連れてきたからみんなで一緒にやってみよう。よろしくね、猿くん！！」

猿「・・・・・・・・・・」


### 今回扱うこと
- S3を用いたサーバレスなサイトホスティングの方法
- AWSコンソールを使ったリソース作成
- ACMでの証明書発行方法
- CloudFrontの最低限の設定方法

### 今回扱わないこと
- AWSアカウントの設定周り
- DNSの細かい設定
- awscliなどコマンドラインでのリソース作成
- 猿の生態
- 猿との正しい触れ合い方

# 作成手順

## 事前準備

博士「事前に用意が必要なものはこの２つ」

- AWSアカウント作成
- サイトのドメインの準備

博士「今回AWSアカウントの作成方法は省略するよ！読みやすい記事がたくさんあるから読み漁ってね！」

猿「ウキー・・・・」

博士「ほら、読んで、猿くん、LGTMして？」

猿「・・・・・・ウキャー！！(PCを叩く)」

博士「・・・あとは、自分のサイトで利用したいドメインを用意しよう！
　お名前ドットコムなんかで買ってもいいし、Route53でも発行できるよ
　ぶっちゃけホスティングだけならドメインなくてもできるけど、URLダサくなるよ！」

## STEP1 S3を作成しよう！

博士「それじゃあ早速やっていこう！まずはS3のBucketを作成するよ」

猿「キーッ！！ウキャーウキャー」

博士「AWSコンソールからログインしたら、 `バケットの作成` を押そう！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/8b07972c-417a-30cb-d9bc-5d8aab204b3e.png)

博士「ここでポイント！この時、実際に利用するドメイン名でバケットを作成すること！
 今回は `sarusaru.com` というサイトでを作る想定で進めるよ」

博士「リージョンは東京が無難だね、そのほかの設定は一旦無視してOK、`バケット作成` を押して作成しよう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/20b7fe29-910b-d88a-9715-c66bc349581a.png)

博士「無事にできたかな？」

猿「・・・・・・（バナナを食べている）」

博士「次に行ってみよう」

## STEP2 S3を設定しよう

博士「それじゃあ、作ったバケットにサイトのコンテンツをアップロードしよう！猿くんできるかな」

猿「・・・・キー」

博士「・・・うん。まあ、なんか普通にやってればできるから・・・・この時、TOPページがどこになるか覚えておいてね」

猿「ウキー」

博士「ここからが本題！次はS3の設定をするよ！バケット名を押して、詳細から `プロパティ` を押そう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/4e6faad4-6fe2-3006-2b4b-16fd36ecccb7.png)

博士「そのままずーっと下の方に進むと`静的ウェブサイトホスティング`の項目があるよね？そこで`編集する`を押そう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/85576316-a3fc-6425-4898-7ec25d7d7bd8.png)

博士「編集画面で、ラジオボタンを`有効にする`に帰ると・・・・」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/9d98a4c2-1881-dad9-6707-967f2d2b2ed1.png)

博士「たくさん出てきたね！ほら、見てよ猿くん」

猿「キーッ！！ウキャーッ！キャッキャ！」

博士「ああ、これは威嚇行動だよ！歯を見せて自分にこれ以上近寄ると噛み付くぞというアピールなんだ、怖いなあ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/4021d67f-6a48-96f3-0bf8-ed404bfc8bb4.png)

博士「`インデックスドキュメント`には、サイトのTOPページに当たるファイルのパスを入れよう。
　大体の人は`index.html`だと思うからそれを記載しておくね」

猿「キー！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/74ece1dd-59bb-6ef8-ad4f-138282b726df.png)

博士「エラードキュメントも設定しておかないと、保存ができないからしておこう。エラーが起こったときにこのページを返してくれるんだ
 そんなページは用意してないかもしれないけど、まあ、ここは実ページがなくても大丈夫だから一旦入れておこう」

猿「・・・・」

博士「変更できたら、`変更の保存`を押そう！」

## STEP3 S3を公開しよう!

博士「いよいよコンテンツを公開するよ！この先の作業を実施すると
　**バケット内のコンテンツが全世界に公開されることになる**から気をつけよう！
　Twitterの裏垢のパスワードとかうっかり入れないようにね」

博士「それじゃあ、バケットの詳細画面を開いて`アクセス許可`のタブを押してね」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/318624ca-0cb4-0b7c-5fa8-f8652d50d1ac.png)

博士「編集を押したら、一番上`パブリックアクセスを全てブロック`のチェックマークを外そう！！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/7129f829-9d68-553d-b2a4-f80dfc13a750.png)

博士「こんなふうに大丈夫？って聞かれるけど、問題ないから強い心で変更を貫こう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/7fbd8b48-ecfb-04bb-05ad-e0dcacddad2a.png)

博士「できたかな？次はその下、`バケットポリシーの編集`をするよ！
　下の方にある項目で編集を押して・・・・」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/b5869d2c-022e-737b-c9a5-1ea330dd9a45.png)

博士「こんな画面が開けたかな？そしたら今から書くものを貼り付けてね」

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::sarusaru.com/*"
            ]
        }
    ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/61e65764-2930-bd04-bdb6-4ff128c5e010.png)

博士「こんな感じ！`sarusaru.com`の部分は自分のバケット名に置き換えよう。
　他はこのままで大丈夫！猿くんもできたよね？」

猿「キーッ！！」

博士「落ち着いてよー、リンゴあげるから」

猿「・・・・キー」

## STEP4 サイトを確認しよう!

博士「ポリシーの設定ができたら、さっき設定した`静的サイトホスティング`の箇所に戻ろう！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/f00ad6f0-f785-8267-7eaf-ffe86995806c.png)

博士「ここの赤線が引いてあるリンクが**エンドポイント**と呼ばれる、いわゆるURLだよ。
　実際にここをクリックして自分のサイトが見れるか確認しよう！」

猿「・・・・・」

博士「ここまでできれば公開までは大丈夫！」

博士「SSLでのアクセスに拘らないのであれば、あとはDNSで指定のドメインとさっきのエンドポイントを紐づければ公開自体はできるよ」

猿「ウッキ」

博士「そう！DNSに登録するのはちょっと待って、SSLの設定に進むよ猿くん！」

猿「・・・・・」

## STEP5 証明書を発行しよう!

博士「ここから先は`https`でサイトにアクセスさせたい場合に必要な手順になるよ！ちょっとだけ難しくなるけど頑張ろうね！」

猿「・・・・・」

博士「大丈夫、猿くんでもできるよ！自信持って！」

猿「キー！(扉を叩く)」

博士「ああっ！逃げちゃダメだよ.まずは**AWS Certificate Manager**(ACM)の画面にアクセスしよう！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/d5232217-6c55-d540-35b4-3864b97f99d7.png)

博士「今すぐ始めるを押して・・・欲しいんだけどその前に一つ注意点！この先の作業は`バージニア北部`リージョン(`us-east-1`)で行ってね。そうしないと、このあと利用する**Clooud Frontに紐付けができなくなる**んだ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/20855966-c1d3-11c7-ebf2-8753a9a41f36.png)


博士「準備ができたら、`パブリック証明書のリクエスト`にチェックを入れて証明書のリクエストを押そう！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/2e264006-b697-aced-5573-89ec21c2e369.png)


博士「ドメイン名のところに自分のドメイン(ここでは`sarusaru.com`)を入れて、次へを押そう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/2559c0f0-fc66-2be2-f9c4-6928c06ef7d3.png)

博士「もしDNSの設定変更ができる場合は`DNSの検証`がおすすめだけど、Eメールの検証でも問題ないよ」

猿「・・・キー(果実をかじる)」

博士「ちょっと難しいかな？」

猿「ウキー！ウキー！」

博士「設定したはあとはポチポチ押して進めよう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/00e9bc01-37e1-03d3-991a-1e4600ef9188.png)

博士「この赤枠のところ！この値を今回利用したいDNSサーバーに設定しよう！設定したらあとは待つだけ、バナナでも食べてのんびりしてよう」

猿「キー！」

博士「ちなみに、イギリスでは猿の餌にバナナはあげないらしいよ。健康に悪いんだって」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/2ba87f5a-7539-d4e6-fbaf-22739f68f392.png)

博士「ここの**検証保留中**が**発行済み**になったら準備OKさ！そろそろ大詰めだよ」

## STEP6 CloudFrontを作成しよう!

博士「ここが一番難しいよ！Cloud Frontを設定しよう」

博士「Cloud Frontの画面を開いたら`Create Distributions` を押そう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/5c01694e-4163-69e0-2e5c-b36d06af04db.png)

博士「早速英語だらけだけど、上の`Get Started`を押そう」

博士「大量のパラメータが出てきたね！やれることはたくさんあるけど今回は**必要最低限**に留めるよ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/9c1d9ffd-07ca-226d-8417-29a9ce0868ec.png)

博士「まずは**Origin Name**ここはプルダウンにさっき設定したS3が出てくるはずだからそこを選ぼう
　そうすると**Origin ID**が自動で入るよ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/37e976f7-e074-44a9-0dd6-f4292fc84317.png)

博士「**Restrict Bucket Access**をYesにしておこう！こうすることでS3バケット直のアクセスを防げるんだ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/30f9608d-8232-f276-021c-1915a737d323.png)

博士「ここは**Create a New Identity**を選択。Commentは自動で入るからそのままでいいよ(変えても大丈夫だよ)」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/61f035f5-b943-f2db-59a0-d6b77dca4a90.png)

博士「ここもYesで！CloudFrontからのバケットアクセスが許可されるよ」
猿「・・・・・・」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/70bddca4-2f3c-1e3f-5032-9c32bb2298e6.png)

博士「次はここ！HTTPでリクエストが来たらHTTPSに飛ぶように設定変更しよう。
　なんらかの事情でhttpを残したい場合はこれだとhttp通らなくなるから気をつけてね」

猿「ウキャー！ウキャー！」

博士「ああ、どうしよう、急に暴れ出したよ猿くん！どうしたの！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/d18b44e3-4da9-ca3e-88b9-8aa87edaa759.png)

博士「さあ！もうすぐだよ！**Alternate Domain Names**にドメイン名(S3のバケット名)を設定しよう！
　　**SSL Certificate**はCustomを選ぶとさっきACMに登録した証明書が出てくるはずだから選ぼう
　　もし出てこなかったら証明書が発行済みになってるか、ACMのリージョンがバージニアになっているか確認しよう」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/4f1e542a-a017-e678-e9db-bb3d332020a8.png)

博士「**Default Root Object**には、STEP２で設定したインデックスと同じ値を入れよう！」

博士「ここまでお疲れ様！最後に`Crete Distribution`を押してクラウドフロントを作成しよう！」

猿「(木の上に登って枝をゆすり始める)」

博士「ああっ！だめだよ猿くん！これはマウンティングといって行動でもって『おれはこんなに強いんだぞ』と相手より自分が優位であることを示すための行動だよ。エンジニアにもこういう人は多いんだ。もっとも、エンジニアの場合こういうマウント取ってくるやつに限って大概はしょうもないんだけどね！あっ違うんだよ猿くん今のは僕の偏見だよ！！降りてきてよ〜〜」

## STEP7 DNSを設定しよう

博士「いよいよ最後だよ！もう一踏ん張り」

猿「ウキャー！ウキャー！」

博士「ああ、さっきからすごい叫んでるよ・・・困ったなあ・・・・」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/6f6a9c7b-a714-9fcc-e26d-8d8e5abff860.png)

博士「Domain Nameの`****.cloudfront.net`の値をメモしよう！あとはこれをDNSサーバーに設定すれば設定は完了だ！」

猿「ウキー！ウキー！」

博士「Route53に設定する場合はこんな感じだよ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/d6047906-c93c-7b1a-8145-d0976b5df2d1.png)


博士「ちなみにレコードタイプは他環境や別のDNSを利用する場合は`CNAME`での設定が必要になるよ！」

猿「ウキーーー！」

博士「ここまでできたらやっと、静的ホスティングの完成だ！」

猿「ウキャー！(バンバン)」


## 終わりに


博士「どうだったかな？これでサーバーの管理することなく、サイトを公開できるよ。簡単だったでしょ？ね？猿くん！」

猿「ウキャー！(木の枝を投げる)」

博士「・・・・・・・無理・・・・・か」

猿「・・・・・・・・」

*一般に人間は猿より賢いと認識されており
知能が低い人間でもできることを揶揄して「猿でもできる」などといいます
ですが、厳しい野生の中でも仲間を重んじ、本能のまま生きる猿たちと
高いはずの知能を持ちながら互いをを憎み、妬み、いたずらに命を奪い
辛いと思いながらも会社にいく毎日を余儀なくされている我々人間
果たして、本当に賢いのはどちらなのでしょうか*


## 参考URL
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html
https://qiita.com/THacker/items/11eadffe6b3ce3491e3b