LoginSignup
15
19

More than 5 years have passed since last update.

【AWS】ロードバランサー+ApacheでHTTPSリダイレクトをしてみる

Last updated at Posted at 2017-09-20

AWSのEC2インスタンス上に立てたApacheサーバーを、HTTPSリダイレクトできるように設定してみます。

環境:
Apache2.4

前提:サーバー証明書

今回はHTTPSリダイレクトを実現するので、もちろんサーバー証明書が必要となります。AWSではCertification Manager(通称ACM)という無料でサーバー証明書が発行できるサービスがあるので、それを利用します。

ですがこのサーバー証明書、EC2インスタンス上に置くことはできず、CloudFrontもしくはLoadBalancerに置いてEC2インスタンスに接続するという形を取らなければなりません。

今回はこの二つのうち、より一般的そうなLoadBalancerを用いた場合の設定方法を書いていきます。

このサーバー証明書の発行に関して、またCloudFrontでの利用についてはここでは割愛します。(また今度書きます)

本題:環境構築

EC2インスタンスの作成

今回はAmazon Linuxで作成します。セキュリティグループのインバウンド設定は以下のようにします。

タイプ ポート範囲 ソース
HTTP 80 0.0.0.0/0
SSH 22 [マイIP]

ロードバランサーはHTTPSのリクエストも内部的にはHTTPとして扱っているので、EC2の設定としては80番ポートのみ開けておけばリクエストは通ります。SSHを開けてあとでApacheのセットアップをします。

これで起動します。

ロードバランサーの作成

Application Load Balancerを用います。

ロードバランサーの設定

リスナーにHTTPS(443)を追加します。

Screen Shot 2017-09-20 at 16.32.20.png

セキュリティ設定の構成

「ACMから証明書を選択する(推奨)」を選択し、証明書を選択します。

セキュリティグループの設定

今回は

  • HTTPのリクエストをHTTPSにリダイレクト
  • HTTPSのリクエストはそのまま通す

という設計なので、HTTP/HTTPS共に受け付けるように下のように設定します。

タイプ ポート範囲 ソース
HTTP 80 0.0.0.0/0
HTTPS 443 0.0.0.0/0

ルーティングの設定

ヘルスチェックの詳細設定において、成功コードをリダイレクトの301にしないといけないそうです。

Screen Shot 2017-09-20 at 16.41.55.png

ターゲットの登録

先ほど作成したEC2インスタンスをポート80でターゲットグループに追加します。

以上で作成完了です。

Apacheの設定

それでは実際にリダイレクトの設定をApacheの方で行なってみます。

Apacheのインストール

バージョンは2.4です。

$ sudo yum install -y httpd24
$ sudo apache start

デフォルトでドキュメントルートは/var/www/htmlなのでそこをドキュメントルートとしてやっていきます。

.htaccessの設定

リライトの設定はこのファイルに書いていきます。以下のように書いて、ドキュメントルート(ここでは/var/www/html)におきます。

RewriteEngine On

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)?$ https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]

.htaccessにおけるリダイレクトでは基本的に

RewriteCond
RewriteRule
...

という繰り返しで書くことが多く、ある条件(RewriteCond)に合致するものに対し、あるルール(RewriteRule)に基づき、アドレスのリライトを行うと考えればわかりやすいかと思います。

ここで注意していただきたいのが、HTTP環境変数です。「.htaccess 書き方」などのキーワードでググった結果をそのままコピペしても、この場合うまくいかない可能性が高いです。なぜならApacheサーバーとクライアントの間にロードバランサーがいるからです。

クライアントからどのようなHTTPリクエストが来たかを判別するため、AWSではX-Forwardedというプレフィックスのついたリクエストヘッダーを用いることができます。

そのため、httpsか否かの判定には%{HTTPS}や%{SERVER_PORT}ではなく%{HTTP:X-Forwarded-Proto}、ホスト名の判定には%{HTTP_HOST}や%{SERVER_NAME}ではなく%{HTTP:Host}を用います。

%{HTTPS}や%{SERVER_PORT}ではEC2インスタンスが通信に用いているHTTPが表示され、%{HTTP_HOST}や%{SERVER_NAME}ではEC2インスタンスのIPアドレスが表示されると思います。

httpd.confの設定

先ほど.htaccessを書いてドキュメントルートに置きましたが、このままではその設定は有効になりません。

  • httpd.confで.htaccessの有効化
  • httpdの再起動

をして初めて有効になります。

httpd.conf(初期設定では/etc/httpd/conf/にある)の次のAllowOverrideをNoneからAllに変えてやります。「htaccess」とかでファイル検索をかければすぐ見つかると思います。

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

これで変更を保存し、apacheを再起動してください。

$ sudo apache restart

httpd.confの設定(追加)

mod_rewriteのログがみたかったのでついでにその設定もしてみました。検索するとRewriteLogLevelを.htaccessに書いている記事が多くあったのですが、上手くいかなかったので詳しく調べるとApache2.4系ではログは全部まとめてerror_logに吐かれるようでした。加えて、.htaccessへの記述はサポートされていないとのことだったので以下のようにhttpd.confに追記します。

LogLevel info rewrite:trace8

以上で完了です。これでロードバランサーを介してHTTPSリダイレクトが実現できました。

参考

https://www.crosshead.co.jp/blog/apache-alb-http-to-https
https://murashun.jp/blog/20141229-01.html
http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html
https://blog.cles.jp/item/8180
https://stackoverflow.com/questions/23054592/htaccess-loglevel-not-allowed-here

15
19
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
15
19