Amazon S3とCloudFrontで静的サイトをホスティングしたい!

Posted on: 2023.4.21

このブログは、静的サイトジェネレーターのAstroをビルドすると出来上がる静的ファイルをS3にアップロード・ホストし、CloudFrontでキャッシュしつつ、ページの高速化を行なっています。

そこで、この記事では、実際にローカルで作成したHTMLファイルを、S3バケットにアップロードし、CloudFrontでキャッシュされるように設定していきたいと思います。

イメージ

構成図

実際この構成だけで、Webページを公開することはほぼないと思います。
HTTPでアクセスされるとHTTPSにリダイレクト(常時SSL化)したり、独自ドメインを割り当ててWebページを公開すると思います。 それらに関しては、また別記事でまとめます。

手順

  1. 静的ページのソースファイルを用意する。
  2. S3にバケットを作成し、ソースファイルをアップロードする。
  3. CloudFrontディストリビューションを作成し、オリジンをS3バケットに指定する。
  4. S3バケットポリシーを更新する。

1. 静的ページのソースファイルを用意する

# ファイル構成
.
├── index.html
├── css 
│   └── style.css
└── image
    └── sample.png

上記のようなディレクトリ構成で、ページを公開するとします。

2. S3にバケットを作成し、ソースファイルをアップロードする

2-1. バケットを作成する

AWS S3コンソール > バケットを作成 > 一般的な設定

⚠️注意点

ちなみに、ここで入力・選択したバケット名やリージョンは後から変更することはできません。
もし変更したくなった場合は、バケットを再作成する必要があることに注意してください!

"AWS S3コンソール > バケットを作成 > オブジェクト所有者"

"AWS S3コンソール > バケットを作成 > バケットのバージョニング"

"AWS S3コンソール > バケットを作成 > デフォルトの暗号化"

最後に「バケットを作成」ボタンを押し、下記のようなフラッシュメッセージが表示されるとバケット作成は完了です!

"AWS S3コンソール > バケットが正常に作成されました"

2-2. バケットに静的ファイルをアップロードする

1.で用意した静的ファイルをディレクトリごと、作成したバケットにアップロードします。

ちなみに、この時点ではまだWebページは公開されていません。 S3だけでページを公開したい場合は、バケットのプロパティから静的ホスティングを有効化する必要があります。

3. CloudFrontディストリビューションを作成し、オリジンをS3バケットに指定する

3-1. ディストリビューションを作成する

"AWS CloudFrontコンソール > オリジン"

"AWS CloudFrontコンソール > デフォルトのキャッシュビヘイビア"

"AWS CloudFrontコンソール > 関数の関連付け"

"AWS CloudFrontコンソール > 設定"

最後に「ディストリビューションを作成」ボタンを押し、下記のようなフラッシュメッセージが表示されるとバケット作成は完了です!

"AWS CloudFrontコンソール > 新しいディストリビューションが正常に作成されました。"

3-2. ディストリビューションのドメインにアクセスしてみる

ちなみに、この時点でディストリビューションのドメインにアクセスするとAccesss Deniedの画面が表示されます。
これは、オリジンのS3バケットがCloudFrontディストリビューションからのアクセスを拒否しているためです。

CloudFrontディストリビューションの作成が完了したことをお知らせするフラッシュメッセージが表示されたかと思いますが、
そのフラッシュメッセージの下に「S3バケットポリシーを更新する必要があります」という別のアラートが出ているかと思います。

ということで、最後に今回作成したCloudFrontディストリビューションからオリジンのS3バケットにオブジェクトを取得できるように、S3バケットのポリシーを更新したいと思います。

4. S3バケットポリシーを更新する

"AWS CloudFrontコンソール > S3バケットポリシーを更新する必要があります。"

「ポリシーをコピー」ボタンを押下すると、ポリシーの中身をクリップボードにコピーしてくれます。

コピーしたら「S3バケットの権限に移動してポリシーを更新する」のリンクを押下し、オリジンであるS3バケットのコンソール画面に遷移します。

4-1. バケットポリシーを編集して保存する

"AWS CloudFrontコンソール > バケットポリシー"

"AWS CloudFrontコンソール > バケットポリシーを編集"

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::${S3バケット名}/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::${AWSアカウント}:distribution/${CloudFrontディストリビューションID}"
        }
      }
    }
  ]
}

4-2. もう一度、ディストリビューションのドメインにアクセスしてみる

今度は、ちゃんとindex.htmlのページが表示されます!
もし表示されない場合は、数秒〜数分ほど経ってから再度アクセスしてみてください!

おわり

以上、S3+CloudFrontで静的サイトをホスティングする方法をご紹介しました!
ただ、これだけではあまり実用的ではありません。
次回は、HTTPSのみアクセスできるようにしたり(SSL化)、独自ドメインでアクセスする方法をご紹介したいと思います。

ご指摘あればTwitterからお願いします!