CloudFrontで特定のパスへのアクセスをリダイレクトさせる

こんにちは、坂巻です。

今回はCloudFrontを利用し、以下2つの構成で特定のパスへのアクセスをリダイレクトしてみたいと思います。

  • CloudFront + Custom Origin(ALB)
  • CloudFront + S3 Origin(ウェブサイトホスティング)

CloudFront + Custom Origin(ALB)

構成

01

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のみに設定しています。 リスナールールはパス毎にリダイレクト先として外部サイトを設定しています。 05

CloudFront

Distribution

独自のドメインを利用し、CloudFrontまでの経路を暗号化したいので、 CNAMEにregion.nochan.tkを設定し、ACMで取得した証明書を指定しています。

02

Origin

Originは上記で作成したALBを選択し「Origin Protocol Policy」はHTTPS Onlyとしました。これで、CloudFront、ALB間の通信は、HTTPSのみとなります。

03

Behavior

デフォルト以外にneko/*と、inu/*を設定しました。 ビューワー(ウェブブラウザ等)からのHTTPの通信は、HTTPSにリダイレクトしています。 04

Route 53

利用する独自ドメインnochan.tkホストゾーンに、サブドメインregionで、ALIASレコードを作成しました。ターゲットには、先程作成したCloudFront(Distribution)を指定しています。

06

動作確認

それでは動作を確認してみましょう。まずは、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==

ー  以下、省略  ー

nekoinuのリダイレクトが確認できました。

CloudFront + S3 Origin(ウェブサイトホスティング)

構成図

08

https://world.nochan.tk/nekoへのリクエストはCloudFrontを経由させ、S3の機能でhttps://dev.classmethod.jpにリダイレクトさせます。(httpの場合はhttpsにリダイレクト)

同様にhttps://world.nochan.tk/inuへのリクエストはhttps://twitter.com/classmethodにリダイレクトさせます。 それでは、リソース毎の設定をみていきたいと思います。

S3

S3のリダイレクトルールを設定し、外部サイトへリダイレクトさせます。 リダイレクトルールを行うためには、ウェブサイトホスティング設定が必要になります。

07

ウェブサイトホスティングを有効にし、リダイレクトルールに以下を記述します。

<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では他にもリダイレクト方法がありますので、併せてご確認ください。

Amazon S3 でリダイレクトを扱う

CloudFront

Distribution

独自ドメインを利用し、CloudFrontまでの経路を暗号化したいので、 CNAMEにworld.nochan.tkを設定し、ACMで取得した証明書を指定しています。

09

Origin

Originは上記で作成したS3のウェブサイトを指定しました。

10

OriginがS3ウェブサイトホスティングのエンドポイントでは、CloudFront + S3 Origin間は、HTTPS通信ができないのでご注意ください。 なお、S3単独でウェブサイトホスティングを有効にする場合、S3バケット名とアクセスするホスト名を一致させる必要がありますが、 CloudFront + S3 Origin(ウェブサイトホスティング)の場合、CloudFrontのCNAMEを設定することで、バケット名とアクセスするホスト名が一致していなくてもアクセスが可能になります。

Behavior

デフォルト以外にneko/*と、inu/*を設定しました。 ビューワーからのHTTPの通信は、HTTPSにリダイレクトしています。

11

Route 53

利用する独自ドメインnochan.tkホストゾーンに、サブドメインworldで、ALIASレコードを作成しました。ターゲットには、先程作成したCloudFront(Distribution)を指定しています。

12

動作確認

それでは動作を確認してみましょう。まずは、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==

ー  以下、省略  ー

nekoinuのリダイレクトが確認できました。

さいごに

今回はCloudFrontを利用する構成でリダイレクトに焦点をあて動作を確認しました。CloudFront + S3 Origin(ウェブサイトホスティング)の構成では、CloudFront、オリジン間の通信が暗号化できないため、リダイレクト機能のみで比較するのであれば、CloudFront + Custom Origin(ALB)の方が設定もシンプル(運用しやすいのでは?)で、こちらの方法で実装するのがいいのではないでしょうか。

参考