Amazon Web Services ブログ

ALB、S3、PrivateLinkによる内部HTTPS静的ウェブサイトのホスティング

Amazon Simple Storage Service (Amazon S3)は、様々な作業を可能にする強力なプラットフォームです。特筆すべき機能として、FQDN でバケットを作成し、バケットのWebサイトのエンドポイントにエイリアスレコードを指定することで、HTTP の静的ウェブサイトをすぐに立ち上げることができます。静的ウェブサイトの HTTPS トラフィックを提供したい場合は、Amazon CloudFront を使用して、キャッシュと HTTPS 証明書の両方を公開ユーザーに提供することができます。

ユーザがイントラネットやプライベートネットワーク内にいる場合は、AWS PrivateLink for S3 のインターフェイスエンドポイントを使用して S3 バケットへのアクセスを提供します。また、ユーザーは portal.example.com のようなフレンドリーなドメイン名を使って静的ウェブサイトにアクセスしたいでしょう。HTTPS は共通の s3-website.<region>.amazonaws.com といったドメイン名で利用可能です。しかし、カスタムドメインでは、TLS証明書を提供するために追加の内部プロキシが必要になります。これは、内部のアプリケーションロードバランサー (ALB)で実現できます。

ソリューション概要

このソリューションは、VPC への既存のプライベート接続と内部 ALB を活用して、カスタム S3 バケットドメインの TLS 証明書をエンドユーザーに提示します。 ALB は AWS Certificate Manager (ACM) を活用し、信頼できる Amazon S3 VPC Endpoint への安全な TLS 接続を維持しながら、エンドユーザーに有効な証明書を提示します。これにより、静的ウェブサイトのカスタムドメイン名の使用が可能になります。
本ブログのアーキテクチャ解説

ウォークスルー

このチュートリアルでは、Amazon S3 VPC Endpoint と、既存の AWS 接続で利用できる Internal ALB を作成します。

前提条件

このチュートリアルでは、以下の前提条件が必要です:

  • AWSアカウント
  • ACMでインポートしたドメインのプライベート証明書またはインポートした証明書(任意のリージョン)
  • ACM証明書と一致するドメイン名の Amazon S3 バケット(”portal.example.com“など)。Amazon S3を使い始める には、こちらをお読みください。また、Amazon S3バケットでの作業 については、こちらをお読みください。
    • バケット上で静的ウェブサイトホスティングを有効にする必要はありません。バケットへのリクエストはプライベート REST API を経由します。
  • 少なくとも2つのプライベートサブネットを持つ VPC
  • 既存の Direct Connect、Site-to-Site VPN、またはクライアント VPN 接続で、VPC に正しくルーティングされていること。これはプライベートインバウンド接続と呼ばれます。
  • カスタムドメイン名の プライベートホストゾーン
  • VPC 内で稼働する Amazon Elastic Compute Cloud(Amazon EC2)インスタンスなど、VPC ネットワークにアクセスできるリソース
  • S3バケットに入力された index.html エントリページを含む静的ウェブサイト

Step 1: Amazon S3 のVPC Endpoint を作成する

ALB を安全かつプライベートにS3バケットに接続するには、まずAmazon S3 VPC Endpointを作成する必要があります。

  1. VPC ダッシュボードにログインします。
  2. 左側のメニューから「エンドポイント」ページに移動します。
  3. 「Create Endpoint」を選択します。
  4. サービスリストで “s3″を検索し、Amazon S3 Interface Endpoint サービスを選択します。S3のインターフェイスエンドポイントの設定
  5. プライベートインバウンド接続を含む VPC と、エンドポイントが属するサブネットを少なくとも 2 つ選択します。インターフェイスエンドポイントのフォールト・アイソレーションを活用するため、2つ以上の異なるアベイラビリティゾーン(AZ)に属するサブネットを選択することをお勧めします。
  6. VPC エンドポイントを保護するセキュリティグループを選択します。このセキュリティグループは、最低でも ALB のセキュリティグループからのポート 80 と 443 でのアクセスを許可する必要があります。セキュリティグループの詳細については、こちらを参照してください。
  7. VPC Endpointのポリシーは “Full Access” を選択します。このポリシーは、VPC で作業している全ての AWS プリンシパルが、どの S3 バケットでも VPC Endpoint にアクセスできるようにします。これは S3 バケットに定義するセキュリティポリシーをバイパスするものではないです。ただし、ALB を作成した後で、このポリシーを制限して ALB へのアクセスのみを許可することもできます。
  8. 「Create endpoint」を選択します。
  9. 新しい VPC Endpoint ID を選択して、新しい VPC Endpoint を作成する画面に移動します。
  10. 下のタブで「Subnets」に移動します。
  11. VPC Endpoint の IPv4 アドレスは後で必要になるのでメモしておきます。サブネットの選択

Step 2: VPCエンドポイントから S3 へのアクセスを許可する

VPC EndpointsのS3バケットポリシーについては、こちらをご覧ください。

  1. S3バケットに移動し、「Permissions」タブに移動します。
  2. 「Bucket policy」までスクロールダウンし、「Edit」を選択します。
  3. 提供されているドキュメントに基づいてポリシーを追加します。参考までに、この提供されたポリシーを使用して、VPC Endpoint のみが明示的に許可されるようにすることもできます。
{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Access-to-specific-VPCE-only",
       "Principal": "*",
       "Action": "s3:GetObject",
       "Effect": "Allow",
       "Resource": ["arn:aws:s3:::yourbucketname",
                    "arn:aws:s3:::yourbucketname/*"],
       "Condition": {
         "StringEquals": {
           "aws:SourceVpce": "vpce-1a2b3c4d"
         }
       }
     }
   ]
}

Step 3: Internal ALB を設定する

内部 ALBは、クライアント向けの TLS 接続を終了します。

  1. AWS ConsoleのEC2ダッシュボードに移動します。
  2. 左側のメニューで、「Load Balancers」を選択します。
  3. 「ロードバランサーの作成」を選択します。
  4. 「Application Load Balancer」ボックスで「Create」を選択する。
  5. ALB に名前を付け、「internal」スキームを選択する。
  6. リスナープロトコルを「HTTPS」に切り替えます。
  7. ALB がサービスを提供するプライベートサブネットを選択します。「Next」を選択します。
  8. クライアントに提供する ACM 証明書を選択します。静的S3バケットのドメイン/名前と一致する必要があることに注意してください。「Next」を選択します。
  9. 既存のプライベート接続がロードバランサーのポート 443 に接続できるようにするセキュリティグループを選択または作成します。「Next」を選択します。
    1. まだ設定していない場合は、ここで定義したALBセキュリティグループへのアクセスを許可するように、VPCエンドポイントのセキュリティグループを更新してください。
  10. HTTPS プロトコルを使用する IP をターゲットとする新しいターゲットグループを作成します。ヘルスチェックでHTTPプロトコルを使用します。「ヘルスチェックの詳細設定」で、「ポートオーバーライド」がHTTPプロトコルと一致するように80に設定されていることを確認します。ターゲットグループの設定
  11. ALB のヘルスチェックホストヘッダーにはドメイン名が含まれないため、S3 は200以外の HTTP レスポンスコードを返します。ヘルスチェックの成功コードに 「307,405」を追加します。「Next」を選択します。
  12. ステップ1で確認した VPC エンドポイントの IP アドレスをターゲットグループに登録します。「Next」を選択します。インターフェイスエンドポイントをターゲットグループへ登録する

ステップ 4: リスナー・ルールの追加設定

Amazon S3 PrivateLink EndpointはREST API Endpoint であるため、末尾のスラッシュを含むリクエストはデフォルトで XML ディレクトリリストを返します。これを回避するには、リダイレクトルールを作成して、末尾にスラッシュを含むすべてのリクエストを index.html に向けるようにします。

  1. 内部 ALB に移動します。それを選択し、「Listeners」タブを開きます。
  2. HTTPS リスナーのテーブルの右側で、「View/edit rules」を選択します。
  3. 上部近くの「+」アイコンを選択し、新しいルールを挿入できるようにします。
  4. 「IF」の下で 「Add Condition」を選択し、「Path…」を選択します。
  5. パスの値の下に 「*/」を入力します。
  6. 「THEN」で 「Add Action」を選択し、「Redirect to…」を選択します。
  7. 「Enter port」の下に 「#{port}」と入力します。
  8. ドロップダウンから「Custom host, path, query」を選びます。
  9. 「パス」を「/#{path}index.html」に修正します。
  10. 右上の「保存」を選択します。設定を保存する

Step 5: DNS を設定し、ALB をテストする

オンプレミスまたはプライベートの DNS エントリを設定し、Internal ALB を指すようにします。Route53 プライベートホストゾーン(PHZs)を使用してプライベートエイリアスレコードを設定し、PHZをVPCに関連付けることができます。また、オンプレミスからのインバウンドDNSクエリをVPCに転送することもできます。

Step 6: ALB をテストする

内部 ALBにアクセスするには、VPC へのプライベートアクセスを持つリソースを使用する必要があります。リソースに接続し、新しいプライベート DNS エントリにナビゲートしてみてください。リソースへのコンソールアクセスしかない場合は、cURL コマンドを使用してプライベート静的ウェブサイトを検証することもできます。

クリーンアップ

クリーンアップのために、このガイドで作成したリソースを以下の順序で削除または元に戻すことができます:

  • Route53 PHZ DNS entries
  • ALB
  • Load Balancer ターゲットグループ
  • Amazon S3 VPCエンドポイント
  • 作成したリソースに関連するセキュリティグループ
  • S3 バケットポリシー

まとめ

この投稿では、Amazon EC2でプロキシをプロビジョニングすることなく、カスタムドメインでプライベートな静的Amazon S3ウェブサイトを作成する方法を学びました。これは、大規模な内部ユーザ・ベースに対して静的ウェブサイトをスケーリングする際に便利です。また、Amazon EC2 プロキシインスタンスのアップグレード、セキュア化、スケーリングと行ったの差別化につながらない重労働を管理する必要がなくなるというメリットもあります。

静的ウェブサイトに認証メカニズムを追加したい場合は、ドキュメントで提供されている使用例の1つを使用してALB を使用して認証を活用するか、AWS Verified Access を使用することができます。