S3+CloudFrontで静的サイトを配信する|OACでS3への直接アクセスを防ぐ
HTML・画像・JavaScript だけで動く静的サイトなら、サーバーを立てる必要はありません。S3 にファイルを置き、CloudFront で配信するのが AWS の定番です。ポイントは、S3 バケットは非公開のまま、CloudFront からだけ読めるようにすることです。
なぜ CloudFront を挟むのか
- 速い:世界中のエッジロケーションにキャッシュされ、ユーザーの近くから配信される
- HTTPS と独自ドメイン:ACM の証明書で HTTPS 配信できる
- 安全:S3 を公開せずに済み、WAF で攻撃も防げる
- 安い:S3 から直接配信するより、データ転送コストを抑えられる場合が多い
OAC(オリジンアクセスコントロール)とは
OAC は「CloudFront だけが S3 のオブジェクトを読める」ようにする仕組みです。設定は次の2つです。
- CloudFront のオリジンに OAC を設定する(CloudFront が署名付きで S3 にアクセスする)
- S3 のバケットポリシーで、
cloudfront.amazonaws.comからのアクセスを、そのディストリビューションに限定して許可する(条件キーAWS:SourceArn)
これで S3 の「パブリックアクセスをすべてブロック」を有効にしたまま配信できます。サンドボックスで CloudFront → S3 の矢印を引いて CloudFormation に書き出すと、OAC とバケットポリシーの組み合わせがそのまま生成されます。
| OAC(推奨) | OAI(従来方式) | |
|---|---|---|
| 位置づけ | 現在の推奨方式 | レガシー |
| SSE-KMS で暗号化したオブジェクト | 対応 | 非対応 |
| PUT などの書き込み | 対応 | 制限あり |
よくあるひっかけ:S3 の「静的ウェブサイトホスティング」のエンドポイントをオリジンにすると、OAC は使えません(カスタムオリジン扱いになるため)。非公開のまま配信したいなら、REST API のエンドポイント(通常のバケットドメイン)を OAC 付きでオリジンにします。
知っておきたい関連知識
- 証明書のリージョン:CloudFront で使う ACM 証明書はバージニア北部(us-east-1)で発行する
- 署名付きURL / 署名付きCookie:有料会員だけに動画を見せる、など閲覧者を限定したいときに使う。1ファイルなら署名付きURL、複数ファイルなら署名付きCookieが便利
- キャッシュの削除:ファイルを更新したら無効化(Invalidation)を実行するか、ファイル名にバージョンを付ける
- 地域制限:特定の国からのアクセスを拒否できる(地理的制限)
理解度チェック:S3 のURLを直接知っている人が、CloudFront を経由せずにファイルを取得できてしまう。どう直す?
OAC を設定し、バケットポリシーで CloudFront(該当ディストリビューション)からのアクセスだけを許可する。あわせてブロックパブリックアクセスを有効にします。
まとめ
- 静的サイトは S3 + CloudFront、S3 は非公開のまま
- CloudFront からだけ読ませるには OAC + バケットポリシー
- CloudFront 用の証明書は us-east-1