Loading
BLOG 開発者ブログ

2022年12月2日

EC2でS3(Static Website Hosting)をプロキシしたい

EC2でS3(Static Website Hosting)をプロキシしたいとき


S3を利用して静的コンテンツを配信したい場合、一般的にはS3の Static Website Hosting + CloudFront を利用するのが定石です。


しかし、特定のWAF製品の導入や、細かいキャッシュ制御を行いたい場合、EC2を経由してS3のコンテンツを配信したい場合があります。
今回は、その際の構成を試してみたので、実際の設定ファイルを交えつつ解説していこうと思います。

目次


はじめに

こんにちは。
クラウドソリューショングループのwatanabe.tです。


この記事は アイソルート Advent Calendar 2022 の2日目の記事です。
昨日は suzuki.ko さんの BIG-IPのアラートをメールで送信する でした。ぜひこちらもご覧ください。

さて、早速ですが今回の構成は以下のようになります。



前提条件

本手順を進めるにあたり、以下は実施済みの前提となります。
必要に応じて公式ページ等を参考に実施してください。


VPCエンドポイントを設定する

まずは、EC2からのアクセスのみに限定するため、VPCエンドポイントを設定します。
VPCエンドポイントの詳しい説明・設定手順は公式ドキュメントが詳しいため、そちらを参照してください。
(参考 : AWS PrivateLink concepts | AWS )

VPCエンドポイント設定例


バケットポリシーを設定する

次に、S3のStatic Website Hostingを有効化したあと、インターネットからS3にアクセスできないようにバケットポリシーを設定します。
設定例は以下のようになります。ポイントは aws:sourceVpc ですね。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "<EC2が属するVPC ID>"
                }
            }
        }
    ]
}


nginxにプロキシ設定をする

ここまできたらnginxにプロキシ設定を行い、特定のパスへのアクセスをS3のアドレスへパスするようにします。
このとき、resolverにVPCのDNSアドレスを設定しておきます。
これは、S3は動的IPアドレスのため、アクセス時に適切に名前解決がされるようにするためです。

location  / {
  proxy_pass http://<S3のStatic Website Hostingのアドレス>;
  resolver 10.0.0.2;
}


動作確認

ここまで来たらもう一息です。
Static Website Hostingが有効化されているバケットにコンテンツをアップロードし、EC2経由と直接で、それぞれアクセスしてみます。

EC2経由でアクセスした場合


S3に直接アクセスした場合


おわりに

今回は、EC2をプロキシとして利用して、S3の静的コンテンツにアクセスする方法を紹介しました。

AWSにもWAFはありますが、自前のセキュリティ対策を行いたい場合などの参考になれば幸いです。

この記事が誰かの役に立つことを祈って。

明日は namiki.t さんの iOS Safari で常にスクロールバーを表示する です。



watanabe.tのブログ

クラウドソリューショングループ所属

昔はモバイルアプリ開発を、今はGCP, AWS, Firebaseなどのクラウド周りの提案/開発を行っているエンジニアです。

AWS認定ソリューションアーキテクト取得しました!