1. ホーム
  2. amazon-web-services

[解決済み] Cloudfrontで静的にホストされたWebサイトのサブディレクトリのデフォルトルートオブジェクトを設定するにはどうすればよいですか?

2022-08-07 03:50:03

質問

Cloudfront 上で静的にホストされた Web サイトのサブディレクトリにデフォルトのルート オブジェクトを設定するにはどうしたらよいでしょうか。 具体的には、私は次のようにしたいです。 www.example.com/subdir/index.html を要求したときに提供されるようにしたいです。 www.example.com/subdir . ちなみに、これはS3バケットに保持された静的なWebサイトを配信するためのものです。 また、オリジンアクセスIDを使用して、S3バケットへのアクセスをCloudfrontのみに制限したいと思います。

さて、CloudfrontがS3やamazonのステートとは異なる動作をすることは承知しています。 具体的には :

CloudFrontのデフォルトルートオブジェクトの挙動は、Amazon S3のインデックスドキュメントの挙動とは異なります。 Amazon S3のインデックスドキュメントの動作とは異なります。Amazon S3バケットをウェブサイトとして構成し、インデックスドキュメントを指定すると、Amazon S3はインデックスドキュメントを返します。 バケットをウェブサイトとして構成し、インデックスドキュメントを指定すると、Amazon S3は、ユーザーがその中のサブディレクトリをリクエストしても、インデックスドキュメントを返します。 バケット内のサブディレクトリをリクエストしても、インデックスドキュメントを返します。 バケット内のサブディレクトリをユーザーが要求した場合でも、Amazon S3はインデックスドキュメントを返します。(インデックスドキュメントのコピーは、すべての サブディレクトリに表示される必要があります)。ウェブサイトとしてのAmazon S3バケットの構成とインデックス・ドキュメントの詳細については バケットをウェブサイトとして構成すること、およびインデックス・ドキュメントについての詳細は、「Hosting Amazon Simple Storage Service』(英語)の「Websites on Amazon S3」(英語)の章を参照してください。 開発者ガイド』の「Hosting Websites on Amazon S3」の章を参照してください。

このように、Cloudfrontではデフォルトのルートオブジェクトを指定できるにもかかわらず、これが機能するのは www.example.com に対してのみ機能し www.example.com/subdir . この困難を回避するために、オリジンのドメイン名をS3によって与えられたウェブサイトのエンドポイントを指すように変更することができます。 これは素晴らしく機能し、ルートオブジェクトを統一的に指定することができます。 残念ながら、これは オリジンアクセスアイデンティティ . 具体的には、上記のリンク先にはこう書かれています。

編集モードに変更します。

Web配信 - [オリジン]タブをクリックし、編集したいオリジンをクリックして[編集]をクリックします。オリジンアクセスIDは、Origin TypeがS3 Originのオリジンのみ作成可能です。 ID のみを作成できます。

基本的に、正しいデフォルトルートオブジェクトを設定するためには、ウェブサイトバケットそのものではなく、S3ウェブサイトエンドポイントを使用します。 これは、オリジン アクセス ID を使用することと互換性がありません。 そのため、私の質問は以下のいずれかに集約されます。

  1. Cloudfront 上で静的にホストされた Web サイトのすべてのサブディレクトリに対して、デフォルトのルート オブジェクトを指定することは可能ですか?

  2. オリジンが S3 バケットではなく S3 ウェブサイトエンドポイントである Cloudfront から提供されるコンテンツのために、オリジンアクセス ID をセットアップすることは可能でしょうか?

どのように解決するのですか?

UPDATE: それは私が間違っていたようです! JBaczuk の回答を見てください。これはこのスレッドで受け入れられた回答であるべきです。

残念ながら、あなたの質問に対する答えは両方とも「いいえ」です。

1. Cloudfront 上で静的にホストされた Web サイトのすべてのサブディレクトリのデフォルトのルート オブジェクトを指定することは可能ですか?

いいえ。 AWS CloudFront docs ...

... デフォルトのルートオブジェクトを定義した場合、エンドユーザがディストリビューションのサブディレクトリを要求しても、デフォルトのルートオブジェクトは返されません。たとえば、次のようにします。 index.html がデフォルトルートオブジェクトで、CloudFrontがCloudFrontディストリビューションのインストールディレクトリに対するエンドユーザーリクエストを受け取ったとします。

http://d111111abcdef8.cloudfront.net/install/

のコピーであっても、CloudFront はデフォルトのルートオブジェクトを返しません。 index.html のコピーがインストールディレクトリにあったとしても、CloudFront はデフォルトのルートオブジェクトを返しません。

...

CloudFrontのデフォルトルートオブジェクトの挙動は、Amazon S3のインデックスドキュメントの挙動とは異なります。Amazon S3バケットをウェブサイトとして構成し、インデックスドキュメントを指定すると、ユーザーがバケット内のサブディレクトリを要求した場合でも、Amazon S3はインデックスドキュメントを返します(インデックスドキュメントのコピーは、すべてのサブディレクトリに表示されなければなりません)。(インデックスドキュメントのコピーは、すべてのサブディレクトリに表示される必要があります)。

2. オリジンが S3 バケットではなく S3 ウェブサイトエンドポイントである Cloudfront から提供されるコンテンツのオリジンアクセス ID を設定することは可能でしょうか。

直接はできません。 CloudFrontのオリジンには、S3バケットか自分のサーバーがあります。

しかし、2番目のオプションは、いくつかの興味深い可能性を開くものです。 これは、あなたがやろうとしていることの目的から外れてしまうかもしれませんが、CloudFrontのオリジンサーバーとしてのみ機能する独自のサーバーをセットアップすることができます。

に対するリクエストが来たとき http://d111111abcdef8.cloudfront.net/install/ に対するリクエストが来ると、CloudFront はこのリクエストをオリジンサーバに転送し、そのサーバに /install . オリジンサーバをどのように設定してもかまいません。 index.html を提供することもできます。

あるいは、この呼び出しを受けるだけの小さなウェブアプリを書いて、とにかくS3から直接取得することもできます。

しかし、自分でサーバーを立ち上げ、そのスケーリングを心配することは、そもそもやろうとしていることの目的を達成できないかもしれないと私は考えています。