Amazon CloudFrontのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Amazon CloudFrontの概要](https://www.slideshare.net/AmazonWebServicesJapan/20190730-aws-black-belt-online-seminar-amazon-cloudfront)」の自分向けメモ
CloudFront知ってるけど使ったことない......レベルの人向け


## AWSのエッジサービス
 - エッジサービスとはエッジロケーションから提供されるサービス群のこと
 - ユーザーにより近い場所から提供
 - リージョンとは別に176か所にある
 - オリジンサーバーへのコンテンツ取得を軽減できる
 - エッジロケーションも冗長化されている

### 一般的なWebアクセスの課題
#### レスポンスの遅延、不安定なレスポンス
 - ネットワーク遅延は距離に依存
 - 応答時間の多くがネットワーク転送の待ち時間を占める場合もある

#### 大量アクセスへの対応
 - 大量のアクセスをさばくために、不要なトラフィックをオリジンに到達させない仕組みが必要
 - Webコンテンツには静的なデータが多く含まれる
 - 同じデータを何度も取得するのはネットワーク帯域、サーバーリソースの無駄な消費



## 概要
### 特徴
 - 高性能な分散配信
 - 高パフォーマンス
 - 自動でスケーラブル
 - セキュリティ
 - 容易に即時利用可能
 - 充実したレポート
 - 従量課金

### CDN
 - エッジからコンテンツをキャッシュしたり代理配信するサービス
 - バックエンドはそのまま利用可能
 - エッジからオリジンへのアクセスはHTTPSだが、インターネット経由
 - gzipで圧縮して配信可能
 - キャッシュコントロール機能あり
 - TTL指定可能

#### エッジロケーションの割り当て
 - DNSを応用した仕組みを利用
 - DNSの問い合わせ先にCloudFront DNSがあり、最適なIPを返却している

### リージョナルエッジキャッシュ
 - エッジが増えるとオリジンの負荷が上がる課題があった
 - リージョナルエッジキャッシュを挟むことで、オリジンの負荷が下がる
 - 他CDNサービスより負荷が下がった実績がある

## 高速配信機能
### 配信の流れ
 1. S3等をオリジンサーバーに設定
 1. ファイルアップロード
 1. ディストリビューション作成
 2. ドメイン名割り当て
 3. ディストリビューションの構成を全てのエッジロケーションに送信

#### ディストリビューション
 - ドメイン毎に割り当てられるCloudFrontの設定
 - ディストリビューションあたりの使用量が決まっている
 - デフォルトでは「xxxx.cloudfront.net」がディストリビューションのドメイン名として割り当てられる

### 動的コンテンツキャッシュ
 - オリジンサーバーに対してHeader、Cookie、クエリ文字列情報をフォワードできる
 - Cookie、クエリ文字列をオリジンへ転送

### きめ細やかなキャッシング
 - キャッシュ動作（Behaviors）を活用したマルチオリジン（オリジンを分ける）

### カスタムエラーページ
 - エラー時にS3から静的エラーページのコンテンツを返す

### タイムアウトの設定可能
#### オリジン読み取りタイムアウト
 - CloudFrontがカスタムオリジンからの応答を待つ時間を指定

#### キープアライブタイムアウト
 - 接続を閉じる前にCloudFrontがカスタムオリジンとの持続的接続を維持する最大時間を指定

### オリジンフェイルオーバー
 - オリジングループを作成、プライマリ、セカンダリを設定
 - 設定したエラーコードになった場合、バックアップオリジンにルーティング

## データ保護機能
### SSL証明書
 - cloudfront.netドメインのSSL証明書は標準で利用可能
 - ACMも可能
 - 独自SSL証明書も可能（ACMにアップロード）

### エッジとオリジン間の暗号化
 - カスタムオリジンはHTTP、HTTPS、クライアントの通信プロトコルに合わせるを指定可能
 - S3はHTTPのみ指定可能

### オリジンカスタムヘッダー
 - エッジからオリジンへの通信時にHTTPヘッダーを追加可能
 - オリジン毎に固定で追加、または上書きが可能

### 地域制限
 - 接続されるクライアントの地域情報を基に、エッジでアクセス判定
 - ブラックリストもしくはホワイトリストで指定可能
 - 制限されたアクセスには403を返却

### 署名付きURL/Cookie
 - 認証サイトで署名付きCookieを取得してからアクセス
 - 署名がないアクセスはブロック

### データフィールドの暗号化
 - 公開鍵で暗号化、オリジンの機能の中で復号化
 - 個人情報を暗号化、特定の機能でしか復号できないようにする

### オリジンサーバーの保護
#### S3
 - Origin Access Identity（OAI）を利用
    - S3バケットへのアクセスをCloudFrontのみ制限

#### カスタムオリジン
 - CloudFrontで指定された任意のヘッダーをオリジンでチェック
 - CloudFrontが利用するIPアドレスのみ許可する

### AWS WAF連携
 - ディストリビューションに適用

### AWS ShieldによるDDOS攻撃
 - デフォルトで有効
 - 無料で利用可能

## レポーティング
傾向分析やリアルタイム監視が可能

### Cache Statistics
 - I/Oの量やステータスコードをモニタリング

### Monitorign / Alarms
 - メトリクスはバージニア北部リージョンに出力される
 - しきい値とアラートの設定可能

### Popular Objects
 - リクエスト数の多い上位50のコンテンツが一覧で見られる

### Top Referrers
 - ディストリビューション毎にリクエスト数の多い上位25の李ファラードメインが一覧で見られる

### Usage
 - ディストリビューション、アクセス元リージョン毎にリクエスト数が見られる
    - エッジ、オリジン間のデータ転送容量が見られる
 
### Viewers
 - ディストリビューション毎のクライアントデバイス情報
    - デバイス種別の比率
    - ブラウザ種別の比率
    - OS種別の比率
    - ロケーション毎の比率

### CloudFrontアクセスログ
 - S3バケットに出力
 - タイムラグあり

### レポーティングまとめ
 - レポート：AWSマネジメントコンソール
 - リアルタイムモニター：CloudWatch
 - アクセスログ：S3

## Tips
 - Route 53と連携し、DNS名前解決の高速化
 - 障害異常検知はCloudWatch Alarmを活用する
 - 自動キャッシュを無効化するときはS3アップロードをトリガーとしてLambdaを利用

## Lambda@Edge
 - CloudFront + Lambda = Lambda@Edge
 - フルマネージド
 - オートスケール
 - 従量課金
 - 対障害性
 - グローバル分散

### キャッシュヒット率の向上
 - クエリ文字列、ユーザーエージェントの正規化
 - ヘッダー、Cookie、クエリ文字列に基づき、複数のオリジンへ動的ルーティング

### コンテンツ生成
 - 画像リサイズ、HTMLページ生成

### セキュリティ
 - 認証
 - セキュリティヘッダ付与

### 作成の流れ
 - バージニア北部リージョンで作成
 - ディストリビューショントリガーと関連付け
 - 各リージョンにレプリケート
 - ログは各エッジに紐づくリージョンに出力される

## まとめ
 - レスポンスの改善とオリジン負荷軽減
 - WAFと組み合わせ、高いセキュリティを実現
 - ログレポート機能でアクセス傾向分析
 - Lambda@Edgeと組み合わせて、UX向上
 - 大容量配信や大量アクセスがあるサイトに有効
 - 小規模でもセキュリティが求められるサイトに有効