こんにちは、クラウドインテグレーション部の加藤ゆです。
S3にはWebサイトエンドポイントで利用するURLと、S3にデフォルトで存在するオブジェクトURLがあります。
静的ページをAWS上で公開する場合、どちらが最適なのでしょうか?
静的Webサイトの公開であれば、Webサイトホスティングが正解だと思っていたのですが、表示は変わらないように見えたため比較しました。
ウェブサイトエンドポイントとは?
静的Web Siteホスティングの機能を有効化した際に、払い出されるエンドポイントです。
メリット
Webサイトの公開で利用する機能が備わっている点が最大のメリットです。
- インデックスドキュメントの設定が可能
- 他オブジェクト、バケット、ドメインへのリダイレクトをサポート
- エラーメッセージがHTML形式で表示されるので視認性が良い
デメリット
- HTTPS通信がサポート外
- 外部からのアクセスで HTTPS を利用する場合は、前段にCloudFrontというサービスの利用が必要
- または、EC2インスタンスでの実装を検討する
- バケットへのパブリックアクセス許可を前提とした機能となる
REST API エンドポイントとは?
S3に元々存在するエンドポイントです。通常、S3にアクセスする際はこちらのエンドポイントが利用され、オブジェクトURLとして表示されています。
REST API エンドポイントとしてS3にデフォルトで備わっているエンドポイントです。
対象のオブジェクトへ階層を辿ると、エンドポイントの記載があるかと思います
オブジェクトのパスがそのままURLとなるので、短い場合は良いのですが
パスが長いオブジェクトだとこんな感じに、↓ちょっとダサめなURLになります。
メリット
- HTTPS通信が可能
- パブリック公開も可+プライベートでアクセス可
デメリット
- Webサイトの公開で利用する機能が備わっていないので、開発が必要になる
- エラーメッセージがXML形式で表示されるので視認性が悪い
比較
機能の比較を記載します。
ウェブサイトエンドポイントと REST API エンドポイントの主な違い
No. | 項目 | REST API エンドポイント | ウェブサイトエンドポイント | 補足 |
---|---|---|---|---|
1 | アクセスコントロール | パブリックコンテンツとプライベートコンテンツの両方をサポート | 公開で読み取り可能なコンテンツのみをサポート | Webサイトホスティングは、バケットへのパブリックアクセス許可を前提とした機能です |
2 | エラーメッセージの処理 | XML 形式 | HTMLドキュメント | 表示形式が変わるので、エラー内容の視認性が変わります |
3 | リダイレクトのサポート | サポート外 | オブジェクトレベルとバケットレベルの両方のリダイレクトをサポート | (Optional) Configuring a webpage redirect - Amazon Simple Storage Service ウェブサイトエンドポイントは、マネジメントコンソールより、別のバケットまたはドメインにリダイレクト設定が可能です |
4 | サポートされるリクエスト | バケットおよびオブジェクトのすべてのオペレーションをサポート | オブジェクトに対しては GET リクエストと HEAD リクエストのみをサポート | ウェブサイトエンドポイントは、GET リクエストと HEAD リクエストのみの利用となります |
5 | バケットのルートでの GET リクエストと HEAD リクエストにレスポンス | バケット内のオブジェクトキーのリストを返す | ウェブサイト設定で指定されているインデックスドキュメントを返す | REST API エンドポイントでは、ブラウザがトップページにアクセスした際、「index.html」を表示する機能はありません |
6 | Secure Sockets Layer (SSL) のサポート | 有り | 無し | ウェブサイトエンドポイントは、HTTPS通信はできません |
特に必要そうな機能は、
「2.エラーメッセージの処理」「3.リダイレクトのサポート」でしょうか。
この機能を使いたい場合は、Webサイトホスティングを有効化し、ウェブサイトエンドポイントを利用する必要があります。
参考
上表の一部項目を抜粋し、説明します。
2.エラーメッセージの処理
ご参考までに、エラーメッセージの表示比較を記します。
【ウェブサイトエンドポイント】HTMLドキュメント
【REST API エンドポイント】XML 形式
5.バケットのルートでの GET リクエストと HEAD リクエストにレスポンス
ドキュメントの文言では、個人的にちょっと理解し辛く、かみ砕いてみました。
【ウェブサイトエンドポイント】バケット内のオブジェクトキーのリストを返す
「オブジェクトキー」ってなんだったっけ、、、
となったのですが、S3の「オブジェクト名」でした。
S3には「フォルダ」「ファイル」という概念がありません。
つまり、「バケット内のオブジェクト名のリストを返す」という意味になります。
バケットを強調表示すると、そのバケットに含まれるオブジェクトのリストが表示されます。表示される名前がオブジェクトキーです。
オブジェクトキー名の作成 - Amazon Simple Storage Service
【REST API エンドポイント】ウェブサイト設定で指定されているインデックスドキュメントを返す
オブジェクト指定のないアクセス(末尾"/"の URL アクセス)には、
インデックスドキュメントの指定が出来ます。
つまりデフォルトページ(ホームページ)の設定が出来るという事です。これは、サブディレクトリにも設定可能です。
インデックスドキュメントとは?
リクエストがウェブサイトのルートまたはサブフォルダに対して行われた場合に Amazon S3 によって返されるウェブページです。
インデックスドキュメントの設定 - Amazon Simple Storage Service
まとめ
Webサイトホスティングでのみ利用可能な機能を、利用する必要があるのか否かが判断ポイントかと思います。
WebサイトエンドポイントはHTTPSに対応いない点が、玉に瑕だなと思いますが
エラーメッセージ処理、リダイレクト処理をマネコン操作で設定できる点はとても便利なのではないでしょうか。
HTTPS利用不可を補う方法としては、接続元IPをバケットポリシーで制御する方法、またはCloudFrontの利用があげられます。
一方、
エラーメッセージ処理、リダイレクト処理は不要、エラーメッセージもXML形式で問題ない、
それよりもS3の外部公開はやめてほしいし、HTTPS通信でないと困る!
という場合は、REST API エンドポイントの利用が適切となります。
AWS認定試験でも、REST API エンドポイントの利用についてはあまり触れられていないので、REST API エンドポイントってどうなの?と思い、記事にしました。
ご覧いただきありがとうございました!