[解決済み] Cloudfrontで静的にホストされたWebサイトのサブディレクトリのデフォルトルートオブジェクトを設定するにはどうすればよいですか?
質問
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 を使用することと互換性がありません。 そのため、私の質問は以下のいずれかに集約されます。
-
Cloudfront 上で静的にホストされた Web サイトのすべてのサブディレクトリに対して、デフォルトのルート オブジェクトを指定することは可能ですか?
-
オリジンが 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から直接取得することもできます。
しかし、自分でサーバーを立ち上げ、そのスケーリングを心配することは、そもそもやろうとしていることの目的を達成できないかもしれないと私は考えています。
関連
-
[解決済み】aws cli: update-kubeconfig が期待通りに動作しない。
-
[解決済み】S3 Bucket アクションがどのリソースにも適用されない
-
[解決済み] aws cloudformationはリストでFn::Joinを使用します。
-
[解決済み] クラウド形成リソース作成における複数条件
-
[解決済み] AWSでロールを引き受ける際のRoleSessionNameのユースケースとパフォーマンスへの影響について
-
[解決済み] Amazon Redshift - CSVからのCOPY - 行に二重引用符が一つある - CSVの引用符の書式が無効である エラー
-
[解決済み] アクセスポイントを経由してAmazon S3へのロールを認可する
-
[解決済み] List<AWS::EC2::Subnet::Id> 型のパラメータをネストしたCloudFormationテンプレートに渡す。
-
[解決済み] CLOUDFRONT EC2オリジンエラー CloudFrontはオリジンとの接続を確立しようとしました[重複]。
-
[解決済み] DynamoDB Upsert - Update or Create?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】あなたのWSGIPathは、存在しないファイルを参照しています。
-
[解決済み】DynamodbとRedisの比較
-
[解決済み] EIP:AddressLimitExceeded
-
[解決済み] エラー: networkMode 'awsvpc' が指定された場合、ネットワーク構成を提供する必要があります。
-
[解決済み] RDS は、以下の組み合わせでの DB インスタンスの作成をサポートしていません。
-
[解決済み] ec2 インスタンスのステータスチェックに失敗しました
-
[解決済み] CLOUDFRONT EC2オリジンエラー CloudFrontはオリジンとの接続を確立しようとしました[重複]。
-
[解決済み] CLIコマンドでAWSグルージョブを作成する方法とは?
-
[解決済み] Terraform AWS Provider の有効なクレデンシャルソースが見つかりません。
-
[解決済み] aws-cliでdynamodbのitemを返却する方法