CloudFront + S3で静的Webサイトを配信

目次

CloudFront と S3 で静的コンテンツを配信するメモです。

静的コンテンツとは、
だれが見ても同じように表示されるコンテンツやWebページのことを指したりします。

動的コンテンツとはその逆で、ユーザーによって見せる情報が違ってくるコンテンツです。(例えばユーザーの登録情報とか)

クラウドでは、このようなコンテンツを分けて配信することで
コスト削減やパフォーマンス向上、さらに可用性を高められるので重要視されます。

今回やるのは、CloudFront と S3 を使って静的コンテンツを配信するよくある方法です。

CloudFrontとS3で静的コンテンツを配信する概要

全体像

S3 を準備

バケットを作成

以下のように入力して「バケットを作成」します。
任意で入力する箇所は適宜読み替えてください。

バケットを作成1
バケットを作成2
バケットを作成3
バケット名任意で入力
AWSリージョンアジアパシフィック(東京) ap-northeast-1
オブジェクト所有者ACL無効(推奨)
パブリックアクセスをすべてブロックチェックを外す
デフォルトの暗号化有効にする、SSE-S3
その他デフォルト設定のまま

パブリックアクセスをブロックすると、バケットポリシーの変更などのこの後の作業ができないので注意です。

バケットポリシーを修正

バケットポリシーとは、このバケットを見ていい人、ファイルをアップロード・削除していい人など決めるためのバケットに対する操作権限の設定です。

作成したバケットを開き、アクセス許可タブのバケットポリシーを以下のように編集して保存します。
Resourceは、作成したバケットARNに合わせて置き換えてください。

バケットポリシー編集
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Principal": "*",
			"Effect": "Allow",
			"Action": "s3:GetObject",
			"Resource": "【バケットARN】/*"
		}
	]
}

HTMLファイルを配置

index.htmlとerror.htmlを作成してバケット直下にアップロードします。

htmlファイルアップロード

ファイルの中身は以下のようにしました。

index.html

error.html

静的ホスティングを有効化

バケットポリシーを修正したら、
プロパティタブに移動して一番下までスクロールし、静的ウェブサイトホスティングを編集します。

以下のように入力して「変更の保存」をします。

静的ウェブサイトホスティング有効にする
ホスティングタイプ静的ウェブサイトをホストする
インデックスドキュメントindex.html
エラードキュメント - オプションerror.html

静的 ウェブサイトの動作確認

再びプロパティタブの一番下までスクロールし、静的ウェブサイトホスティングのバケットウェブサイトエンドポイントをブラウザで開いてみましょう。

静的ウェブホスティング

以下のようになったら成功です。
バケットウェブサイトエンドポイントへHTTP接続によって、ウェブサイトにアクセスできました!

動作確認1

静的 ウェブサイトのドメインをメモ

静的ウェブサイトの動作確認ができたら
そのドメイン(http://を除いたもの)をメモしておきます。
これをCloudFront作成の時にオリジンドメインとして設定します。

CloudFront を準備

ディストリビューションの作成

以下のように入力して「ディストリビューションを作成」する。
オリジンドメインはプルダウンから選択せず、先ほどメモしたドメインを入力します。

オリジンドメインさっきメモしたドメイン
名前自動で入力されるので触らない
ビューワー/
ビューワープロトコルポリシー
HTTPS only
キャッシュキーと
オリジンリクエスト
Cache policy and origin request policy (recommended)
CachingDisabled
その他の項目デフォルトのまま

CachingDisabledにしてキャッシュを無効にしているのは、開発中の変更がすぐに反映されるようにするためです。
通常は CachingOptimized とかで適切なキャッシュ期間を設定します。

ディストリビューションのデプロイ完了まで待つ

CloudFrontのデプロイが完了するまで数分くらいかかるので待ちます。
以下のようにディストリビューション一覧でデプロイが日付になっていたら完了です。

作成直後
デプロイ完了

動作確認

CloudFront にアクセス

作成したCloudFrontの一般タブに移動し、詳細のディストリビューションドメイン名をブラウザで開いでみましょう。
S3の静的ウェブサイトと同じように表示されたら成功です!
HTTPS接続によって、安全な接続で静的ウェブサイトにアクセスできました!

動作確認2

index.htmlを削除すると...?

S3バケットのindex.htmlを削除してみましょう。
すると以下のようにエラーページが表示されます。

動作確認3

S3の静的ウェブサイトホスティングを有効にした際、オプションであったエラーページも設定したからです。

万が一、ウェブサイトでエラーが発生した場合でも、エラーページを設定しておけば、このように表示することができます。

終わりに

次のアクションはアクセス制限をすることです。

今のままでは、S3のバケットウェブサイトエンドポイントからアクセスできてしまいます。
これによるデメリットは

などでしょう。それに
せっかく、CloudFrontからHTTPSアクセスできるようにして安全な接続経路を作ったのだから、入口はこれ1つにしちゃいたいですね。
その方法として、カスタムヘッダー(Referer)を使う方法があります。

注意点として、Refererヘッダーで不正アクセス対策をするのは不十分だということです。
セキュリティとしては他の対策も導入したうえで、併用するのが良さそうです。

とはいえ、ウェブサイトへの入口を1つにする方法としてある程度は有効なのかなと思ってますので
次回はカスタムヘッダーで制限された静的ウェブサイトを構成してみようと思います。

次回のお話し【S3+CloudFront】カスタムヘッダーで制限された静的ウェブサイトを構成して入口をひとつにする