前書き
wordpressの構築の説明は省きます。
今回はACM(AWS Certificate Manager)からSSL証明書を発行し、ALBを作成後、HTTPS接続させることを行いました。
前提条件
・WordpressサーバーはEC2インスタンスで作成されているものとします。
・お名前ドットコムでドメインを購入。(shunwakawaka.blog)
・Elastic IPでwebサーバーがあるインスタンスに関連付けされている。
・Route53でIPとドメインの名前解決がしてある。
・DBはRDSを使用しています。
実践
①AWS Certificate Manager(ACM)からSSL証明書を発行
②Elastic Load Balancing(ELB)作成
③.htaccessファイルとwp-config.phpファイルに設定を追記
①AWS Certificate Manager(ACM)からSSL証明書を発行
手順
1.AWS Certificate Manager(ACM)のコンソール画面から〔証明書をリクエスト〕をクリック
2.証明書タイプを〔パブリック証明書をリクエスト〕を選択し、〔次へ〕をクリック
3.ドメイン名に購入したドメイン名を記載
検証方法は〔DNS検証〕を選択
キーアルゴリズムは〔RSA 2048〕を選択
〔リクエスト〕をクリック
6.Route53にCNAMEレコード作成され、先ほどの検証ステータスが成功となっていたら終了
②Elastic Load Balancing(ELB)作成
手順
1.EC2のコンソール画面に移動
2.ロードバランンシングのターゲットグループをクリックし、
〔Create target group〕をクリック
3.ターゲットタイプは〔インスタンス〕を選択し、任意のターゲットグループ名を付ける
※EC2インスタンス単位でロードバランシングするため。
ヘルスチェックのプロトコルはHTTPでヘルスチェック先のパスは/wp-admin/admin-ajax.phpと入力し、〔次へ〕をクリック
※/wp-admin/admin-ajax.phpはハートビートAPIエンドポイントで、WordPressのアプリケーションとしての正常性を確認するために使用されているため。
4.起動しているインスタンスにチェックを入れ、80ポートであることを確認し、
〔Include as pending below〕をクリック
5.〔Review targets〕にて対象のインスタンスが〔Pending〕になっていることを確認し、 〔Create target group〕をクリック
6.ターゲットグループの作成に成功したことを確認
7.ELBのセキュリティーグループを作成するため、
EC2ダッシュボードの左より〔セキュリティグループ〕をクリック
アウトバンドルールで以下の通りに設定し、〔セキュリティーグループを作成〕をクリック
9.EC2ダッシュボードの左メニューより〔ロードバランサー〕をクリックし、〔Create load balancer〕をクリック
10.Application Load Balancerを選択
Network mappingの設定で使用するVPCとサブネットを2個選択
※サブネットはインスタンスが所属しているサブネットを選択
セキュリティグループ設定は先程作成した、
ELB用のセキュリティグループを設定
「default」のセキュリティグループの右の「✖︎」をクリックし、削除
〔Add listener tag〕を押し、プロトコルを〔HTTPS〕と〔HTTP〕を選択ターゲット選択画面にて先程作成したターゲットを選択
〔Secure listener settings〕で先ほど作成したSSL証明書を選択
12.先程のターゲットグループの画面に遷移し、〔web-target〕の〔targets〕を確認する。
Health statusが緑表示で〔healthy〕になっていることを確認する。
③.htaccessファイルとwp-config.phpファイルに設定を追記
手順
1.SSH接続でwebサーバーにログイン
2.wp-config.phpの設定を追加
#cd /var/www/html/
#vi wp-config.php
追記
$_SERVER['HTTPS']='on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS']='on';
この設定は、サーバーにHTTPS接続が使用されていることを示します。
define('FORCE_SSL_LOGIN', true);
この設定は、WordPressのログインページで常にSSL接続を使用するように設定します。
define('FORCE_SSL_ADMIN', true);
この設定は、WordPressの管理画面で常にSSL接続を使用するように設定します。
3..htaccessの設定を追加
#vi .htaccess
追記
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
# systemctl restart httpd
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
この設定は、X-Forwarded-Protoヘッダーがhttpsでない場合に、リライトルールを実行します。このヘッダーは、クライアントが使用しているプロトコルを示すもので、この設定によって、クライアントがHTTPSでアクセスしているかどうかを判断します。
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
この設定は、リクエストされたURLをHTTPSにリダイレクトします。
^/?(.) というパターンにマッチするリクエストURIを HTTPS にリダイレクトするように設定されています。ここで、^/? はリクエストURIの先頭にスラッシュがあるかどうかをチェックし、(.) はスラッシュ以降の任意の文字列をキャプチャします。
次に、https://%{HTTP_HOST}/$1 というリダイレクト先のURLが指定されています。ここで、%{HTTP_HOST} はリクエストヘッダーに含まれるホスト名を取得し、$1 は前述のキャプチャグループでマッチした文字列を挿入します。つまり、元のリクエストURIのスキーマをHTTPSに変更したものにリダイレクトすることになります。R フラグは外部リダイレクトを指定し、L フラグはこれ以降のルールの実行を停止することを示している。
最後に
ALBを設置したあとにブラウザでHTTPS接続できているか確認しようとしたら504エラーが出てなんじゃこりゃとなってしまいましたが、セキュリティーグループの見直しと設定ファイルの追記を行ったら無事に解決できました!
あとsystemctl restart忘れがち!
次回はCloud frontに、WAFを導入した構成でもできると書いてあったので、時間があったらやります。