S3とCloudFrontで公開したwebページのサブディレクトリが開けない

前回の私の記事で、CloudFront経由でS3バケットのルートにあるindex.htmlにアクセスすることができるようになりました。
しかし、前回の手順だけではS3バケットの中に作ったサブディレクトリのindexファイルを確認するには、index.htmlまでURLを指定しないとアクセスできません。

そこで、今回はCloudFront Functionsを使用して、URLにindex.html指定しなくてもアクセスできるようにしていきたいと思います。

 

もくじ

① 現在のS3バケットの中身
② サブディレクトリのindex.htmlにアクセスしてみる
③ CloudFront Functionsの設定
④ もう一度、サブディレクトリのindex.htmlにアクセスしてみる
⑤ アクセスできなかった原因の解説

 

① 現在のS3バケットの中身

前回作成したバケットの中に「sub」というフォルダを作成し、その中にindex.htmlをアップロードしています。


 

② サブディレクトリのindex.htmlにアクセスしてみる

CloudFrontのディストリビューションドメイン名にディレクトリ名だけをつけましたが、アクセスできませんね。

------
This XML file does not appear to have any style information associated with it. The document tree is shown below.

(このXMLファイルは関連付けられたスタイル情報を持っていないようです。ドキュメントツリーは以下の通りです。)
------

ディレクトリ名の後ろにindex.htmlとファイル名まで指定するとアクセスできました。

 

③ CloudFront Functionsの設定

「CloudFront」と検索し、CloudFrontのサービス画面に移動します。
aWS 
サ - ヒ ス 
Q cloudfront 
サ - ヒ ス ( 1 ) 
リ ソ - ス New 
プ ロ ク 投 稿 ( 68 ) 
ド キ ュ メ ン ト ( 410 ) 
ナ レ ッ ジ 記 事 ( 67 ) 
チ ュ - ト リ ア ル ( 1 ) 
M ョ 「 ketp ( 2 ( 257 ) 
X 
CloudFront 
ク ロ - バ ル な コ ン テ ン ツ 配 信 ネ ッ ト ワ - ク 
リ ソ -- ス / 焦 点 を 絞 っ た 検 索 用 
① リ ソ - ス 検 索 の 概 要 
ア カ ウ ン ト 0 ) ク ロ ス リ - ジ ョ ン リ ソ - ス を 検 索 結 果 に 表 示 で き る よ う に し ま す 。 セ ッ ト 
ア ッ プ に 要 す る 時 問 は 5 分 以 下 で す 。 
R 部 ou 「 ( eExp 爬 「 に ア ク セ ス 
X 
プ ロ グ 投 稿 
68 件 す へ て の 結 果 を 表 示

 

左側のメニューバーから「関数」を選択します。

 

「関数を作成」をクリックし、新しい関数を作成します。


関数の「名前」を入力し、「関数を作成」をクリックします。

以下のAWSのサンプルコードで「関数コード」を書き換えて、保存します。
aws-samples/amazon-cloudfront-functions

「発行」タブをクリックし、「関数を発行」をクリックします。

 

下に「関連付けられているディストリビューション」が表示されるので、「関連付けを追加」をクリックし、適用したいディストリビューションを選択します。

以上でCloudFront Functionsの設定は終了です。

 

④ もう一度、サブディレクトリのindexファイルにアクセスしてみる

先ほどと同様に、CloudFrontのディストリビューションドメイン名にディレクトリ名だけをつけて、アクセスするとindexファイルが確認できます。



もちろん、ディレクトリ名の後ろにindex.htmlとファイル名まで指定してもアクセスできます。


⑤ アクセスできなかった原因の解説

S3にはフォルダという概念がなく、Key-Value型のデータストアです。
つまり、今回のS3バケットの中にあるキーは以下の2つだけです。

  • index.html
  • sub/index.html

今回のように https://******.cloudfront.net/sub/ というURLにアクセスする時、CloudFrontはS3に"sub/"というキーを探すようにリクエストを送ります。
しかし、S3バケットにあるキーは上記の2つだけで、"sub/"というキーはありません。
そこで、S3はキーが存在しないというエラーを返し、CloudFrontはS3バケットに存在するキーの漏洩を防ぐために「AccessDenied」というエラーを返していました。