【AWS】 Amazon CloudFront ~ 入門編 ~

 ■ はじめに

https://dk521123.hatenablog.com/entry/2017/12/15/232236

で、 S3 でのリダイレクションを行った。

しかし、SSL通信でのリダイレクションは、
S3 の ウェブサイトエンドポイントが、
SSL 接続をサポートをしていないことから
S3単体では行えない

http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff

そこで、AWS Certificate Manager / CloudFront と
組み合わせれば実現可能らしいので、
まずは、CloudFront を調べてみた

また、Qwiklabs で「Introduction to Amazon CloudFront」って
ハンズオンラボがあるので、試してみるといいかも。

https://amazon.qwiklabs.com/

目次

【1】Amazon CloudFront
 1)目的
 2)料金
【2】用語整理
 1)オリジンサーバ (Origin server)
 2)エッジサーバ (Edge server)
 3)エッジロケーション
【3】CloudFront/ACM/S3でSSL通信でのリダイレクションを行う
【4】Amazon CloudFront を CloudWatch で監視するには

 【1】Amazon CloudFront

* キャッシュサーバ
* AWSでCDNを実現する

 CDN(Content Delivery Network)

* デジタルコンテンツをインターネット上で
 大量配信するためのネットワーク

https://www.idcf.jp/words/cdn.html

1)目的

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cache-hit-ratio-explained.html

* オリジンサーバーが直接応答するリクエストの数を減らすこと

 2)料金

https://aws.amazon.com/jp/cloudfront/pricing/

 【2】用語整理

 * 関連する用語をまとめる。

 1)オリジンサーバ (Origin server)

 * 配布元のオリジナルファイルが置かれているサーバ

 2)エッジサーバ (Edge server)

 * キャッシュ機能をもつサーバ

3)エッジロケーション

* エッジサーバを使った
 AWS グローバルインフラストラクチャのコンポーネント

 【3】CloudFront/ACM/S3でSSL通信でのリダイレクションを行う

 前提条件

 * お名前ドットコムなどで、ドメイン名を取得していること

 手順概要

1)S3のリダイレクションの設定
2)AWS Certificate Manager(ACM)で証明書作成
3)Cloudfrontの設定
4)動作確認

 1)S3のリダイレクションの設定

 * 以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2017/12/15/232236
2)AWS Certificate Manager(ACM)で証明書作成
https://aws.amazon.com/jp/blogs/news/easier-certificate-validation-using-dns-with-aws-certificate-manager/

を見ながらやるといいかも 

[1] AWSマネジメントコンソールで、
 リージョンを「米国東部(バージニア北部)」に指定する ★超重要★ ... ※1

[2] Certificate Manager画面まで移行し
 「今すぐ始める」ボタン押下し、「証明書のリクエスト」ボタン押下

[3] 「ステップ 1:ドメイン名の追加」において、
 ドメイン名を入力し「確認とリクエスト」ボタン押下

[4] 「ステップ 2: 確認方法を選択する」において、
 「DNS 検証」を選択し、「確認」ボタン押下

[5] 「ステップ 3: リクエストを確認する」において、
 内容を確認し、問題なければ「確定とリクエスト」ボタン押下

[6] 「ステップ 4: 検証」において、
 「DNS 設定をファイルにエクスポート」リンクを押下して
       DNS 設定が記載されているCSVファイルをダウンロードし、
  ひとまず「続行」ボタン押下
 => 「NAME」「TYPE(値はCNAME)」「VALUE」が書いてあるはず
 => 検証が認証されるまで「検証保留中」が表示されるので、
  以降の手順で、これを解決していく

[7] [6]でダウンロードしたDNS 設定が
  記載されているCSVファイルに記載されている値を
  DNS設定に反映させる
 => で、しばらく待つ(10~30分間?結構長い)と、
  「検証状態」が「検証保留中」→「成功」になり
  状態が「発行済み」になる

【お名前ドットコムで設定されている場合】

   => 以下のURLの画面遷移を参考に「DNSレコード設定を利用する」を選択し、
      以下を入力し、設定する

https://www.onamae.com/guide/details.php?g=18

    a) TYPE     : CSVの「TYPE」の値(「CNAME」)
    b) ホスト名 : CSVの「NAME」の値
    c) TTL      : 60-86400(レコード情報の有効時間[秒]。例「3600」)
    d) VALUE    : CSVの「VALUE」の値

※1

証明書作成する際は必ず「米国東部(バージニア北部)」リージョンで 
 * ここを「バージニア」で作成しないと、
 項目「SSL Certificate」で「Custom SSL Certificate」が
   グレーアウトとなり何も選択できなくなる(はまった...)

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html#https-requirements-aws-region

より抜粋
~~~~~~~~~~~~
 証明書をリクエストする AWS リージョン (AWS Certificate Manager 用)

  ビューワーと CloudFront との間で HTTPS を必須にするには、
 証明書をリクエストまたはインポートする前に
 AWS Certificate Manager コンソールで
 AWS リージョンを 米国東部(バージニア北部) に
変更する必要があります。
~~~~~~~~~~~~

 3)Cloudfrontの設定

2017/12/18現在では英語のみ 

[1] AWSマネジメントコンソールで、
 CloudFront画面を開き、「Create Distribution」ボタン押下

[2] 「Step1: Select delivery method」において、
 Webの「Get Started」ボタン押下

[3] 「Step 2:Create distribution」において、以下を入力する

 【Origin Settings】
   + Origin Domain Name : 静的ウェブサイトホスティングのエンドポイントを指定
     ★超重要★
  サジェストされる選択肢を選択せず
  「【バケット名】.s3-website-【リージョン名】.amazonaws.com」を入力
   + Restrict Bucket Access : Yes
   + Origin Access Identity : Create a New Identity 
   + Create Read Permissions on Bucket : Yes, Update Bucket Policy

 【Default Cache Behavior Settings】
   + Viewer Protocol Policy : Redirect HTTP to HTTPS

 【Distribution Settings】
   + Alternate Domain Names : リダイレクト先のホスト名を入力する
   + SSL Certificate : Custom SSL Certificat
     => Certificate Managerで[1] 作成した証明書を選択する
   + Default Root Object : index.html

   ※ ログが必要なら「Logging : On」でもいい

[4] 「Create Distribution」ボタン押下
 => 「Status」(状態)が「In Progress」(進行中)で
  グルグルとアイコンが回っているので、
  しばらく待つ(10~30分間?これも結構長い)と「Deployed」になるはず

[5] 「Domain Name」を確認し(【文字列】.cloudfront.net)DNS設定を行う

 【お名前ドットコムで設定されている場合】
   => [1-7]と同じ画面でDNSの設定をおこなう

    a) TYPE     : 「CNAME」
    b) ホスト名 : 「Domain Name」の値(【文字列】.cloudfront.net)
    c) TTL      : 60-86400(レコード情報の有効時間[秒]。例「300」)
    d) VALUE    : ホスト名

 4)動作確認

* ブラウザを開き、SSL(https://xxxxx.com)で、
 リダイレクトできるか確認する

 【4】Amazon CloudFront を CloudWatch で監視するには

http://aws.typepad.com/aws_japan/2014/11/cloudfront-up-trends-metrics-stats.html
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/monitoring-using-cloudwatch.html
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cf-metricscollected.html

[1] AWSマネジメントコンソールでログインし、CloudFront画面を開く

[2] 右側のナビゲーションペインで、[Monitoring and Alarms]を選択

[3] 「Alarms」を開き、「Create Alarm」ボタン押下

[4] Metric で監視対象を選び、閾値を設定する
 Metric(メトリックス)
a) Requests        : リクエスト回数。
b) BytesDownloaded : ダウンロードされたバイト数。
c) BytesUploaded   : CloudFront を通じてオリジンにアップロードされたバイト数。
d) TotalErrorRate  : 全リクエスト中 4xx あるいは 5xx であるパーセンテージ。
c) 4xxErrorRate    : 全リクエスト中 4xx であるパーセンテージ。
e) 5xxErrorRate    : 全リクエスト中 5xx であるパーセンテージ。

 【メモ】 S3/CloudFrontのログのCloud Watch Logで管理するには

* S3のイベント + Lambda を使って行う事が可能。方針は以下の通り。 

[1] ログを CloudWatch Logsに突っ込む AWS Lambda関数を作成する

[2] 対象のS3バケットのプロパティの[Events]からS3イベントを登録し、
 [1]のLambdaを指定する

LambdaでS3上に出力されたログをCloudWatch Logsに取り込んで監視する 

https://moomindani.wordpress.com/2014/12/08/lambda-s3-cwl/

AWS LambdaのファンクションをJavaで書く(S3イベント処理編) 

https://qiita.com/Keisuke69/items/23ce6652f212a7418fac

 参考文献

https://qiita.com/kooohei/items/b0f099e6b9afa4b261e6
https://kuune.org/text/2016/05/12/static-website-hosting-using-aws-s3-and-cloudfront/
https://qiita.com/jasbulilit/items/73d70a01a5d3b520450f
https://qiita.com/kazuhei/items/9d72b6bbd4d82abe9e9e
https://thetimegraphy.com/set-aws-cloudfront-certificate-manager-route53/

 関連記事

Amazon S3 ~ リダイレクト機能 ~
https://dk521123.hatenablog.com/entry/2017/12/15/232236
Amazon API Gateway ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/09/06/131820
ACMSSL証明書無料発行 ~
https://dk521123.hatenablog.com/entry/2018/03/06/234000