読者です 読者をやめる 読者になる 読者になる

ぺーぺーSEのブログ

備忘録・メモ用サイト。

AWSコマンドラインインターフェース(AWS CLI)でCloudFrontを構築してみる

Amazon CloudFrontはコンテンツ配信ウェブサービス
コンテンツは「ディストリビューション」という単位で整理され、ディストリビューションオリジン(オリジナルなファイルの場所、例えば、S3バケットの中のファイル)を指す。 CloudFrontを構築することで、一意のCloudFront.netドメイン名(例えば、abc123.cloudfront.net)で作成でき、このドメインを使用して、各国・各地域で最適なネットワークルート・キャッシュ(エッジサーバ)を利用してコンテンツを配信することができる。 コンテンツはHTML/CSS/JS/Imageなど静的コンテンツだけではなく、RTMPReal Time Messaging Protocol)に対応した映像・音声のストリーミング配信にも対応可能。

AWS CLIの初期設定

CloudFrontのAWS CLIはまだプレビュー版(2016/3/3時点)なので、使用するためには設定を変更する必要がある。

$ aws configure set preview.cloudfront true

aws cloudfront list-distributionsか何かでcloudfrontコマンドが利用可能になったか確認する。

AWS CLIを使ったCloudFront設定の方針

CloudFrontをAWS CLIで設定する場合、非常に長く複雑なJSONファイルを作成する必要がある。
そのため、初回はManagementコンソールを使用してCloudFrontを作成し、更新はCLIを用いて行う。
以下の順で作成する。

  • Management ConsoleでCloudFrontを構築(本番でもダミーでも)
    • 後述の「Management ConsoleでのCloudFront作成方法」を参照
  • aws cloudfront get-distributionで設定のJSONを取得
  • JSONを修正
    • 後述の「JSONの修正方法」を参照
  • aws cloudfront update-distribution --cli-input-jsonで更新
    • --distribution-configだとJSONフォーマットが合わないみたい

なお、JSONの項目は更新を行わないものでも全て記載する必要があるらしい。

参考:
https://blog.cloudpack.jp/2015/02/19/control-amazon-cloudfront-with-aws-cli-except-for-invalidation/

Management ConsoleでのCloudFront作成方法

以下の順で作成する。

  • Management ConsoleにログインしてCloudFrontを選択
  • 「Create Distribution」を選択
  • 「Web」の「Get Started」を選択
    • RTMP」はストリーミング配信のとき選択
  • 項目を入力して「Create Distribution」
  • 削除したいときは「Disable」して数分たってから「Delete」
    • Statusが「In Progress」から「Deployed」に変わたらDeleteできる

Webディストリビューションの設定項目

節タイトルの通り、Webディストリビューションの項目のみ記載する。

Origin Settings

  • Origin Domain Name
    • S3を選択する
    • HTTPサーバの場合は入力する(たぶん)
  • Origin Path (オプション)
    • Origin Domainのルートより下の階層をサービスのルートとしたい場合に記載
      • /」から始めて記載する
  • Origin ID
    • 1つのディストリビューション複数のオリジンサーバを指定する際にそれぞれを識別するために付与する
    • オリジンが1つでも必要(S3の場合は自動で入力される)
  • Restrict Bucket Access
  • Origin Custom Headers
    • クライアントからのリクエストをオリジンサーバに渡す際に追加するヘッダ

Default Cache Behavior Settings

  • Path Pattern
    • 初期作成時は「Default (*)」のみ選択可能
    • CloudFront構築後にキャッシュの振る舞いについて追加設定できる
  • Viewer Protocol Policy
  • Allowed HTTP Methods
    • CloudFrontへのアクセスを許可するHTTPメソッド
  • Cached HTTP Methods
    • キャッシュを有効にするHTTPメソッド
      • 初期作成時には「GET, HEAD (Cached by default)」しか選べない
  • Forward Headers
    • CloudFrontを経由するとHTTPヘッダが変更されてオリジンサーバへ送付される
    • クライアントから送信されたリクエストヘッダで、オリジンサーバへそのまま渡したいものを設定する
  • Object Caching
    • エッジキャッシュの有効期限(TTL:Time To Live)を設定する
    • オリジンサーバの設定に合わせる場合は「Use Origin Cache Headers」、CloudFrontで設定する場合は「Customize」を選択
  • Forward Cookies
    • クライアントから送信されたリCookie項目で、オリジンサーバへそのまま渡したいものを設定する
  • Forward Query Strings
    • クエリパラメータをオリジンサーバへそのまま渡すかどうかを設定する
  • Smooth Streaming
  • Restrict Viewer Access (Use Signed URLs or Signed Cookies)
    • 認証されたユーザのみにCloudFrontを経由してコンテンツへのアクセスを許可したい場合にしようする
    • 参考1参考2
  • Compress Objects Automatically
    • Accept-Encoding: gzip」に対応してコンテンツを圧縮したい場合に使用する

Distribution Settings

  • Price Class
    • 料金プランの選択
  • AWS WAF Web ACL
    • 使用したい場合は自分で作成したAWS WAFを選択する
  • Alternate Domain Names (CNAMEs)(オプション)
    • CloudFrontのドメイン(例えば、d1234.cloudfront.net)ではなく自分自身のドメイン(例えば、www.example.com)を使用したい場合に設定する
  • SSL Certificate
    • SSLの設定を行う
  • Default Root Object(オプション)
    • ルートオブジェクト(例えば、index.html)を設定したい場合に使用する
  • Logging
    • CloudFrontのログファイルをS3に作成したい場合に使用する
  • Comment
    • コメント
  • Distribution State
    • CloudFront構築時のstateを設定する

JSONの修正方法

aws cloudfront get-distribution --id <ID>で取得したJSONaws cloudfront create-distributionaws cloudfront update-distribution--cli-input-jsonで使用するための修正方法について記載する。

aws cloudfront create-distributionの場合

  • 取得したJSONの「Distribution」項目配下の「DistributionConfig」項目配下だけ取り出して下記のように編集
{
    "DistributionConfig": {
        // 省略
    }
}
  • 「null」を「""」 へ置換
  • CallerReference」項目の値に(たぶん)13桁のユニークな数字文字列を記載
    • (例)1456981466784
  • その他変えたいところを修正
  • aws cloudfront create-distribution --cli-input-json file://[JSON_File_Path]を実行

aws cloudfront update-distributionの場合

  • 取得したJSONの「Distribution」項目配下の「DistributionConfig」項目配下だけ取り出して、「Id」項目と「IfMatch」項目を付与して下記のように編集
{
    "DistributionConfig": {
        // 省略
    },
    "Id": "",
    "IfMatch": ""
}
  • 「null」を「""」 へ置換
  • Id」項目はget-distributionで取得したときの「Id」の値を設定(更新したいCloudFrontのId)
  • IfMatch」項目はget-distributionで取得したときの「ETag」の値を設定
  • その他変えたいところを修正
  • aws cloudfront update-distribution --cli-input-json file://[JSON_File_Path]を実行