CloudFront + S3にて静的サイト公開
CloudFront+S3構成でhugoをホスティングする。構成は下記で。
リクエストは全てCloudFrontで受けるようにして、S3は公開せずCloudFront経由でしかアクセスできないようにする。
CloudFrontはただのCDNなのでリクエストにマッチするコンテンツがあれば返すが、無いと何も返さない。index.htmlまで指定しないといけないため、リクエストが/
で終わっているものは全て末尾にindex.html
を付けてるスクリプトをかませる。

やること
- S3バケット作成
- CloudFront設定
- アクセス確認
- index.htmlへリダイレクト設定
- 独自ドメインを設定
1. S3バケット作成
サイトのコンテンツを置くS3 bucketを作成する。
S3へのアクセスはCloudFrontからのみ許可するため、パブリックアクセスをすべてブロックする設定にて作成する。
2. CloudFront設定
オリジンドメインに作成したS3を指定。オリジンアクセスにOAC(Origin access control settings)を選択する
「コントロール設定を作成」をクリックしOACを作成する。
2.1 OAC作成
デフォルト設定から変更せずそのまま作成する
2.2 CloudFront作成
警告「S3バケットポリシーを更新する必要があります」が出るが、そのまま作成
2.3 S3 バケットポリシー変更
作成後画面上部にS3ポリシーを変更するようにpop upがでるので、ポリシーをコピーでポリシーをコピーする。
S3バケットポリシーは「アクセス許可」タブの「バケットポリシー」編集で変更できる。コピーした内容をそのままペーストする。

3. アクセス確認
作成したS3に適当なindex.htmlを設置し、ディストリビューションドメイン名
+ /inde.html
でアクセスしてみる。

hello world
が表示された!もちろんCloudFrontを通さずS3へ直接アクセスした場合は弾かれる。

4. index.htmlへリダイレクト設定
リクエストurlがhttps://aaa.com/
のように/
で終わる場合でもhttps://aaa.com/index.html
へリダイレクトさせる。
Lambdaを使う方法もあるがCloudFrontへのリクエストにJavascriptを噛ませれるCloudFront Functionsを使って実現する。
需要がありすぎて公式にコードごと設定が載っているため、まんま設定する。
4.1 関数作成
CloudFront関数を作成する。

4.2 関数の発行
コードは公式で公開されているものをコピペ。 公開しないと作成したCloudFrontディストリビューションに紐付けれないため公開する。

function handler(event) {
var request = event.request;
var uri = request.uri;
// Check whether the URI is missing a file name.
if (uri.endsWith('/')) {
request.uri += 'index.html';
}
// Check whether the URI is missing a file extension.
else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
4.3 関数の紐づけ
公開後、CloudFrontディストリビューションに紐付け設定メニューが下にでてくる。

4.4 接続確認
リクエストurlがhttps://aaa.com/
のように/
で終わる場合でもhttps://aaa.com/index.html
へリダイレクトさせることを確認する。
5. 独自ドメインを設定
AWS以外で取得したドメインをブログ(CloudFront)のドメインに設定する。
5.1 証明証発行
AWS Certificate Manager(ACM)にて証明証をリクエストする。
WHOIS情報はGMOペパボの代理公開としているため、Eメール検証は使用できない。検証方法としてDNS検証を選択し、払い出されたCNAMEをドメインに設定する。ドメインはムームードメインにて取得したため、そっちに設定する。
設定に癖がありサブドメイン
には払い出されたCNAME名、文字列羅列
.example.comの文字列羅列
部分のみを設定する。また、内容
にはCNAME値の末尾.
を除いた値を設定する。
5.2 代替ドメインを設定
設定するディストリビューションを選択し、編集をクリック。カスタムSSL証明証のプルダウンから先程作成した証明証を選択する。代替ドメイン名に設定したい独自ドメインを入力する。

ドメインを取得したムームードメインにCNAMEとしてCloudFrontのディストリビューションドメイン名を設定する。コレで独自ドメインにてアクセスすることができるようになった。
