S3配信に独自ドメイン設定
July 29, 2020
お名前.comで取得した独自ドメインでS3コンテンツを配信する。
構成 #
[Client] -(1.DNS問合せ)-> [お名前.com] -(移譲)-> [Route 53]
| ^ |
| | |
| `-----------(2.CloudFrontのIPアドレス)----------'
|
`-(3.Request)-> [CloutFront] -(Request)-> [S3]
前提 #
- 配信したい S3 の Bucket 設定が完了している
Route 53 で新規に Hosted zone を作成 #
Route 53 > Hosted zones を開き Create hosted zone
押下。
Domain name
に取得したドメインを入力。 Type
は Public hosted zone
を選択して Create hosted zone
押下。
詳細が表示されるので、 Name servers
の4レコードをチェック。これをお名前.com側の設定に入力する(任意のネームサーバーとして入力することでDNS名前解決が移譲されるということ)。
ACM で HTTPS 用の証明書作成 #
CloudFront Distribution の作成ページから遷移して作成できるので
CloudFront > Distributions を開き Create Distribution
押下。
CloudFront で配信する証明書はバージニアリージョンの ACM で発行する必要がある。 CloudFront Distribution 作成画面からだとリージョン切り替えて遷移してくれる。
画面中程に SSL Certificate
セクションがあるので Request or Import a Certificate with ACM
押下。
Domain name
に *.codeemall.info
のようにサブドメイン部分にアスタリスクを入力。こうするとワイルドカード証明書が発行できる。
作成した直後は Validation status
が Pending validation
となり保留中となっている。これは DNS の所有をチェックするためのプロセスで、記載の CNAME レコードをドメインに追加することで通過する。今回のドメインは Route 53 に登録済みなので、 Create record in Route 53
押下することで AWS 側で良しなにやってくれる。押下。
しばらくすると Status が Issued
となる。これで証明書の作成は完了。
CloudFront Distribution を作成 #
改めて CloudFront > Distributions を開き Create Distribution
押下。
Origin Domain Name
を選択すると S3 Bucket が選択可能なのでそれを選択。
Viewer Protocol Policy
で HTTP から HTTPS のリダイレクト設定を入れる。あと Cache Policy
でキャッシュをしないポリシーを選択。
Alternate Domain Names
に配信したいサブドメインを入力。 SSL Certificate
を Custom SSL Certificate
選択して先ほど作成した証明書を指定。
作成すると Distribution のデプロイが行われるので Status
が Deployed
になれば完了。 Domain Name
が CloudFront の DNS なのでこれをブラウザで開いて確認できる。
サブドメインを Route 53 に登録 #
Route 53 > Hosted zones > 作成した Hosted zone を選択。 Create record
を押下し、 www.codeemall.info
に対する CloudFront へのルーティングを登録する。
Routing policy
は Simple routing
で。
Recode name
が www.codeemall.info
となるように入力。 Value/Route traffic to
に CloudFront のリソースを選択すればいいが、何故かバージニアリージョンしか選択できず、リソース名のサジェストもヒットしない。とりあえず先ほど作成した CloudFront の DNS を入力すればよい。
これで作成完了したので念の為 nslookup
しておく。
$ nslookup www.codeemall.info
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: www.codeemall.info
Address: 13.249.171.66
Name: www.codeemall.info
Address: 13.249.171.115
Name: www.codeemall.info
Address: 13.249.171.13
Name: www.codeemall.info
Address: 13.249.171.36
CloudFront と同じ IP アドレスが引けている。大丈夫っぽい。以下 URL にブラウザからアクセスして無事 Web ページが閲覧できました。
https://www.codeemall.info/index.html
index.html 見えない問題 #
URL に明示的に index.html
を書かないとページがうまく参照できない。これは CloudFront の設定で Default Root Object
を設定することでルートアクセス (e.g. https://www.codeemall.info/ ) のみは解決できるが、ルート以外のフォルダパスだと解決できない(なお S3 の Static website hosting 単体だと解決できている)。
解決策としては CloudFront の Origins
で Origin Domain Name and Path
に S3 の Static website hosting の DNS を指定するという方法がある。
ただしこの方法だと「S3 へのアクセスを CloudFront のみに制限する」ということができない(Static website hosting が有効のままなので)。
- アクセス範囲的に今回の Bucket は許容する
- フォルダアクセスとなるリンクは生成しない(これは Site Generator をなんとかする話)
上記あたりを踏まえて設定を考えたい。