いろんな要求が来る年の瀬です。2016年も、もうすぐ終わりですね。
今日のお悩み
- 公開ドキュメントはS3におきたい。
- 独自ドメインでhttps通信したいが、cloudfrontは高いので安い方法で
- Basic認証するサイトとかあるから、それも実現させて欲しい
はて、そんなことできるのかな。
解決
今回は以下の構成で実現させました。
Route53 -> ALB -> EC2(Nginx) -> S3
- サイトの内容はS3においておきます。
- EC2のマイクロインスタンスかナノインスタンスを立てて、Nginxをインストールしてリバースプロキシを設定します。
- ALBはドメイン毎に作成します。紐付け予定の証明書はここで紐付けします。(ACM)
- Route53でドメインとALBを紐付けします
参考サイト
とはいえ、いろんな方法があるかと思います。
今回、実装するにあたって、いろいろな記事を参考にしました。
その上で予算や今後の運用に合わせて選ぶのがベストだと思います。
- S3 コンテンツの Basic 認証 + HTTPS 配信 - Qiita
- nginxでS3へリバースプロキシ | Tech-Sketch
- Amazon S3にてBasic認証をかける | cloudpack.media
- How to configure Nginx to serve statics from Amazon S3
- Nginx as proxy for Amazon S3 public/private files (Example)
- S3+EC2 NginxでBasic認証をかける | Timegraphy
- AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む) | Developers.IO
手順
> S3でサイトの公開準備
- S3でサイトの公開手順については、公式サイトで。
> EC2にNginxを設定する
- Nginxのインストール
sudo yum update
sudo yum install -y nginx
sudo chkconfig nginx on
sudo /etc/init.d/nginx start
- Basic認証用のパスワードファイルの作成
sudo htpasswd -cb .htpasswd_test <User> <PassWord>
- confファイルの設定
- Basic認証ありの場合
- Basic認証用のパスワードファイルのパスを設定します。
- Basic認証ありの場合
server {
listen 80;
server_name test.example.net;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd_test;
proxy_pass test.example.net.s3-website-ap-northeast-1.amazonaws.com/;
}
}
- Basic認証なしの場合
server {
listen 80;
server_name static.example.com;
location / {
proxy_pass static.example.com.s3-website-ap-northeast-1.amazonaws.com/;
}
}
> ALBの設定
- ターゲットグループを作成します
- 上記で作成したEC2インスタンスを登録します
- ヘルスチェックは80/HTTP
- ロードバランサを作成します
- リスナーは443/HTTPS
- この時に取得済みのサーバ証明書を設定します。
- 上記で作成したターゲットグループを設定します。
> Route53の設定
紐付けしたいドメインに対して、上記で作成したALBを設定します。
> 確認
それぞれアクセスしてみます。
OKですね!