Open3
S3 + CloudFront + カスタムドメインで静的サイトをホスティングする
S3での静的サイトホスティング
バケットの作成
- カスタムドメインの利用を見越した名前をつける
- オプションはすべてデフォルト
- パブリックアクセス設定→パブリックアクセスをすべてブロック
- バケットのバージョニング→無効にする
- デフォルトの暗号化→無効にする
- 詳細設定→オブジェクトをロック→無効にする
コンテンツをアップロード
- サンプルは 無料ホームページテンプレート Template Party のものを利用
- まるっとバケットにアップロードする
静的サイトホスティングを有効にする
- バケット詳細→「プロパティ」タブ→静的ウェブサイトホスティング→「編集」
- 静的ウェブサイトホスティング→有効にする
- オプション設定
- ホスティングタイプ→「静的ウェブサイトをホストする」
- インデックスドキュメント→
index.html
パブリックアクセスを許可
- バケット詳細→「アクセス許可」タブ→ブロックパブリックアクセス→「編集」
- 「パブリックアクセスをすべてブロック」のチェックを外す
- 下位項目のチェックがすべて外れてるのを確認
- 「変更の保存」
- 内容がインターネットに公開されるのだよ、の警告を確認
バケットポリシーを編集
- バケット詳細→「アクセス許可」タブ→バケットポリシー→「編集」
- 公式サンプルをコピーして貼り付け
-
Bucket-name
をこのバケットの名前に修正
- 「変更の保存」
パブリックアクセスを確認
- バケット詳細→「プロパティ」タブ→静的ウェブサイトホスティング
- 「バケットウェブサイトエンドポイント」のURLにブラウザでアクセスして表示を確認
GoogleDomainsからRoute53へネームサーバを移管
義務感で取った kwappa.dev
が未使用なので流用する。どうせならRoute53で使いたい。
- 作業はほぼまるっと以下
Route53側の作業
- パブリックホストゾーンを作成
- Route53→「ホストゾーンの作成」
- S3のエンドポイントをエイリアスレコードとして登録
- Route 53 に登録されたカスタムドメインを使用した静的ウェブサイトの設定 - Amazon Simple Storage Service
- ホストゾーンの詳細→「レコードを作成」→「ウィザードに切り替える」
- 「シンプルルーティング」を選択→「次へ」→「シンプルなレコードを定義」
- レコードタイプ→「A」
- 値/トラフィックのルーティング先
- エンドポイントを選択→「S3 ウェブサイトエンドポイントへのエイリアス」
- リージョンを選択→バケットのあるリージョン(今回は
ap-northeast-1
) - S3 エンドポイントを入力→サジェストされるので選択
- ターゲットのヘルスを評価→「いいえ」
- 次の画面でも「レコードを作成」ボタンを押し忘れないように
Google Domains側の作業
- Google Domainsにログイン→マイドメイン→対象ドメイン→「DNS」→「カスタム ネームサーバー」
- Route53のホストゾーンにあるNSレコードをネームサーバーとして追加
- 「これらのネームサーバーに切り替える」をクリックしてカスタムネームサーバーを有効にする
ブラウザでアクセスできない罠
以上で kwappa.dev
をバケットウェブサイトエンドポイントに向ける作業は完了だが、このままではブラウザで kwappa.dev
を表示することはできない。 .dev
ドメインはHTTPS接続を強制する HSTSという仕組みのプリロード対象なので、対応ブラウザ(少なくともmacOS版 Chrome 92.0.4515.131, Safari 14.1.2)では http://
でのアクセスを https://
にリダイレクトしてしまう。ここでの動作確認は curl
で済ませておく。
% curl kwappa.dev | head -n 10
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10266 100 10266 0 0 40577 0 --:--:-- --:--:-- --:--:-- 40577
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>企業・ビジネスサイト向け 無料ホームページテンプレート tp_biz55</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="ここにサイト説明を入れます">
<meta name="keywords" content="キーワード1,キーワード2,キーワード3,キーワード4,キーワード5">
<link rel="stylesheet" href="css/style.css">
CloudFrontを建てる
HTTPS
で通信させるためにはS3の手前にCloudFrontを建てるのが一番ラクなので準備する。
CloudFront ウェブディストリビューションを作成
- CloudFront→「Create a CloudFront Distribution」
- 「Origin Domain」→S3のプロパティから「バケットウェブサイトエンドポイント」をコピー&ペースト→
http://
を削除- ドメインの即値を指定してカスタムオリジンにする
- ドメインの即値を指定してカスタムオリジンにする
- 「Viewer」→「Viewer protocol policy」→「Redirect HTTP to HTTPS」
-
.dev
以外でもHTTPSを強制したいので
-
- 「Origin Domain」→S3のプロパティから「バケットウェブサイトエンドポイント」をコピー&ペースト→
ACMで証明書を作る
- 「Settings」→「Custom SSL certificate」→「Request certificate」
- 別タブが開くので証明書を作成
- 手順はまるっとこちら
- 「ドメイン名の追加」→ 利用するドメインを入力(
kwappa.dev
) - 「検証法補の選択」→DNSの検証
- 「Route 53でのレコードの作成」をクリック→CNAMEレコードを作成
- しばし待つ→証明書が「発行済み」になるのを待つ
- 「ドメイン名の追加」→ 利用するドメインを入力(
- 手順はまるっとこちら
ディストリビューションに設定
- CloudFrontタブに戻る
- 独自ドメインの設定
- 「Settings」→「Alternate domain name (CNAME)」
- 利用するドメインを設定(
kwappa.dev
)
- 証明書の設定
- 「Settings」→「Custom SSL certificate」→リロードボタンを押す
- 今作った証明書がACM certificatesのリストに出るはずなので選択
- 独自ドメインの設定
- ディストリビューションの作成
- 一番下「Create Distribution」
- Distributionの詳細でLast modifiedが「Deploying」→日時に変わるまで待つ
DNSの変更
- CloudFront→さっき作ったディストリビューション→「Distribution domain name」をコピーしておく
- Route53→前回作ったホストゾーン→Aレコードを「編集」
- 「トラフィックのルーティング先」→「CloudFront ディストリビューションへのエイリアス」
- さっきコピーしたDistribution domain nameをペースト(
https://
は削除する) - 「保存」
キマシタワァ
サブディレクトリのデフォルトルートオブジェクト
- CloudFrontディストリビューションの「Default root object」に
index.html
を指定しておくと、https://kwappa.dev/
にアクセスしたときindex.html
を表示してくれる - しかし
https://kwappa.dev/subdir/
のようなサブディレクトリには適用してくれない-
403 Forbidden
が返る
-
- サブディレクトリにもデフォルトルートオブジェクトを適用させるにはいくつか方法がある
- S3の静的ウェブサイトホスティングを有効にしておく
- メリット
- 簡単
- デメリット
- S3のバケットウェブサイトエンドポイントを直接叩いてもコンテンツが閲覧できてしまう
- メリット
- Lambda@Edgeでリクエストパスを書き換える
- できた!S3 オリジンへの直接アクセス制限と、インデックスドキュメント機能を共存させる方法 | DevelopersIO
- メリット
- S3直接のアクセスを制限できる
- デメリット
- ちょっと面倒、オーバーキル
- S3の静的ウェブサイトホスティングを有効にしておく
今回はS3直接アクセスでも特に困らないので静的ウェブサイトホスティングで済ませる。