S3とCloudFrontを連携してhttpsアクセスでS3にアクセスできるようにする

クラウド

前提

  • S3に静的ホスティングするhtml等は用意できている

ちなみに、S3の静的ホスティングのみでhttps接続を実現できるんですかね?
それができないっぽかったので、CloudFrontを間に設けてhttpsアクセスを実現しようと考えました。

Tips

先にハマったところというか、個人的に直感的でなかったことを挙げておきます。

CloudFront で OAI 設定してアクセスする場合、S3側は静的ホスティング有効しなくて良い

正確には OAI 設定が関係ある革は確認していませんが、少なくとも S3 側で静的ホスティング有効にしなくても CloudFront 経由でバケットにアクセスできます。
これは個人的にはちょっと???です。静的ホスティングの設定ってあれなにやってるんだろ?

CloudFront で OAI 設定した場合、バケットポリシーは S3 側に手動で設定する必要がある

下記説明で書いていますが、なんでこんな仕様?ハマりました。

CloudFront からS3バケット内の index.html にアクセスする場合、URLに「index.html」まで記述しないとアクセスできない

たとえS3側で静的ホスティング有効にしていても、CloudFrontからアクセスするときはURLを拡張子までちゃんと入力する必要がります。(というかたぶんCloudFrontからすると静的ホスティングとか関係ない?)
これを対処する方法として、下記説明でかいていますが、「デフォルトルートオブジェクト」を設定すると「index.html」を省略できます。

手順

1. S3のバケットを作成し、ソースをアップロードする

アップロード方法は説明省略します。

ここでポイントは、ただアップロードするだけで、パブリック化も静的ホスティングも有効にしない(つまり全てデフォルトのまま)ということです。

2. CloudFront でディストリビューションを作成する

  • CloudFront の画面に行き、「ディストリビューションを作成」を選択します

  • 「オリジンドメイン」には、1.で作成したS3のバケットをプルダウンから選択します
  • 「名前」の欄は、自動で入力されます
  • 「S3バケットアクセス」は「Oring access control settings」を選択します
    • 「コントロール設定を作成」ボタンを押します

  • ポプアップが表示されますが、そのまま「作成」でよいです

  • 「ビューワープロトコルポリシー」はリダイレクトを選択することで https アクセスに限定できます
  • 「許可されたHTTPメソッド」は用途に応じて選択する感じでしょうか

  • 「デフォルトルートオブジェクト」に index.html とします(重要

上記でディストリビューション完了です。

反映されるまでに数分かかりますので、それまでにS3のバケットポリシーを更新します(超重要

3. S3のバケットポリシーを更新する

  • 下記画面で「オリジン」を選択します

  • オリジンを選択し、編集ボタンを押します

  • 「ポリシーをコピー」を押して、「S3バケットアクセセウ許可に移動」を押します

  • S3のバケット設定に飛ぶので、そこで「バケットポリシー」の「編集」を押します

  • ポリシーの欄に先ほどコピーしたポリシーを貼り付けます
    *この際、何故か先頭にスペースが入った状態でコピーされることがあります。その状態だと保存エラーになるので、えらーになったらjsonの先頭にスペースが入ってないか確認してみてください
  • 「変更を保存」します

動作確認

下記画面のコピーボタンを押すことで、URLがコピーされます。

これをブラウザに貼り付けてURL移動するとサイトが表示されるはずです。

コメント

タイトルとURLをコピーしました