CloudFrontのオリジンサーバによる機能の違い

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
今日はCloudFrontのOriginについてのあまり知られていない(?)差について書いてみます。

CloudFrontの復習

CloudFrontはAWSが提供するCDN(Contents Delivery Network)サービスです。全世界に散らばったエッジサーバと呼ばれるキャッシュサーバがコンテンツ提供元サーバ(オリジンサーバ)の持つコンテンツをキャッシュすることで、オリジンサーバの負荷を軽減しつつ高速なレスポンスを返すことを目的としています。

CloudFrontを経由して配信したいFQDN単位で、CloudFrontのDistributionと呼ばれるものを作成し、それに対してコンテンツの取得元であるオリジンサーバを一つ指定します。CloudFrontの特徴として、オリジンサーバとしてS3バケットを指定できることが挙げられます。以降、S3をオリジンサーバに設定したディストリビューションをS3 Origin、その他の一般的なWebサーバをオリジンとしたサーバをCustom Originと呼びます。

CloudFrontを利用する上で注意しておきたいのは、S3 OriginとCustom Originでは利用できる機能に差がある、という点です。さらに、S3を通常のバケットとして設定するか、Static Website Hosting機能を有効にしたエンドポイントを設定するかどうかでも、利用できる機能に差があります。つまり機能面で見ると、CloudFrontのオリジンサーバは以下の3種類に分類することができます。

  • S3 Origin(バケット)
  • S3 Origin(静的ウェブサイトホスティング)
  • Custom Origin

以下で、実際にどんな差があるのかに触れていきます。

CloudFront⇔オリジンサーバ間のHTTPS通信

CloudFrontがオリジンサーバのコンテンツを取りに行く時には、その間でHTTP通信が発生します。S3 Origin(バケット)を利用した場合はこの通信がデフォルトでHTTPS通信となり、セキュアな経路が保たれます。ですが、S3 Origin(静的ウェブサイトホスティング)を利用した場合はこの機能を利用することができません。S3静的ウェブサイトホスティングのエンドポイントがHTTPS通信を受け入れていないためです。Custom Originの場合は、自前で正式なSSL証明書(=オレオレ証明書不可)を用意すればHTTPS通信が行えるようになります。

プライベートコンテンツの配信

一般的にはオープンにしたくないコンテンツをCloudFrontを経由した場合にのみアクセス可能にするような設定も可能です。S3 Origin(バケット)を利用する場合はOrigin Access Identityという機能を利用することができます。この機能ではオリジンサーバであるS3バケットへの直接アクセスを禁止しつつ、CloudFrontからのアクセスのみを許可する機能です。以下のブログにて詳しく解説されていますので、一読してみてください。

この機能も、S3 Origin(バケット)に対してのみ利用可能です。S3 Origin(静的ウェブサイトホスティング)を利用する場合には直接S3に対してHTTPで接続されるのを防ぐことはできません。一つの制約として捉えるのがいいと思います。

Custom Originを利用する場合は、このドキュメントで紹介されている手順を踏襲して実装すればプライベートコンテンツも配信できるようです。ただし、CloudFrontからの接続はSecurityGroupなどで制限できないため、オリジンサーバへのアクセス自体はパブリックにしておく必要があります。そのため、オリジンサーバのURLは外部に漏れないよう、十分に注意しておく必要があります。

CloudFrontによるRTMP配信

CloudFrontではHTTPの配信だけではなく、Real Time Messaging Protocol (RTMP)の配信を行うことも可能です。ですが、この機能は現在S3 Origin(バケット)でのみ利用可能となっています。Custom OriginとしてEC2にメディアサーバを用意してCloudFrontでRTMP配信、というのは現在は実現できないようです。

Index Documentの設定

大半のWebサーバでは、ディレクトリに対するアクセスが実施された時に返すドキュメントを事前に設定することができます。ApacheであればDirectoryIndexですね。ApacheではDirectoryIndex index.htmlと指定しておけば、http://example.com/へのアクセスがあった際にhttp://example.com/index.htmlに相当するファイルをレスポンスとして返却してくれます。
注意が必要なのは、S3 Origin(バケット)を利用する場合にはRootオブジェクトに対してのみIndex Documentが指定可能 という点です。CloudFrontではDefault Root Objectという設定項目でIndex Documentを指定することができますが、これはRootへのアクセス時(例:http://example.com/)に対してのみ有効であり、サブディレクトリ(例:http://example.com/foo/)に対しては有効になりません。そのため、階層構造のあるWEBサイトをホストする際には不向きだと思われます。

一方で、S3 Origin(静的ウェブサイトホスティング)の場合は、CloudFrontではなくS3バケットに対してIndex Documentを設定することになります。ここで設定されるIndex Documentはサブディレクトリに対しても有効となります。Custom Originの場合は、当然OriginのWEBサーバの設定がそのまま反映されます。

ちなみに、S3単独で静的ウェブサイトホスティング機能を有効にする場合、S3バケット名とアクセスするホスト名が一致する必要があります。「www.example.com」でアクセスしたいならバケット名を「www.example.com」として作成する必要があります。ですが、CloudFront + S3 Origin(静的ウェブサイトホスティング)を利用する場合は、バケット名とアクセスするホスト名が一致していなくてもアクセス可能です。バケット名とホスト名が異なる場合は、CloudFrontのCNAMEs設定にホスト名を加えればよいだけです。しかもCNAMEsは複数指定可能です。S3の静的ウェブサイトホスティングを利用する際には、CloudFrontと組み合わせて使うとハマりどころが少なくなるのでオススメです。

まとめ

文章で長々と書いてきましたが、ここまで見てきた機能とOriginの機能差を一覧表にしてみました。

機能/Originの種類 S3 Origin(バケット) S3 Origin(静的ウェブサイトホスティング) Custom Origin
CloudFront⇔Origin間のHTTPS通信 △(自分でSSL証明書を用意する必要あり)
プライベートコンテンツの配信 △(オリジンサーバのURLは秘匿しておく必要がある)
RTMP配信
Index Documentの設定 ☓(ルートへのアクセスのみ指定可能) ○(S3の設定として指定) ○(WEBサーバの設定)

ややこしいですね。それぞれの違いを把握して、適切なOriginを選択できるようになりましょう。

参考