7
4

ALBとAmazon S3によるプライベートネットワーク向けのHTTPS静的ウェブサイトの構築について

Last updated at Posted at 2024-03-14

富士通株式会社 パブリック&ヘルスケア事業本部 吉本 弘毅

はじめに

クラウドスマートな環境構築において、Amazon Simple Storage Service (以降、S3)は根幹となるマネージドサービスです。S3は優秀なオブジェクトストレージであり、様々な機能を提供できる可能性を持っています。
本記事では、S3とALB ( Application Load Balancer )を用いて、プライベートネットワーク向けの静的ウェブサイトの構築実践と、得られた気付きについて解説します。

目次

  1. 背景
  2. 想定する構成
  3. S3とは?
  4. AWS PrivateLinkとは?
  5. ALBとは?
  6. 環境設定
  7. 実践して得られた気付き
  8. 本構成におけるコスト
  9. まとめ

1. 背景

「地方公共団体情報システム標準化基本方針1」に基づき、全国各地方自治体は2025年度までに主要な基幹業務システム(税システム、住民記録システムなど)を、ガバメントクラウド上に移行することを目指しています。
 これらのシステムは個人情報を扱う観点から、インターネットから隔絶したネットワーク環境が必要となりますが、これにより、Amazon S3の静的Webホスティング機能は使えません。
 しかし、適切な設定を行うことでAmazon S3にはプライベートなアクセスが可能となり、これにより様々な用途に利用できるようになります。
 次の項目では、このAmazon S3、プライベートアクセスに必要な各機能について説明します。

「地方公共団体情報システム標準化基本方針」とは
地方公共団体の情報システムに関する標準化の基本的な方針です。地方公共団体が情報システムを構築・運用する際、公共サービス全体の利便性向上のため、標準化やクラウドシフトを進める基準を示したもの

2. 想定する構成

 静的ウェブサイトとしての構成を以下に示します。

構成図.jpg

 バックエンド部分をS3で構成し、公開したいHTMLファイルを格納します。AWS PrivateLinkとして、インターフェース型のVPNエンドポイントを作成します。フロント部分をApplication Load Balancerを構築し、ターゲットグループに、VPNエンドポイントを指定します。
 公開したい静的Webサイトとしては、仮想のFQDN「www.example.co.jp」とします。内部向けの静的Webサイトのため、各クライアントは「https:// www.example.co.jp/home.html」を参照させ、PDFファイルを「https:// www.example.co.jp/documents/pdf/aaa.pdf」からダウンロードできるようにします。

www.example.co.jp  ---バケット
└home.html          ---ファイル
    └documents   ---フォルダ
        └pdf    ---フォルダ
          └aaa.pdf  ---ファイル
          └bbb.pdf ---ファイル

次項にて、使用するそれぞれの機能について解説します。

3. S3とは?

 S3は、全体容量に制限がない高可用性(99.999999999% (11 ナイン))のオブジェクトストレージサービスです。クラウドスマート実現の土台と言える、サービスです。S3に格納されたデータは、EC2のみでなく、AWSの多くのサービスと連携することができるようになります。
 主な特徴について以下に示します。

代表的な機能 説明
ストレージクラス データの使用頻度やアクセス必要性に応じて、様々なストレージクラスを提供し、コストとパフォーマンスを最適化することができます。
データ転送 大量のデータを効率的に転送するための機能を提供しています。例えば、クロスリージョンレプリケーションを使用すれば、別リージョンへデータを高速に同期させることができます。
データ管理 ライフサイクル管理機能を提供しています。これにより、データの保存期間やストレージクラスの移行を自動的に管理することができます。
セキュリティとコンプライアンス データの暗号化、アクセス管理、監査ログなど、強力なセキュリティ機能を提供しています。
イベント通知 特定のイベント(例えば、オブジェクトの作成や削除)が発生した際、通知を送る機能を提供しています。これにより、リアルタイムのデータ処理やワークフロー開始の自動化を実現することができます。
バージョニング オブジェクトのすべてのバージョンを自動的に保存する機能を提供しています。これにより、誤ってデータを削除したり上書きしたりした場合でも、以前のバージョンを復元することができます。
エンドポイント オブジェクトストレージとしてのREST APIエンドポイントと、静的ウェブサイトホスティング機能のウェブサイトエンドポイントの2つをサポートします。ウェブサイトエンドポイントでは、Apacheのようにエラーメッセージ表示や、リダイレクトをサポートしますがパブリックアクセスに限定されます。

上記の中でエンドポイントは、今回検討する静的ウェブサイトホスティングに最も関連がある機能です。以下にS3で使用できる2つのエンドポイントついて紹介します。

違いとなる機能 REST APIエンドポイント ウェブサイトエンドポイント
アクセスコントロール パブリック/プライベート パブリック
エラーメッセージの処理 XML 形式のエラーレスポンス HTML ドキュメント
リダイレクトのサポート -(無し) オブジェクトレベルとバケットレベルの両方でリダイレクトをサポート
サポートされるリクエスト バケットおよびオブジェクトのすべてのオペレーション オブジェクトに対するGET リクエストと HEAD リクエストのみ
バケットのルートでの GET リクエストと HEAD リクエストにレスポンス バケット内のオブジェクトキーのリスト ウェブサイト設定で指定されているインデックスドキュメント
SSL接続 S3単独でSSL接続をサポート -(無し)

 冒頭にも触れましたが、S3が持つ静的ウェブサイトホスティングはこのウェブサイトエンドポイントの仕様上、パブリックアクセスが必要となり、プライベートアクセスに限定した場合は使用できません。
 REST APIエンドポイントは、プライベートアクセスが可能なため、使用できるリクエストをGETに絞り込み、静的ウェブサイトのように動作させます。
 またエラーメッセージやリダイレクトについては、REST APIエンドポイントで実装することはできませんが、後に説明するApplication Load Balancerで補完することができます。

4. AWS PrivateLinkとは?

 AWS PriveteLinkはVPCエンドポイントにおける各サービスへのプライベート接続を示しています。以下3つの型があります。

利用方法 対象サービス
ゲートウェイ型 VPC内からFQDNで接続。AWS側で冗長化済み。パブリックアクセスが必要。 AmazonS3、DynamoDBのみ
インターフェース型 FQDNまたは、IPアドレスによる接続。各AZに、ENIを作成し、設計者により冗長化を決定する。 AmazonS3、DynamoDBを含む主要サービス
Gateway Load Balancer型 FQDNまたは、IPアドレスによる接続。各AZに、ENIを作成し、設計者により冗長化を決定する。ルートテーブルにより、通信経路として通過させる。 仮想アプライアンス(IPS/IDSのような)を経由させるように、通信パケットに対し、セキュリティ的なサービスを提供する

S3は、ゲートウェイ型とインターフェース型の両エンドポイントでアクセスすることができます。ここでは、プライベートネットワークを経由してのアクセスが必要ですので、インターフェース型のエンドポイントを選定します。

5. ALB とは?

 AWSではマネージドな仮想ロードバランシングサービスとして「Elastic Load Balancing(以降、ELB)」があります。ELBには、Application Load Balancer(以降、ALB)、Network Load Balancer、Classic Load Balancerの3つのタイプがあり、それぞれ異なるユースケースに最適化されています。
以下に主な特徴を説明します。

ALBの特徴 説明
トラフィック分散 アプリケーションへのトラフィックを複数のAmazon EC2インスタンス、コンテナ、IPアドレスに自動的に分散します。これにより、パフォーマンスを向上させ、耐障害性を確保します。
スケーラビリティ トラフィックの量に応じて自動的にスケールアップ・ダウンします。ただし、突発的なトラフィックの増加によりスケーリングが間に合わない場合、応答遅延や、タイムアウトが発生します。これを防ぐため、「Pre-Warming(暖気運転)」という方法により、事前にスケーリングを確保できます。ただし、申請にはBusiness/Enterpriseサポートが必要となります。
ヘルスチェック ターゲットとなるEC2インスタンスやコンテナのヘルスチェックを行い、問題があると判断したターゲットへのトラフィックを自動的に停止します。
SSLリダイレクション SSL通信を復号化して、バックエンドサーバに通信させます。バックエンドのサーバからこの負荷を取り除くことができます。

ALBはレイヤー7に最適化されており、HTTP/HTTPS通信をロードバランシングすることができます。
 ALBは、リスナーとターゲットグループという設定があります。リスナーは、ロードバランシング元のプロトコルとポート番号の設定し、ターゲットグループはロードバランシング先のターゲット(例えばEC2など)のグループを設定します。
 リスナーは、挙動に合わせてルールを設定することができます。例えば、今回想定しているURL「https:// www.example.co.jp」について、「/home.html」以外の要素にアクセスしようとした際、正しいターゲット「https:// www.example.co.jp/home.html」にリダイレクトや、エラーメッセージを表示させることが出来ます。なお「6.環境設定」ではエラーメッセージの対処をしておりませんが、「7.1 ユーザビリティ」について、実際のエラー画面とともに解説します。
 

6. 環境設定

 先ほどまで紹介したS3、AWS Private Link、ALBのそれぞれについて設定していきます。なお、Private LinkはS3より先に構築することで、S3のバケットポリシーを最小限のアクセスに設定できます。

6.1. 前提条件

 環境設定にあたり、以下を前提条件とします。

  • VPC、サブネット、セキュリティグループ、ACL、Transit Gatewayについては適切な設定がなされていること
  • 「www.example.co.jp」についてRoute53等でクライアントからの名前解決に必要な設定がなされていること
  • ALBに使用する証明書等について準備済みであること

6.2. AWS Private Linkの環境設定

  1. サービスメニューから「VPC」を選択
  2. VPCダッシュボードが表示されたら、左ペインで「エンドポイント」を選択
  3. 「エンドポイント」ページで、「エンドポイントの作成」ボタンをクリック
  4. 「エンドポイントの作成」ダイアログボックスが表示されます。ここで、以下の情報を入力
    • サービスカテゴリ: 「AWSサービス」
    • VPC: エンドポイントを作成するVPCを選択
    • サービス名: 「com.amazonaws.[リージョン].s3」を選択
    • エンドポイントタイプ: 「インターフェース」を選択
  5. エンドポイントを作成するサブネットを選択
    • 冗長性を高めるため、2AZ以上のサブネットで複数選択すること
  6. セキュリティグループ: エンドポイントに適用するセキュリティグループを選択
  7. 全ての情報を入力したら、「エンドポイントの作成」ボタンをクリック
  8. 作成後、以下の情報を控える
    • エンドポイント ID:S3バケットのバケットポリシーの設定に使用
    • VPCエンドポイントのIPv4アドレス:ALBのターゲットグループの設定に使用

6.3. S3の環境設定

  1. サービスメニューから「S3」を選択
  2. S3ダッシュボードが表示されたら、「バケットを作成する」ボタンをクリック
  3. 「バケットを作成する」ダイアログボックスが表示されます。
    • バケット名はFQDNと同じにする。※ここでは、「www.example.co.jp」とする。
  4. リージョン:バージョニング、サーバーアクセスログ、タグなど任意にオプションを設定します。
    • プライベートネットワーク向けの環境のためパブリックアクセスブロックはオンとする
  5. バケットポリシーについて、注意点としては以下となります。
    • 静的Webサイトとして機能させるのであれば、許可するアクションは「Get」のみとし、不要なアクションは削除する
    • エンドポイントは、先ほど作成したインターフェース型のエンドポイントのみにアクセスを許可するよう設定する
サンプル
{
    "Version": "2012-10-17",
    "Id": "S3-Console-Auto-Gen-Policy-1234567890123",
    "Statement": [
                {
            "Sid": "Statement",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [ "arn:aws:s3::: www.example.co.jp/*",
                          "arn:aws:s3::: www.example.co.jp/documents/pdf/*"],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-12345678901234567"
                }
            }
        }
    ]
}

6. バケット作成後、「home.html」をバケット直下に配置
7. バケット内で、「documents」-「pdf」のフォルダを作成し、「aaa.pdf」「bbb.pdf」を配置

6.4. ALBの環境設定(ターゲットグループの作成)

  1. サービスメニューから「EC2」を選択
  2. EC2ダッシュボードが表示されたら、左ペインで「ターゲットグループ」をクリック
  3. 「ターゲットグループ」ページで、「ターゲットグループの作成」ボタンをクリック
  4. 「ターゲットグループの作成」ダイアログボックスに以下を情報を入力
    • 名前: ターゲットグループの名前
    • ターゲットタイプ: IPアドレスを選択し、VPCエンドポイントのIPアドレスを入力
    • プロトコル: HTTPを選択
    • ポート: ターゲットと通信するためのポート番号「80」を入力
    • VPC: ターゲットグループを作成するVPCを選択
  5. ヘルスチェックの設定で、成功コードは「307」を設定
  6. 全ての情報を入力したら、「次のステップ」ボタンをクリック
  7. 「登録と作成」をクリックし、ターゲットを登録

6.5. ALBの環境設定(ALBの作成)

  1. サービスメニューから「EC2」を選択
  2. EC2ダッシュボードが表示されたら、左ペインで「ロードバランサー」をクリック
  3. 「ロードバランサー」ページで、「ロードバランサーの作成」ボタンをクリック
  4. 「ロードバランサーの種類の選択」ページで、「Application Load Balancer」を選択
  5. 「次のステップ」ボタンをクリック
  6. 「ロードバランサーの設定」ページで、以下の情報を入力
    • 名前: ロードバランサーの名前(任意)を入力
    • スキーム: 内部(プライベート)を選択
    • IPアドレスタイプ: ipv4を選択
    • FQDNに一致する証明書を登録
    • 可用性ゾーン: ロードバランサーを配置するVPCとサブネットを選択
    • リスナー: リスナーのプロトコル「https」とポート「443」を設定
    • 他設定について以下表のように設定
設定項目 ルール1 ルール2 デフォルトルール
条件 HTTPホストヘッダー www.example.co.jp 他のルールが適用されない場合
パス /pdf/* /*
アクション アクション:
ターゲットグループへ転送
(6.4で作成したターゲットグループ)
グループレベルの維持設定 オフ
優先度 1 2 最後
  1. 「セキュリティ設定の設定」、「セキュリティグループの設定」、「ルーティングの設定」、「ターゲットの登録」の各ステップで必要な設定を行う
  2. 全ての設定が完了したら、「レビュー」をクリックし、設定内容を確認する
  3. 問題がなければ、「作成」をクリック

6.6. 動作確認

  1. クライアントから、「https:// www.example.co.jp/home.html」にアクセスし、想定したHTMLが表示されること
  2. 同様に、「https:// www.example.co.jp/documents/pdf/aaa.pdf」および、「https:// www.example.co.jp/documents/pdf/bbb.pdf」にアクセスし、配置したPDFがブラウザ上に表示されること

7. 実践して得られた気付き

 S3を用いたプライベートネットワーク向けの静的ウェブサイトを構築実践した際に、得られた気づきについて紹介します。

7.1. ユーザビリティ

 エラーメッセージについて注意が必要です。
 Apacheを使うと、存在しないパスにアクセスした場合、例えば「https:// www.example.co.jp/documents/ccc.html」など、ユーザーをトップページにリダイレクトさせるか、「404 not found」のエラーメッセージを表示させることが可能です。しかし、今回の設定では、エラーが発生した際にはXML形式のエラー画面が表示されます。

エラー画面.jpg

 この他にも、パスの最後が「/」で終わる場合も、同様のエラーが表示されます。
存在しないパスへのアクセスについては、Application Load Balancerが一部を補完できるので参考にしてください。「6.5 ALBの環境設定(ALBの作成)」の手順5で作成したリスナールール2とデフォルトルールを以下のように変更します。

設定項目 ルール1 ルール2 デフォルトルール
条件 HTTPホストヘッダー www.example.co.jp 他のルールが適用されない場合
パス /pdf/* /home.html
アクション アクション:
ターゲットグループへ転送
(6.4で作成したターゲットグループ) 固定レスポンス
レスポンスコード:404
レスポンス本文:404 not found
コンテンツタイプ:
text/html
グループレベルの維持設定 オフ
優先度 1 2 最後

 この設定により、どのリスナールールも適用されなかった場合に「404 not found」を表示できるようになりました。しかし、「https://www.example.co.jp/pdf/ccc.pdf」のように存在しないファイルへのアクセスでは、同じエラーが表示されるため、完全な解決策ではありません。
 リスナールールが多すぎるとコストが増えたり、メンテナンスが難しくなる可能性があるため、環境に合わせて適切な対策を考える必要があります。

7.2. 性能

 本構成では、S3自体の転送速度に依存しますが、簡単なHTMLの表示においてはあまり意識することはなく、他ネットワーク要素(回線の帯域など)の方が、大きく影響すると考えられます。
 ただし、1秒あたりのリクエスト数に応じて、段階的にスケーリングが行われるため、スパイク的な同時アクセスが見込まれる環境では注意が必要です。

7.3. 運用保守性

 EC2で、例えばRHEL上にApacheをインストールして、同様の構成を構築した場合、OS自体の管理や、セキュリティ対策が別途必要になりますが、S3では不要です。
 また、アクセスログについては、Apacheで取得できる情報とは異なりますが、ALBのログと併用して、最低限の運用上必要な情報は取得できると言えます。

8. 本構成におけるコスト

 S3、Private Link、ALBのそれぞれのコストについて、以下に試算しました。
アクセス数や、転送データ量に応じてコストは変動しますので、Pricing Calculatorで試算してみてください。

No サービス 料金 試算の前提・補足
1 S3 ・Tiered price for: 40 GB
40 GB x 0.025 USD = 1.00 USD
合計階層コスト = 1.00 USD (S3 Standard ストレージのコスト)
・1,000 S3 Standard ストレージの PUT リクエスト x 0.0000047 USD /リクエスト = 0.0047 USD (S3 Standard PUT リクエストのコスト)
・400,000 GET リクエスト (1 か月間) x 0.00000037 USD /リクエスト = 0.148 USD (S3 Standard GET リクエストのコスト)

1 USD + 0.148 USD + 0.0047 USD = 1.15 USD (S3 Standard ストレージ、データリクエスト、S3 選択の合計コスト)
S3 Standard のコスト (毎月): 1.15 USD
リージョン:アジアパシフィック(東京)
ストレージクラス:S3標準
使用容量:40GB
S3へのリクエスト(イン):1000回/月
S3へのリクエスト(アウト):400000回/月(1日あたり約13000回程度閲覧)
データ転送:同一リージョン内のみ
※別リージョンへのデータ転送や、では、データ転送量に応じた費用が加算されます。
2 PrivateLink ・2 VPC エンドポイント x 2 VPC エンドポイントあたりの ENI x 730 時間 (1 か月) x 0.014 USD = 40.88 USD (エンドポイント ENI の 1 か月あたりの料金)
インターフェイスエンドポイントの月単位のコスト: 40.88 USD
・Tiered price for: 40 GB
40 GB x 0.01 USD = 0.40 USD
合計階層コスト = 0.40 USD (PrivateLink のデータ処理コスト)
データ処理コストの合計: 0.40 USD

40.88 USD + 0.40 USD = 41.28 USD (PrivateLink の合計コスト)
PrivateLink エンドポイントとデータ処理コストの合計 (毎月): 41.28 USD リージョン:アジアパシフィック(東京)
VPCエンドポイントの数:2
使用するAZの数:2
エンドポイントで処理されるデータ量:40GB/月
(1回あたりのアクセスで約3MB)
※Direct Connect等他ネットワーク要素の費用は含まれていません。
3 ALB ・1 ロードバランサー x 0.0243 USD /時間 x 730 時間 (1 か月) = 17.74 USD

Application Load Balancer の固定時間料金 (毎月): 17.74 USD
ALBの数:1
4 ・単位変換
処理されたバイト (EC2 インスタンスおよび IP アドレスのターゲットとして): 40 GB あたり 月 x 0.00136986 1 時間あたりの月数 = 0.0547944 GB あたり 時間
・料金の計算
0.0547944 1 時間あたり GB / 1 ターゲットとしての EC2 インスタンスおよび IP アドレスの LCU あたりの処理バイト数 (GB)/時間 = 0.0547944 EC2 インスタンスと IP アドレスをターゲットとして処理されたバイト数 の LCU
10 新しい接続数/秒 / 25 LCU あたりの新しい接続数/秒 = 0.40 新しい接続の LCU
1 ルール/リクエスト - 10 無料ルール = -9 無料ルール 10 件後の 1 リクエストあたりの有料ルール
Max (-9 USD, 0 USD) = 0.00 1 リクエストあたりの有料ルール
Max (0.0547944 処理されたバイト数の LCU, 0.4 新しい接続の LCU, 0 アクティブ接続の LCU, 0 ルール評価の LCU) = 0.40 最大 LCU
1 ロードバランサー x 0.40 LCU x 0.008 LCU 料金/時間 x 730 時間/月 = 2.34 USD

Application Load Balancer LCU の使用料金 (毎月): 2.34 USD
ALBを経由するデータ量:40GB/月

9. まとめ

 S3とALB ( Application Load Balancer )を用いて、プライベートネットワーク向けの静的ウェブサイトの構築実践について、紹介させていただきました。
 この構成であれば、例えば、組織内のみで一時的に共有したいドキュメントや、ファイルをスピーディに、低コストに提供することができます。
 また、データ自体をS3に配置することで、AWSの他のサービス(例えばAmazon RDS、Amazon Redshiftなど)とも統合的にデータを使用することができ、分析や加工など、様々な用途で、データを利用することで、クラウドスマート(クラウドを賢く適切に利用する)の一歩としてご検討いただければと思います。
最後までお読みいただき、ありがとうございました。

参考文献

  1. “地方公共団体情報システム標準化基本方針”2023年9月公開

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4