CloudFrontで特定のパスへのアクセスをリダイレクトさせる
こんにちは、坂巻です。
今回はCloudFrontを利用し、以下2つの構成で特定のパスへのアクセスをリダイレクトしてみたいと思います。
- CloudFront + Custom Origin(ALB)
- CloudFront + S3 Origin(ウェブサイトホスティング)
CloudFront + Custom Origin(ALB)
構成
https://region.nochan.tk/neko
へのリクエストは、CloudFrontを経由させALBの機能でhttps://dev.classmethod.jp
にリダイレクトさせます。(httpの場合はhttpsにリダイレクト)
同様にhttps://region.nochan.tk/inu
へのリクエストはhttps://twitter.com/classmethod
にリダイレクトさせます。
それでは、リソース毎の設定をみていきたいと思います。
ALB
リスナー
CloudFrontとOrigin間の通信もHTTPSにするため、ALBのリスナーはHTTPSのみに設定しています。 リスナールールはパス毎にリダイレクト先として外部サイトを設定しています。
CloudFront
Distribution
独自のドメインを利用し、CloudFrontまでの経路を暗号化したいので、
CNAMEにregion.nochan.tk
を設定し、ACMで取得した証明書を指定しています。
Origin
Originは上記で作成したALBを選択し「Origin Protocol Policy」はHTTPS Only
としました。これで、CloudFront、ALB間の通信は、HTTPSのみとなります。
Behavior
デフォルト以外にneko/*
と、inu/*
を設定しました。
ビューワー(ウェブブラウザ等)からのHTTPの通信は、HTTPSにリダイレクトしています。
Route 53
利用する独自ドメインnochan.tk
ホストゾーンに、サブドメインregion
で、ALIASレコードを作成しました。ターゲットには、先程作成したCloudFront(Distribution)を指定しています。
動作確認
それでは動作を確認してみましょう。まずは、http://region.nochan.tk/neko
にアクセスしてみます。
$ curl -IL http://region.nochan.tk/neko HTTP/1.1 301 Moved Permanently Server: CloudFront Date: Sun, 20 Jan 2019 01:43:29 GMT Content-Type: text/html Content-Length: 183 Connection: keep-alive Location: https://region.nochan.tk/neko X-Cache: Redirect from cloudfront Via: 1.1 5c4ffacc554e3e1f2881997654fec8f9.cloudfront.net (CloudFront) X-Amz-Cf-Id: IUJJ7Pe73mM6m0HUQrPQ3m93fRqf32v-L0Z82xpQtBKvTAzrVhjgqg== HTTP/2 301 content-type: text/html content-length: 150 location: https://dev.classmethod.jp:443/ server: awselb/2.0 date: Sun, 20 Jan 2019 01:43:29 GMT x-cache: Miss from cloudfront via: 1.1 59bf268256eaf6878422c9da7931f6ce.cloudfront.net (CloudFront) x-amz-cf-id: 4hog-izd-wtT8aMTUf2raaqamKrCRj_fwFLSWyEtoTKHWtwZ2QK3hA== ー 以下、省略 ー
CloudFrontの設定により、http通信はhttpsにリダイレクトされ、ALBのリスナールールにより外部サイトにリダイレクトされました。
次は、http://region.nochan.tk/inu
にアクセスしてみます。
$ curl -IL http://region.nochan.tk/inu HTTP/1.1 301 Moved Permanently Server: CloudFront Date: Sun, 20 Jan 2019 04:30:11 GMT Content-Type: text/html Content-Length: 183 Connection: keep-alive Location: https://region.nochan.tk/inu X-Cache: Redirect from cloudfront Via: 1.1 b5d34821a43f75c82cc5ce78962dfc41.cloudfront.net (CloudFront) X-Amz-Cf-Id: ONiWI9y3Efp4_DOm1oSpRYorEGYbC-xZyXKxGakwg_GxeB9w1QBAng== HTTP/2 301 content-type: text/html content-length: 150 location: https://twitter.com:443/classmethod server: awselb/2.0 date: Sun, 20 Jan 2019 04:30:11 GMT x-cache: Miss from cloudfront via: 1.1 3dc52e38c13bcdac2f63985b834fed7a.cloudfront.net (CloudFront) x-amz-cf-id: OoRTZ0otHYLm3NomLCl_rzKU2qkbkjriyljPuqXk_4rfoCen06ue_g== ー 以下、省略 ー
neko
とinu
のリダイレクトが確認できました。
CloudFront + S3 Origin(ウェブサイトホスティング)
構成図
https://world.nochan.tk/neko
へのリクエストはCloudFrontを経由させ、S3の機能でhttps://dev.classmethod.jp
にリダイレクトさせます。(httpの場合はhttpsにリダイレクト)
同様にhttps://world.nochan.tk/inu
へのリクエストはhttps://twitter.com/classmethod
にリダイレクトさせます。
それでは、リソース毎の設定をみていきたいと思います。
S3
S3のリダイレクトルールを設定し、外部サイトへリダイレクトさせます。 リダイレクトルールを行うためには、ウェブサイトホスティング設定が必要になります。
ウェブサイトホスティングを有効にし、リダイレクトルールに以下を記述します。
<RoutingRules> <RoutingRule> <Condition> <KeyPrefixEquals>neko</KeyPrefixEquals> </Condition> <Redirect> <Protocol>https</Protocol> <HostName>dev.classmethod.jp</HostName> <ReplaceKeyWith/> </Redirect> </RoutingRule> <RoutingRule> <Condition> <KeyPrefixEquals>inu</KeyPrefixEquals> </Condition> <Redirect> <Protocol>https</Protocol> <HostName>twitter.com</HostName> <ReplaceKeyWith>classmethod</ReplaceKeyWith> </Redirect> </RoutingRule> </RoutingRules>
ルールの記述方法等、リダイレクトの設定の詳細については、以下をご確認ください。
また、本エントリでは扱いませんが、S3では他にもリダイレクト方法がありますので、併せてご確認ください。
CloudFront
Distribution
独自ドメインを利用し、CloudFrontまでの経路を暗号化したいので、
CNAMEにworld.nochan.tk
を設定し、ACMで取得した証明書を指定しています。
Origin
Originは上記で作成したS3のウェブサイトを指定しました。
OriginがS3ウェブサイトホスティングのエンドポイントでは、CloudFront + S3 Origin間は、HTTPS通信ができないのでご注意ください。 なお、S3単独でウェブサイトホスティングを有効にする場合、S3バケット名とアクセスするホスト名を一致させる必要がありますが、 CloudFront + S3 Origin(ウェブサイトホスティング)の場合、CloudFrontのCNAMEを設定することで、バケット名とアクセスするホスト名が一致していなくてもアクセスが可能になります。
Behavior
デフォルト以外にneko/*
と、inu/*
を設定しました。
ビューワーからのHTTPの通信は、HTTPSにリダイレクトしています。
Route 53
利用する独自ドメインnochan.tk
ホストゾーンに、サブドメインworld
で、ALIASレコードを作成しました。ターゲットには、先程作成したCloudFront(Distribution)を指定しています。
動作確認
それでは動作を確認してみましょう。まずは、http://world.nochan.tk/neko
にアクセスしてみます。
$ curl -IL http://world.nochan.tk/neko HTTP/1.1 301 Moved Permanently Server: CloudFront Date: Sun, 20 Jan 2019 03:03:33 GMT Content-Type: text/html Content-Length: 183 Connection: keep-alive Location: https://world.nochan.tk/neko X-Cache: Redirect from cloudfront Via: 1.1 b177f82492a9478517a157e74856e466.cloudfront.net (CloudFront) X-Amz-Cf-Id: Fgv7zXQ5G8lByhZwh5kBbjQhLW0f4GoVMEl_lfDaTD4fL6mplEnGNw== HTTP/2 301 content-length: 0 location: https://dev.classmethod.jp/ date: Sun, 20 Jan 2019 03:03:34 GMT server: AmazonS3 x-cache: Miss from cloudfront via: 1.1 49d76082c676e546e46736f5331f9cb3.cloudfront.net (CloudFront) x-amz-cf-id: tKiF_aSmGy5b0dz7XpYhgqbbmln_IRbvl3Dvj6P85scUtFRgHzhjAw== ー 以下、省略 ー
次は、https://world.nochan.tk/inu
にアクセスしてみます。
$ curl -IL http://world.nochan.tk/inu HTTP/1.1 301 Moved Permanently Server: CloudFront Date: Sun, 20 Jan 2019 03:05:24 GMT Content-Type: text/html Content-Length: 183 Connection: keep-alive Location: https://world.nochan.tk/inu X-Cache: Redirect from cloudfront Via: 1.1 2a2a0145d534dcf7dbfa42697b2f26a3.cloudfront.net (CloudFront) X-Amz-Cf-Id: ivlO8kDjW6J5rDTK_JwQdEQCDyioL93QEUUPRQU2JzzKsx6NMLsXBA== HTTP/2 301 content-length: 0 location: https://twitter.com/classmethod date: Sun, 20 Jan 2019 03:05:16 GMT server: AmazonS3 age: 8 x-cache: Hit from cloudfront via: 1.1 bef514c838bf5258d44b4713489862f4.cloudfront.net (CloudFront) x-amz-cf-id: Jd6pWBpVbDcN0tC6JXFlgozFIxdUYtbWLZVTMK5ELSB9NSsKMldMYg== ー 以下、省略 ー
neko
とinu
のリダイレクトが確認できました。
さいごに
今回はCloudFrontを利用する構成でリダイレクトに焦点をあて動作を確認しました。CloudFront + S3 Origin(ウェブサイトホスティング)の構成では、CloudFront、オリジン間の通信が暗号化できないため、リダイレクト機能のみで比較するのであれば、CloudFront + Custom Origin(ALB)の方が設定もシンプル(運用しやすいのでは?)で、こちらの方法で実装するのがいいのではないでしょうか。