TL;DR
too long didn't read
はじめに、キャプチャ多めで、全文が長いので、作業工程の要約をここにまとめたいと思いますー
- ドメインを無料で取得。([freenom][1])
-
Amazon S3に静的ホスティング用の対象ファイル(index.htmlとか)をアップロード -
Route53でドメインを名前解決する。- Route53でホストゾーンを作成
- ドメイン取得したサイト([freenom][1])のネームサーバー設定にRoute53ホストゾーンの
NSドメインを設定
-
AWS Certificate Managerで取得ドメインに対して証明書を発行- CNAME作成
-
CloudFrontでS3バケットの静的サイトに対して、アクセス可能にする。- CloudFontでディストリビューションを作成
- Route53で、CloutFrontのドメイン用のAレコードを作成
- S3バケットで、パブリックアクセス設定を変更し、バケットポリシーをJSONで書き換え
(※ちなみに、ちょいちょい個人情報的なのは消してます。お見苦しかったらお許しを☆)
[1]:https://www.freenom.com/ja/index.html
Amazon S3静的サイトホスティングのアーキテクチャ
ドメインを取得
AWSのRoute53で取得するとお金がかかるので、
今回は、[freenom][1]で無料でドメインを取得しちゃいます。
-
freenomのサイトはこんな感じです。(2021-02-08現在)
トップのヘッダー画像はアクセスごとに変わるみたいです〜。(世界観がすごい)

-
Servicesタブから「Register a New Domain」を選択して、任意のドメイン利用状況をチェック
使われてないといいな〜
「$0」:プライスレスに感動

※ちなみに、.tkはオーストララシアにあるニュージーランドの領土であるトケラウのドメイン。(日本は.jpですね〜〜・・・国ごと売ったのか、、、売国主義www) -
カートページに飛び、内容を確認。
Periodのところで、期間を選択。最大で12ヶ月無料も指定できちゃいます。

※後でネームサーバーの設定をするので、「Forward this domain」or「Use DNS」は、一旦飛ばす。 -
明細を確認。利用規約に同意して、「
Complete Order」
確かに$0(0円)。マックのスマイルと同じプライス、タダですねえ!!

-
ちなみに、「
Services」タブの「My Domains」を選択すると一覧が出るので、「Manage Domain」を押すと

それぞれのドメインに関連する色々な設定画面に飛べます。
NameServerなんかの設定もここで出来ます。


Amazon S3に静的サイト用のindex.htmlアップ
(キャプチャがちょいちょい細切れになっていますm(_ _)m)
-
静的サイトをホストするためのバケットを作成します。
オレンジのボタン「バケット作成」をクリック

バケット名を任意の名前で作成(※静的ファイルを配信したいドメイン名にするのが、オススメ)
一旦全て、デフォルト設定で作成しちゃいます。

CloudFrontとの結びつけの際に、このパブリックアクセス設定が重要になってきます。(※後述予定)


-
ファイルをアップロード
「ファイルを追加」から好きなファイルをアップロードしましょう〜

アップするとこんな感じなります。

これまで、レンタルサーバーとかにFTPでファイル転送してアップしてたけど、
そういった手間とソフトウェアも要らないし、めっちゃくちゃ楽!!
Route53でホストゾーンを作成
-
ホストゾーン作成ページ
ドメイン名に取得した任意のドメインを入れましょう

(キャプチャでは写ってないですが、)右下に、オレンジ色の作成ボタンがあるので、
そのボタンをクリックすると作成できます!
上述の1.のキャプチャの通り、ホストゾーンの一覧に表示されます。 -
ちなみに、ホストゾーンだけを作成すると、最初に
NSとSOAのタイプのドメインが発行されます。

NSの4つのものは、ドメインを取得したサイト([freenom][1])で、ネームサーバーとして設定する -
[freenom][1]のネームサーバーに、
NSのタイプのドメイン4つを設定する。
※ネームサーバーは、そのドメイン(test-https-static-hosting.tk)に訪れた時に、ルーティング先のドメインを解決してくれるサーバーの役割を果たすやつ

AWS Certificate Managerで証明書を取得しましょう
「証明書のリクエスト」をクリック!!
-
Certificate Managerのトップページはこんな感じです。
証明書発行のリージョン設定は、バージニア北部(us-east-1)じゃないと、CloudFrontディストリビューション設定ができないので、注意が必要です。
※必ず、バージニア北部(us-east-1)指定してください。
※ちなみに、証明書を別リージョンに移すこともできません。

-
証明書のリクエストを開始します。
ドメイン名に、
test-https-static-hosting.tkと*.test-https-static-hosting.tk
の2種類を登録するといいでしょう〜。
S3の設定も必要ですが、
もしサイトにwww.test-https~みたいな形でアクセスしたい時には、
*のワイルドカードを使用しましょう。

次へ。 -
「検証方法の選択」ですが、DNSの検証の方が、公式でもオススメされているので、こちらを使います。
のちのち、ドメイン取得サイト([freenom][1])のネームサーバー設定の部分に、Route53で発行されるNS(NameServer)ドメインを登録します。

次へ。 -
Route53にいくと、自動でCNAMEが作成されていたああ!!(お見事)
※NSとSOAのタイプのレコードはホストゾーンを作成した時に自動で生成されるやつです。

AWS CloudFrontのディストリビューション設定をする
-
CloudFrontのディストリビューション設定ページはこんな感じです。

「Create Distribution」を押す。 -
とりあえず「
Get Started」で開始
説明事項が書かれている。
内容としては、こんな時にDistribution作ってね って言う説明が書かれている。

-
ディストリビューション作成ページに
Origin Domain Name:先ほど作ったS3バケットを選択。
※Origin IDは自動で入る。

今回は、HTTPS Onlyを選ぶ。(Redirect HTTP to HTTPSでもいいですね。)
基本はデフォルト設定のままでOK。


Distribution Settingsで、
Alternate Domain Names(Cnames)にドメイン名test-https-static-hosting.tkを記入する。
SSL CertificateでCustom SSL Certificateを選び、先ほどCertificate Managerで作った証明書を選択する。
※ドロップダウンに出てきます。

あとは、デフォルトのままの設定で「Create Distribution」を押す。
Default Root Objectにサイトのページトップであるindex.htmlを設定する。
(S3にアップロードしたindex.htmlを指している。)

-
CloudFront Distributionsの一覧に「In Progress」状態で作成される。
ちょっと経つと「Deployed」状態になり、準備完了になります。

Route53にCouldFrontのアドレスとAレコードで設定
-
CloudFrontで生成された「Domain Name」を使って、Route53にAレコードを作成します。
ホストゾーンの一覧をみるとお分かりかと思いますが、作成すると一覧の一番上みたいに、Aレコードが作られます。

-
「レコードを作成」を押す。
ルーティングポリシーはシンプルルーティング
レコード名は空白でOKです。
エイリアスをONにして
レコートタイプをA- Ipv4アドレスと一部の・・・を選択
トラフィックのルーティング先をS3ウェブサイトエンドポイントへのエイリアスを指定
リージョンを適切に指定 ※この例では、アジアパシフィック東京です。
S3の対象のバケットを指定。

S3のアクセスポリシーを修正する
-
パブリックアクセスのブロック(バケット設定)を編集する
新しいアクセスコントロールリスト(ACL)を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックするにチェック
任意のアクセスコントロールリスト(ACL)を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックするにチェック

-
バケットポリシーにJSONでポリシーを定義
下記のキャプチャのように、バケットポリシーをJSON形式で指定します。
意味としては、最新のポリシー言語のバージョン2012-10-17を使用して、記述しています。
ステートメントのIDは1。ID:XXXXXのCloudFrontがtest-https-static-hosting.tkのS3バケットに対して、Getを許可するよ。
ということです。
※ステートメントは複数記述することもあるので、識別子としてのIDがあります

-
Principalのcloudfront ~~ XXXXXのXXXXの部分に適切なIDを設定する。
そのIDは、Origin Access Identityの箇所に記載されています。

下記はJSONです。
# バケットポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-https-static-hosting.tk/*"
}
]
}
<解説>
| 要素 | 説明 |
|---|---|
| Version | 使用するポリシー言語のバージョンを指定。 ベストプラクティスとして、最新の 2012-10-17 バージョン使用 |
| Statement | ポリシーのメイン要素。複数のステートメントを含められる。 |
| Sid | 複数のステートメントを区別するためのステートメント ID |
| Effect | Allow または Deny を使用してポリシーで付与または拒否するアクセス許可を指定 |
| Principal | アクセス許可/拒否するアカウント、ユーザー、ロール、またはフェデレーティッドユーザーを指定 |
| Action | ポリシーで許可または拒否するアクション |
| Resource | アクションが適用されるリソース |
Ta-dah!!!!!(ジャジャーン!!!)
サイトが表示されました!!!!

いやあああ、頑張った甲斐がありました。
めちゃめちゃ勉強になったし、
「たかが静的サイト、されど静的サイト」
AWSのサービスを使い倒したような感覚です(`・ω・´)
ちなみに、こちらのjsを引用させていただきました。
参考ソース:Github
試しに、直接S3バケットのURLにアクセスしてみる
S3バケットのURLhaこんな感じですねえ
http://xxxxxxxxxxxx.s3-website-ap-region-1.amazonaws.com/

ちゃんとAccess Deniedが表示されましたー!!
つまり、CloudFront経由からじゃないとこのS3バケットにはアクセスできなくなったということですね
まとめ:ハマったポイント
- s3のバケット名は、ドメイン名に
- 通常は
www.example.comとexample.comの2つを用意したりして、wwwからリダイレクトさせるそうです。
- 通常は
- 「
パブリックバケットポリシーまたはアクセスポイントポリシーを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする」をオフにしないと、そもそもバケットポリシーを保存できなかった -
CloudFrontのDefaultRootObjectにindex.htmlと記載しないとaccess deniedで怒られる -
Alternate Domain Names (CNAMEs)に、test-https-static-hosting.tkを設定しないといけない。(名前解決) -
CloudFrontで証明書を使用する場合は、必ず「米国東部(バージニア北部)」リージョンで証明書を登録する - ドメイン取得は[freenom][1], DNSサーバーは
Route53という関係。つまり、[freeom][1]の**NameServer設定部分に登録する必要あり - 証明書が
検証保留中になり、あわてふためいたが、15分もすればに発行済になった。 -
ドメイン名の追加セクションに「
*.test-https-static-hosting.tk」と「test-https-static-hosting.tk」の2つを入れると便利 -
CNAMEには、頭にアンダースコア付きのものを入れないといけない(※route53ならボタン1つ)- 例)
Name: _8e9a64e3864xxxxxxxxxxxxxxxxxxxx.test-https-static-hosting.tk. - 例)
Value: _3e8628f11a5adxxxxxxxxxxxxxxxxxxxxx.jfrzftwwjs.acm-validations.aws
- 例)
-
証明書なしでCloudFrontディストリビューションを作ったときは、
SSL Certificateでcustomは選べなかったが、発行済になってからは、選択できるようになり、編集すると、再度in progressとなって、更新がかかる
以上、
ありがとうございました!!










