CloudFront+S3で静的コンテンツ配信するパターンまとめと、そのまま使えるCloudFormationテンプレートスニペット

# はじめに
表題の件について調べる機会がありましたのでまとめました。
実はCloudFormationの練習が主な目的なので目新しい内容はありませんが、良かったらお付き合いください。

# パターン
* S3Originを使用するパターン
* S3静的ウェブサイトホスティングを使用するパターン

# Pros / Cons / 使いどころ例
## 共通
### Pros
* 独自ドメインでhttps接続できるようになる
* たぶん大概の場合利用料金が安くなる
* その他以下参照<br>
[CDP:Cache Distributionパターン - 利点](http://aws.clouddesignpattern.org/index.php/CDP:Cache_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#.E5.88.A9.E7.82.B9)

### Cons
* 以下参照<br>
[CDP:Cache Distributionパターン - 注意](http://aws.clouddesignpattern.org/index.php/CDP:Cache_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#.E6.B3.A8.E6.84.8F)

## S3Originを使用するパターン
### Pros
* OAIを用いて、S3へのアクセスをCloudFront経由に限定できる
 * 署名付きURL等を使ってアクセス制限できる
 * アクセスログをCloudFrontのログに集約できる
 * ログに限らずCloudFrontでできることはCloudFrontに任せられる

### Cons
* サブディレクトリ以下のIndexDocument設定ができない
 * ex.) 以下のようにフルパスで指定する必要がある
   * NG: `https://example.com/blog/`
   * OK: `https://example.com/blog/index.html`
* バージニアリージョン（us-east-1）以外のS3バケットをOriginに指定した場合、設定直後のアクセス状況によってはしばらく繋がらないことがある<br>
 **参考:** [Cloudfront,S3で307リダイレクトに苦しめられた - パパエンジニアのアウトプット帳](http://masaru-tech.hateblo.jp/entry/2018/03/27/111327)

### 使いどころ例
* SPA
* ペライチなウェブサイト
* 特定のユーザのみアクセス可能なコンテンツの配信
* etc.

## S3静的ウェブサイトホスティングを使用するパターン
### Pros
* サブディレクトリ以下のIndexDocumentを設定できる（S3の静的ウェブサイトホスティングにて設定）
 * `https://example.com/blog/` でもOKになる

### Cons
* S3バケットをパブリック公開する必要がある
 * バケットポリシーでUserAgentやOrigin Custom Headers等を用いて、制限している雰囲気にすることはできる
* CloudFront→S3間がhttpでの平文接続になる
 * GCS（Google Cloud Storage）はhttpsで静的ウェブサイト配信設定ができるようです。CloudFrontのOriginはS3である必要はないので、httpが嫌なだけであればS3の代わりにGCSを選択するのも手。<br>
**参考:** [静的ウェブサイトの例、トラブルシューティング、ヒント  \|  Cloud Storage ドキュメント  |  Google Cloud](https://cloud.google.com/storage/docs/static-website#https)

### 使いどころ例
* 階層のあるウェブサイト
* 平文でパブリック公開されても問題ないコンテンツの配信
* etc.

# CloudFormationテンプレートスニペット
Gistに書きました。
パラメータに使用するカスタムドメインとSSL証明書のARNを入力したら、あとはコピペでGO!<br>
※話を簡単にするため、ACMでのSSL証明書取得（またはインポート）およびカスタムドメインとCloudFront Distributionの紐付けは別途ご対応いただく前提となっております。

## S3Originを使用するパターン
[CloudFormation template snippet - CloudFront Distribution with a S3 Origin · GitHub](https://gist.github.com/j-un/3162b2a665ddac3237fde7e2bc3d7a2a)

## S3静的ウェブサイトホスティングを使用するパターン
[CloudFormation template snippet - CloudFront Distribution with a S3 Static Website Hosting · GitHub](https://gist.github.com/j-un/f3bc69f652ca546d28139215359b27c5)

# おわりに
有名な2パターンについて書きましたが、どちらがベストとは言いづらくケースバイケースで選択する必要がありますね。
AWSにこだわる必要がなければ、要件に応じて文中でも少し書いたGCPや、静的ホスティングに特化したNetlify等のサービスを検討してみてもよいかと思います。
それでは以上です。
CloudFormationの練習に付き合っていただきありがとうございました。

# 補足：本文で言及した以外の参考文献
* [CloudFormation で OAI を使った CloudFront + S3 の静的コンテンツ配信インフラを作る ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/s3-cloudfront-with-oai-by-cloudformation/)
* [オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)
* [カスタムヘッダーをオリジン (ウェブディストリビューションのみ) へ転送する - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html#forward-custom-headers-restrict-access)
* [今だから！Amazon CloudFront 徹底活用](https://www.slideshare.net/ar_maniacs/amazon-cloudfront-75300686)
* [AWS BlackBelt Online Seminar 2017 Amazon CloudFront + AWS Lambda@Edge](https://www.slideshare.net/AmazonWebServicesJapan/aws-blackbelt-online-seminar-2017-amazon-cloudfront-aws-lambdaedge)
* [CloudFront + S3 で静的サイトを運用する際の注意点 - Qiita](https://qiita.com/ooxif/items/d28b7caf72bf5290588c)
* [Amazon S3 + CloudFront で始める静的サイトホスティング | kuune.org](https://kuune.org/text/2016/05/12/static-website-hosting-using-aws-s3-and-cloudfront/)