AWSコマンドラインインターフェース(AWS CLI)でCloudFrontを構築してみる
Amazon CloudFrontはコンテンツ配信ウェブサービス。
コンテンツは「ディストリビューション」という単位で整理され、ディストリビューションはオリジン(オリジナルなファイルの場所、例えば、S3バケットの中のファイル)を指す。
CloudFrontを構築することで、一意のCloudFront.netドメイン名(例えば、abc123.cloudfront.net)で作成でき、このドメインを使用して、各国・各地域で最適なネットワークルート・キャッシュ(エッジサーバ)を利用してコンテンツを配信することができる。
コンテンツはHTML/CSS/JS/Imageなど静的コンテンツの ダウンロードディストリビューション だけではなく、RTMP(Real 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」
- 後述の「Webディストリビューションの設定項目」を参照
- 公開されるまで数分かかる
- 削除したいときは「Disable」して数分たってから「Delete」
- Statusが「In Progress」から「Deployed」に変わたらDeleteできる
Webディストリビューションの設定項目
節タイトルの通り、Webディストリビューションの項目のみ記載する。
Origin Settings
- Origin Domain Name
- S3を選択する
- HTTPサーバの場合は入力する(たぶん)
- Origin Path (オプション)
- Origin Domainのルートより下の階層をサービスのルートとしたい場合に記載
- 「/」から始めて記載する
- Origin Domainのルートより下の階層をサービスのルートとしたい場合に記載
- Origin ID
- 1つのディストリビューションで複数のオリジンサーバを指定する際にそれぞれを識別するために付与する
- オリジンが1つでも必要(S3の場合は自動で入力される)
- Restrict Bucket Access
- 「オリジンアクセスアイデンティティ」を使用する場合は「Yes」を選択
- オリジンアクセスアイデンティティは一言でいうと「クライアントからS3を直接アクセスできず、必ずCloudFrontを経由してアクセスする仕組み」
- その他参考
- 「オリジンアクセスアイデンティティ」を使用する場合は「Yes」を選択
- Origin Custom Headers
- クライアントからのリクエストをオリジンサーバに渡す際に追加するヘッダ
Default Cache Behavior Settings
- Path Pattern
- 初期作成時は「Default (*)」のみ選択可能
- CloudFront構築後にキャッシュの振る舞いについて追加設定できる
- Viewer Protocol Policy
- CloudFrontへのアクセスを許可するプロトコル
- Allowed HTTP Methods
- CloudFrontへのアクセスを許可するHTTPメソッド
- Cached HTTP Methods
- キャッシュを有効にするHTTPメソッド
- 初期作成時には「GET, HEAD (Cached by default)」しか選べない
- キャッシュを有効にするHTTPメソッド
- Forward Headers
- CloudFrontを経由するとHTTPヘッダが変更されてオリジンサーバへ送付される
- クライアントから送信されたリクエストヘッダで、オリジンサーバへそのまま渡したいものを設定する
- Object Caching
- エッジキャッシュの有効期限(TTL:Time To Live)を設定する
- オリジンサーバの設定に合わせる場合は「Use Origin Cache Headers」、CloudFrontで設定する場合は「Customize」を選択
- Forward Cookies
- クライアントから送信されたリCookie項目で、オリジンサーバへそのまま渡したいものを設定する
- Forward Query Strings
- クエリパラメータをオリジンサーバへそのまま渡すかどうかを設定する
- Smooth Streaming
- 「Microsoft Smooth Streaming」を使用したい場合は設定する
- Restrict Viewer Access (Use Signed URLs or Signed Cookies)
- 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>
で取得したJSONをaws cloudfront create-distribution
やaws 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]
を実行