【AWS完全に理解したへの道】 CloudFront 基本編

# 【AWS完全に理解したへの道】 CloudFront 基本編
<img width="471" alt="スクリーンショット 2020-01-18 17.24.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70486/93268369-6520-f1b2-d388-47a335f93260.png">


##### AWS過去記事
[IAM 基本編](https://qiita.com/y-u/items/cef40fd249947687810e)
[VPC 基本編](https://qiita.com/y-u/items/40fa729d54ebab52fcb3)
[S3 基本編](https://qiita.com/y-u/items/9517ab2570a4e823fbb8)
[データベース(RDS/ElastiCache/DynamoDB)基本編](https://qiita.com/y-u/items/0d4a9e4ec6844b16b65c)
[EC2 基本編](https://qiita.com/y-u/items/cafed0ab33b3572aa71d)
[ELB 基本編](https://qiita.com/y-u/items/4fb2c65510b018fb9eb0)

# CloudFront
* CDNサービス(Contents Delivery Network)
* 元となるコンテンツを保持するバックエンドサーバ(ELB, EC2, S3, オンプレ)が必要。

# CludFrontは何を解決する？
1. レスポンスの遅延、不安定なレスポンス
2. 大量アクセスへの対応

# CDNの利点
* 地理的に近い場所に配置されているサーバからコンテンツ(動画や画像、HTMLページなど)を取得することで配信を高速化する
* オリジンのサーバサイドとコンテンツ配信をするサーバを分離することでオリジンのサーバの負荷を下げる

![スクリーンショット 2020-01-18 18.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70486/3d9ecdd5-384b-32db-5345-d1adf38b4ea5.png)


[AWS Black Belt Online Seminar Amazon CloudFrontの概要より画像引用](https://d1.awsstatic.com/webinars/jp/pdf/services/20190730_AWS-BlackBelt_Amazon_CloudFront.pdf)
## ディストリビューション
* ダウンロードディストリビューション
プロトコル：HTTPS, HTTP

* ストリーミングディストリビューション
プロトコル：Real-Time Messaging Protocol

## キャッシュルール
* 拡張子やURLパス毎にキャッシュ期間を指定可能

## CloudFrontコンテンツ配信設定の流れ
1. Amazon S3バケット、ALB、EC3、オンプレにある独自のHTTPサーバなどのオリジンサーバを設定
2. ファイルをオリジンサーバにアップロード
3. CloudFrontディストリビューションを作成
4. CloudFrontがドメイン名を割り当て
5. ディストリビューションの構成を全てのエッジロケーションに送信

## CloudFrontエッジでのgzip圧縮機能
gzip圧縮する事でより高速にコンテンツを配信
S3はgzip圧縮をサポートとしないので、こちらを利用する事でコンテンツ配信がより高速になる

## キャッシュコントロール
キャッシュヒット率を向上させる事がCDN導入におけるポイントとなる
#### 特徴
* GET/HEAD/OPTIONのリクエストが対象
* URLパス毎にキャッシュ期間指定が可能
* フォワードオプション機能による動的ページ配信(Header/Cookie/Query Stringを考慮したページ配信が可能)
* 単一ファイルサイズのキャッシングはMAX 20GBまで

**URL及び有効化したフォワードオプション機能のパラメタ値の完全一致でキャッシュが再利用される**

## キャッシュファイルの無効化
* コンテンツ毎の無効化パス指定可能(同時にMAX3,000個まで)
* ワイルドカードを利用した無効化パス指定可能(同時にMAX15個まで)
* オブジェクト数の制限はなし

**AWS Management Console or APIで実行可能**

#### 動的コンテンツ機能のキャッシュ動作
##### ヘッダーをオリジンへ転送
* CloudFront 独自ヘッダー
CloudFront側でクライアントの情報を独自に判定し、オリジンにフォワード
**全てのヘッダーをフォワードするとキャッシュ効率が大幅に低下するため必要最小限のヘッダー指定することを推奨**

|Type|Header|説明|
|---|---|---|
|接続プロトコル判定|CroudFront-Forwarded-Proto|HTTP or HTTPSを設定|
|デバイス判定|CloudFront-Is-Mobile-Viewer<br>CloudFront-Is-Tablet-Viewer<br>CloudFront-Is-Desktop-Viewer|User-Agentをもとに、クライアントデバイスの情報をTrue/Falseで設定
|地域判定|CloudFront-Is-Viewer-Country|クライアントのIPアドレスをもとに、地域コードを設定<br>(ISO-3166-1 alpha-2準拠)

## オリジンフェイルオーバー
**CloudFrontオリジンフェイルオーバーによる高可用性**

* HTTPステータス 500, 502, 503等のHTTPステータスコードを返した場合や接続タイムアウトした場合にバックアップオリジンにルーティングする機能
* Lambda@Edge関数やカスタムエラーページでもオリジンフェイルオーバー可能

## データ保護機能
### HTTPS対応(強制リダイレクト/HTTPSのみ許可)
#### SSL証明書
##### デフォルト証明書
cloudfront.netドメインのSSL証明書は標準で利用可能
##### 独自SSL証明書
X.509PEM形式かつ認証チェーンが含まれること、鍵長はMAX2048bit
様々な証明書タイプをサポート(Domain Validated, Extend Validatedなど)
ACM(AWS Certification Manager)で発行された証明書
##### SNI(Server Name Indication)SSL証明書
CloudFrontの専用IPアドレス費用を負担せず、独自ドメインでのSSL通信が可能
##### 専用IPアドレスSSL証明書
専用IPアドレス使用時はCloudFrontにて別途利用課金される

## ビューワー接続SSLセキュリティポリシー
クライアントとCloudFront間の事前定義されたSSL/TlSプロトコルとCipherの組み合わせをサポート
(TLSv1.2_2018, TLSv1.1_2016(推奨), TLSv1_2016, TLSv1から選択可能)

## 地域制限(GEO Restrictions)
* 接続されるクライアントの地域情報を元に、エッジでアクセス判定する
* Blacklist or Whitelistにより指定可能
* ディストリビューション全体に対して適用される
* 制限されたアクセスには403を返す

## 署名付きURL/Cookie
1. Restricted Viewer Accessを有効にするだけで、署名のないアクセスを全てブロック
<img width="911" alt="スクリーンショット 2020-02-01 9.15.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70486/8d9aba97-d708-54ed-871c-150c221561b7.png">

## フィールドレベル暗号化を使用した機密データの保護
POSTリクエストの特定データフィールドを特定のアプリケーションのみアクセスできるように保護する
(公開鍵暗号方式により実現)
**eg. 個人情報などの機密データに特定のアプリケーションのみからアクセスできるようにする**

##### 設定方法

1. RSAキーペアを取得
2. パブリックキーをCloudFrontに追加
3. フィールドレベル暗号化のプロファイルを作成
4. 暗号化を行うリクエストのコンテンツタイプを指定する設定を作成
5. キャッシュ動作に設定を追加
6. オリジンでデータフィールドを復号化

AWS Encryption SDKを使用し実装する。
また、C, Java, Python, JavaScript CLIも使用可能。

## 参考
[[AWS Black Belt Online Seminar] Amazon CloudFrontの概要](https://d1.awsstatic.com/webinars/jp/pdf/services/20190730_AWS-BlackBelt_Amazon_CloudFront.pdf)