塩焼きブログ

塩焼きに関しての研究内容を公開しています

Amazon S3とCloudFrontで独自ドメインをSSL対応し静的ファイルを配信する

VPSで単純な静的ファイルによって構築されているサイトを公開しているのですが、収益につなげていないので月額500円以上は高いなと思いました。

単純な静的ファイルならS3のウェブサイトホスト機能を使う方がコスト的には圧倒的に良いが、SSL対応ができないため考えていなかったのだが、CloudFrontを通すとAmazonの無料SSL証明書を使ってSSL経由でコンテンツを配信できることを知りました。

しかも単純にS3から直接配信するよりコストも削減できるらしい。理由としてはユーザーにより近い地域からデータを配信するようになり結果的にコストが削減できるからだそうだ。これは大変良い。

というわけで、今回は上記のケースでAWSを使って格安で静的ファイルをSSL対応して配信するのにチャレンジしてみます。AWSのGUIはよく変更されるので、スクリーンショットは使用せずにテキストで解説を行いたいと思います。

独自ドメインで静的ウェブサイトをホストする

まず前提のS3でコンテンツを公開しておきます。

余談ですが、S3単体で独自ドメインから公開したい場合はAmazonのヘルプを参考にしながらポリシーを設定します。CloudFrontを経由する場合は独自ドメイン経由でS3から配信する必要はないのでこの設定は不要です。

{
  "Version":"2012-10-17",
  "Statement":[{
    "Sid":"PublicReadGetObject",
        "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}

Amazonの無料SSL証明書を作成する

AmazonのCertificate Managerにアクセスして証明書を作成します。事前にドメインの admin@example.com でメールを受信できるようにしておきます。Amazonではこのメールアドレスにメールを送信し、記載されている認証用URLにアクセスすることで証明書を発行できます。

他にwhoisの情報に記載されているメールアドレスにもメールが送られてくるらしいが、ドメインの情報に代理情報を掲載する場合が個人用途では多いと思うので上記の方法がよく使われるんじゃないでしょうか。

S3のコンテンツをCloudFrontからSSL経由で配信させる

CloudFrontの設定

CloudFrontにアクセスしてディストリビューションを作成します。今回私はこちらの記事を参考にしましたが、アクセスして指示に従えば簡単に作成することができます。

ディストリビューションを作成する際にはCNAMEに公開したいドメイン名を設定し、証明書は先程作成したものを選択、OriginsはS3のバケットexample.com.s3.amazonaws.com(セレクトボックスに自動で出てくるので深く考えなくて良い)を設定すれば完了です。

これでS3はファイル置き場、配信はCloudFrontが行うという構成になります。

S3に保存したファイルが反映されない・削除したファイルが削除されない

何度か試行錯誤しているとファイルが反映されなかったり、削除されなかったりという減少に遭遇して混乱すると思います。まず、ファイルを新しく作成したはずなのにCloudFrontにファイルが反映されないのはCloudFrontのネガティブキャッシュが効いている可能性があり、ファイルを削除してもCloudFrontから削除されないのはキャッシュが効いている可能性があります。

このキャッシュを再構築するには、ディストリビューションのページのInvalidationsタブのCreate Invalidationから削除したいファイルのパスを実行します。

DNSの設定

そしてDNSから対象ドメインのCNAMEをCloudFrontに向ければOKです。ディストリビューションの詳細に作成したディストリビューションに適用されたサブドメインが記載されているのでそこに向ければOKです。

wwwなしのドメインを向けたい場合はCNAMEが使えないので、簡単に設定するならAレコードで設定すれば、独自ドメインかつSSL経由でコンテンツが確認できます。しかしながら、AレコードだとIPアドレスが変わった時に対応できないのでAmazon Route53のAレコード設定にあるエイリアス機能を利用します。

Amazon Route53を使ってwww無しにCNAMEのような設定を行う

Amazon Route53は、AレコードにURLを指定することができる独自のエイリアス機能を持つらしく、wwwなしにCNAME的なことができるというわけです。Amazon Route53の設定はこちらを参考に進めればすぐに完了します。

私は最初Amazon Route53のエイリアス機能というのは、独自のエイリアスレコードがあるのかと思っていましたが、実際はAレコードの値設定の時にAliasをONにすることで、IPアドレスではなくアドレスで指定できるようです。

気になるRoute53の料金はPV5万弱で50円となるとのことで少々高めではありますが、それでも静的ファイルで構成されるコンテンツをVPSでホスティングしてSSL対応するのと比べれば圧倒的に安く済むかと思われます。