EC2でS3(Static Website Hosting)をプロキシしたい
S3を利用して静的コンテンツを配信したい場合、一般的にはS3の Static Website Hosting + CloudFront を利用するのが定石です。
しかし、特定のWAF製品の導入や、細かいキャッシュ制御を行いたい場合、EC2を経由してS3のコンテンツを配信したい場合があります。
今回は、その際の構成を試してみたので、実際の設定ファイルを交えつつ解説していこうと思います。
目次
はじめに
こんにちは。
クラウドソリューショングループのwatanabe.tです。
この記事は アイソルート Advent Calendar 2022 の2日目の記事です。
昨日は suzuki.ko さんの BIG-IPのアラートをメールで送信する でした。ぜひこちらもご覧ください。
さて、早速ですが今回の構成は以下のようになります。
前提条件
本手順を進めるにあたり、以下は実施済みの前提となります。必要に応じて公式ページ等を参考に実施してください。
- AWSアカウントが作成済であること(参考 : AWS アカウント作成の流れ | AWS )
- VPC/サブネットが作成済みであること(参考 : Amazon VPC の使用を開始する | AWS )
- コンテンツを配信するS3バケットが作成済みであること
- プロキシ用のEC2が起動済みで、nginxがインストール済みであること
VPCエンドポイントを設定する
まずは、EC2からのアクセスのみに限定するため、VPCエンドポイントを設定します。
VPCエンドポイントの詳しい説明・設定手順は公式ドキュメントが詳しいため、そちらを参照してください。(参考 : AWS PrivateLink concepts | AWS )
バケットポリシーを設定する
次に、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の静的コンテンツにアクセスする方法を紹介しました。
AWSにもWAFはありますが、自前のセキュリティ対策を行いたい場合などの参考になれば幸いです。
この記事が誰かの役に立つことを祈って。
明日は namiki.t さんの iOS Safari で常にスクロールバーを表示する です。