#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
となって、更新がかかる
以上、
ありがとうございました!!