SSLの独自ドメイン静的Webサイトを低コストで15分で立ち上げる (Route53 + S3 + CloudFront + AWS Certificate Manager)



# こんな人向け
+ VPSよりAWS使うのが好きな人
+ 静的WebサイトなのにわざわざEC2立てて運用している人
+ 現在S3で静的Webサイトを公開しているけどSSLに対応していない人
+ AWS使ってみたいけどハードルが高そうと思っている人
+ そもそもwebサイトをインターネットに公開するのが初めてな人

今回、タイトル通りの構成で静的Webサイトをネット上に公開するやり方を紹介していきます。
高可用性・高耐久性の爆速Webサイトが多分15分くらいでできちゃいます。

この構成は世の中に沢山記事が出ていますが、
独自にハマったこともあるため防備録として記事にすることにしました。



# この記事でやらないこと
+ お名前.com等での独自ドメインの取得方法、ネームサーバーの変更方法
+ awsのアカウント作成
+ awsのIAMの設定
+ 各サービスの詳細な説明
+ 各種チューニング


# 前準備
独自ドメインの取得。
今回はRoute53で取得しました。


# 本題
以下、順番にやっていきます。
## Route53でホストゾーンを作成する（Route53でドメインを取得した場合は省略）

Route53 >> ホストゾーン
に入り「ホストゾーンの作成」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/a7eaa929-c29a-91bb-2930-96261b7253d4.png)|
|:--|

ドメイン名に取得した独自ドメインを入力し、他はデフォルトのまま「ホストゾーンを作成」を押下。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/33811d2e-e080-f859-198d-07c44acf8cd1.png)|
|:--|

このように2件のレコードが入った状態で作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/b5c61ed8-e15c-6c4b-a86a-6d1569814e37.png)

Route53でドメインを取得した場合、この状態が自然と出来上がっています。


## 独自ドメインのネームサーバーをRoute53に向ける
当記事はRoute53でドメイン取得しちゃったので省略しますが、
お名前.com等でドメインを取得している場合、
ドメインの管理画面からネームサーバーを変更する必要があります。
ドメインを取得した会社のデフォルトのネームサーバーになっていると思いますので、
ホストゾーンのNSレコードに表示されている4件のネームサーバーに変更します。

変更のやり方はネットに情報が溢れていますので、
「お名前.com　DNS変更」とかでググってください。

## S3バケットの作成
実際のコンテンツをいれるバケットを作成します。
S3に入り「バケットの作成」をクリック

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/66515162-e914-aad0-24bf-f173f0844ccd.png)|
|:--|

バケット名に独自ドメインを入力
リージョンは日本で運用するなら東京か大阪を選択したいところですが、
初めてのお試し段階では段階ではバージニア北部を選択するのが無難です（※理由は後述）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/12f1652e-f36a-5c50-6391-4b4867180eb2.png)

他はすべてデフォルトのまま作成します。
S3を静的Webサイトとしてホスティングする場合、
パブリックアクセスを有効にしたりしますが、今回の構成ではパブリックアクセスはブロックのままで大丈夫です（むしろブロックしててください）

## S3にファイルをアップロード
作成したバケットを選択して、ページから簡単にアップロードできます

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/992571f2-2eb4-26a4-867e-7dfe7c459ac1.png)|
|:--|



## SSL証明書の作成
CertificateManagerに入り、リージョンをバージニア北部に変更します。
*このリージョン変更は必ず行います*
S3のバケットが東京や大阪にある場合でも、SSL証明書の作成はバージニア北部で行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/7756af15-badf-6cf5-d1a8-9da94a2e6735.png)

パブリック証明書のリクエスト　で次へ

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/0c0929d5-2eeb-30ef-3774-ec5f2d924ce6.png)|
|:--|


ドメイン名に独自ドメインを。
別名に*.独自ドメインを設定し次へ
今回「www.独自ドメイン」でもアクセスさせたいので別名を追加しています。
*.独自ドメインでも単にwww.独自ドメインでも大丈夫です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/e0f1ea6f-38aa-0144-c7fb-ecda3929193d.png)|
|:--|

DNSの検証で次へ

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/a4e398cc-142e-94f7-18bd-c43e45c9669b.png)|
|:--|

タグは別にいらないのでそのまま次へ

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/0c3475cb-4182-c061-4403-13e2a8cd5cf1.png)|
|:--|

そのまま確定とリクエスト

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/3addbb1e-59b8-4da8-1104-c8f81bf15a1a.png)|
|:--|


ここでそのまま続行せずに表示されているドメイン名をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/e85630d5-2a87-85ce-a2e4-c29255f48ca0.png)|
|:--|

ここでRoute53でのレコード作成をします。
別名が複数ある場合はすべてに対して行います。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/64f14714-0843-1e83-fa83-42925734e899.png)|
|:--|

少し待って、このように、お客様によるアクションは必要ありませんと表示されたらラッキーです。
すべてがうまく行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/cd0d1a8a-aa9b-2029-b10a-6b7f55f87263.png)

以下のように追加のアクションが必要ですと表示された場合は、ガイドに従って必要なアクションをしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/f7bae1f1-34d6-72ff-4c2c-8209c04a7731.png)


ドメイン管理サイトのネームサーバーの変更に時間がかかっている場合もこうなります。
間違っている気がしない場合は少し時間を置いてみましょう。

続行してしばらく待つとこのようにステータスが発行済になります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/ad1ef211-dbe0-ead3-1384-c36f28582cd8.png)|
|:--|

Route53でホストゾーンを見るとCNAMEレコードが追加されています。


## CroudFrontの作成
サービス一覧からCloudFrontに入りCreateDistributionをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/51833b97-e3dc-511c-5ccf-9becb48e7d6b.png)



以下のように設定します。
>Origin Domain Name：作成したs3バケットを選択
Restrict Bucket Access:Yes
Origin Access Identity:Create a New Identity
Grant Read Permissions on Bucket: Yes,Update Bucket Policy
Viewer Protocol Policy：Redirect HTTP to HTTPS
Cache Policy：Managed-ChathingDisabled
Alternate Domain Names(CNAMEs):独自ドメインと、独自ドメインの別名
SSL Certificate:Customを選択し、作成したSSL証明書を選択
Default Root Object:index.html

Origin IDは自動で入ります。

※CloudFrontの売りであるキャッシュをここで無効にしているのは、理由があります。
初めての構築でハマることもあると思います。
他の設定も色んなところを弄って遊んでみることもあると思います。
その時に、キャッシュが効いていたら設定した内容の動きをしているのか、していないのかさっぱりわからない状況になってしまいます。
変にイジって動かなくなって、頑張って戻してやっと成功したと思って時間が立ったらまた動かなくなってる。みたいなこともあるかと思います。
いつぞやのたまたまうまくいっている設定がキャッシュされているパターンですね。

ですので、スタートアップ時はキャッシュを無効にしておいて、運用開始直前でキャッシュを有効にするのがいいです。


|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/dbd9b5f1-ebdf-b7ba-c052-91947a5be426.png)|
|:--|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/180795d2-17a8-3d10-456d-ddcefd8eba9a.png)|
|:--|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/30b0f4d0-5671-9bf8-a5b6-dcd383a3854e.png)|
|:--|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/4f45b964-2c39-ccda-85ff-a40c7dcdb031.png)|
|:--|


ここで選択するSSL証明書はバージニア北部のリージョンで作成したものしかリストアップされません。
SSL証明書をバージニア北部で作成する必要があったのはこのためです。

Restrict Bucket Accessで作成したアクセスポリシーがs3バケットに反映されていると思います。
見てみましょう。
サービスからS3 -> 作成したバケット -> アクセス許可

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/8d109dc7-fb68-75c9-5e3f-1ff9dd44cddc.png)
|:--|

これでS3自体はパブリックアクセスをすべてブロックしていて、静的ウェブサイトホスティングも有効にしていませんが、
CloudFrontからはアクセスできるようになります。


## Route53の設定（独自ドメインへのアクセスをCloudFrontに向ける）
作成したホストゾーンに入り、「レコードの作成」をクリック

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/cbbb3ce8-1553-b657-3fd8-de962fa78fc6.png)|
|:--|

以下のように作成

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/dad7baad-61d7-1b4f-006b-33438e602ce1.png)|
|:--|

エイリアスで作成したCloudFrontが選択できるようになっています。

wwwも受ける。CNAMEとかではエイリアスが出てこないのでAレコードでwwwなしを指定してます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/a6242827-97a5-4dce-15f4-ef2628c28692.png)|
|:--|


以上で終わりです。
スムーズにいけばおそらく15分〜30分程度で完了したんではないでしょうか？
独自ドメインでweb上に公開されているか確認しましょう。

大丈夫そうなら運用開始前に忘れずにCloudFrontのキャッシュを有効化してください。
以下のようにキャッシュポリシーを変更します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/0e8b4226-6af0-6891-72d7-b292eda88130.png)|
|:--|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/71a21e03-8c66-abac-c968-b91ab1245f8b.png)|
|:--|



# 料金について
それぞれのサービスで従量課金の利用料がかかりますが、
アクセスの少ない個人営業飲食店などのサイトだったらほとんど無料枠でいけちゃうと思います。
行っても月1000円程度？もっと安いか。
アフィリエイト入れているサイトなら仮に運用費が高くついても収入と比べて赤字になることは無いと思います。
ちゃんと試算していませんので気になる方は公式の料金表や試算している方のサイトをご覧ください。

公式の料金表ページを貼っておきます。

https://aws.amazon.com/jp/s3/pricing/

https://aws.amazon.com/jp/route53/pricing/

https://aws.amazon.com/jp/cloudfront/pricing/

https://aws.amazon.com/jp/certificate-manager/pricing/

certificate-managerは無料です。つまりSSLは無料。


10年前ならコストが高いリッチな構成が今ではただみたいな料金でできます。
時代の進化はすごいですね。

# おまけ
## CloudFrontのキャッシュクリア方法
Invalidationsからキャッシュを削除したいパスを入力します。
すべて削除するなら　/* のように入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/0c0883f6-b220-10fd-8c5f-b5d7391d3f5d.png)

こちらは無料枠がありますが、無料枠を超えるとファイル毎に料金がかかりますのでお気をつけください。
悲しいお話を見つけました。

https://techblog.gmo-ap.jp/2016/09/30/amazoncloudfront%E3%81%AEinvaridation%E6%A9%9F%E8%83%BD%E3%81%A720%E4%B8%87%E5%86%86%E3%81%B6%E3%81%A3%E9%A3%9B%E3%81%B0%E3%81%97%E3%81%9F%E8%A9%B1/

## S3を北部バージニアで作成した理由
詳しくは[S3+CloudFrontでS3のURLにリダイレクトされてしまう場合の対処法](https://dev.classmethod.jp/articles/s3-cloudfront-redirect/)をご参照ください。

自分も一回ハマりました。

別にすぐ解決できるから好きなリージョンで作ればいいと思いますが、
チュートリアルであまりコケて諦めてほしくないのでS3のリージョンをバージニア北部に指定しました。
SSLがバージニア北部で作成する必要があるので合わせた方がわかり良いかなという思いもあります。

日本での運用では大阪か東京にすると思いますが、
正直CloudFrontが前にいるので別にバージニアでいい気がします。

# 最後に
簡単でしたか？
S3のホスティング機能でWebサイトを公開している方は沢山いると思いますが
S3ってsslつけれないんですよね。
最近のブラウザはsslじゃないとすぐ煽ってくるのでSSL化が当たり前の時代になっています。
この機会にチャレンジしてみてはいかがでしょうか。

## 気に入った所
・すごい構成なのに安い
・簡単（いらんことしてハマらなければ）

## 気に入らない所
・www有りはwww無しにリダイレクトしたいけど、このままの構成ではできない
・S3へのアップロードが昔ながらのFTPで上げているみたいでなんかいやだしめんどくさい（上げ漏れとか起きそう）
　でもWebデザイナーさんにも使えるようになってほしい構成なのでAWS CLIを使わせるのは気が引ける

このあたりは解決策がありますので~~また記事をあげようと思います。~~
書きました。

https://qiita.com/yakitatata/items/83915900b46e2a30ab9f

https://qiita.com/yakitatata/items/f0393eeb4a72d3aa1e81

## その他
モザイク処理が面倒くさかった。次はしない（かも）

# 特に参考にさせていただきました。

https://blog.s0014.com/posts/2018-12-03-s3-https/

https://dev.classmethod.jp/articles/static-contents-delivery-patterns/

https://dev.classmethod.jp/articles/s3-cloudfront-redirect/