こんにちは!
エンジニアの岩間です。
今回は、ApacheのVirtualhostで設定した複数ドメインをAWSのALB(Application Load Balancer)をつかってSSL化する方法をご紹介します。
目次
この記事でご紹介ですること
- Apache Virtualhostの設定
- AWS ACMを使ったSSL証明書取得
- AWS ALBをつかったドメインSSL化
をご紹介していきます。
環境情報
以下環境情報です。
OS | Almalinux9 (AWS EC2 Marketplaceにて選択、Tokyoリージョン) |
Apache | Apache 2.4.51 |
ドメイン取得 | お名前ドットコム |
準備
今回はEC2インスタンスを使用します。
Elastic IP を取得し、対象のインスタンスにアタッチしておきます。
また、今回ドメインの取得手順はご紹介しておりません。事前にドメインを取得しましょう。
①ApacheのVirtual hostの設定を行う
はじめにApacheでVirtualhostの設定を行っていきます。
1.インスタンスにssh接続する
まずはインスタンスにsshでログインします。
2.Virtualhostの設定を行う
Virtualhostの設定ファイルを新規作成し、設定していきます。
今回は、例としてVirtualhostで「www.sample.com」と「www.test.com」の二つのドメインに振り分ける設定を行っていきます。
まずは/ect/httpd/conf.dに移動し、拡張子が.confのファイルを新規作成します。
1 |
vi /etc/httpd/conf.d/test.conf |
以下の設定を例として記述しています。
www.sample.comは/var/www/sample/index.phpを参照
www.test.comは/var/www/test/index.phpを参照
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<VirtualHost *> DocumentRoot "/var/www/sample" ServerName www.sample.com <Directory "/var/www/sample"> Options AllowOverride All Require all granted </Directory> ErrorLog "logs/sample-error.log" CustomLog "logs/sample-access.log" common </VirtualHost> <VirtualHost *> DocumentRoot "/var/www/test" ServerName www.test.com <Directory "/var/www/test"> Options AllowOverride All Require all granted </Directory> ErrorLog "logs/test-error.log" CustomLog "logs/test-access.log" common </VirtualHost> |
3.設定反映する
Apacheを再起動して設定反映します。
1 |
systemctl restart httpd |
これでVirtualhostの設定が完了です。
②ACMでSSL証明書を取得する
次にAWSのCertificate ManagerでSSL化に必要なSSL証明書を取得します。
【参考】AWS Certificate Manager (ACM) とは?
AWS Certificate Manager (ACM) は、 ウェブサイトやアプリケーションを保護するパブリックおよびプライベート SSL/TLS X.509 証明書およびキーの作成、保存、更新に伴うAWS複雑さに対処します。(AWS公式サイトより引用)
1.Cetificate Managerで証明書リクエストを行う
まずはAWSコンソールでCetificate Managerを検索し、「証明書をリクエスト」をクリックします。
2.証明書タイプを選択する
証明書タイプ選択画面(下の画像)が表示されるので、証明書タイプに「パブリック証明書をリクエスト」を選択し、「次へ」をクリックします。
3.証明書リクエストの設定をする
証明書の設定画面(下の画像)が表示されるので、設定をしていきます。
【完全修飾ドメインの指定方法】
独自ドメインが共通するかそうでないかで指定の仕方を変えることができます。
例① 独自ドメインが異なるドメインでSSL証明書を複数取得したい場合
例えば、使用したいドメインが「www.sample.com」と「www.test.com」のときは完全修飾ドメインを個別で指定します。
使用したいドメイン例 | 完全修飾ドメイン |
「www.sample.com」と「www.test.com」 | 「www.sample.com」と「www.test.com」を指定
(下画像・「この証明書に別の名前を追加」で追加します) |
例② 独自ドメインが共通して、サブドメインが異なるドメインでSSL証明書を複数取得したい場合
例えば、使用したいドメインが「a.test.com」と「b.test.com」のときは、「*.test.com」のようにワイルドカードを使うことでまとめて指定することができます。
使用したいドメイン例 | 完全修飾ドメイン |
「a.test.com」と「b.test.com」 | 「*.test.com」を指定(下の画像) |
4.証明書リクエストを行う
完全修飾ドメインの設定ができたら、検証方法、キーアルゴリズム、タグ(任意)を設定し画面右下の「リクエスト」をクリックします。
5.リクエストした証明書のステータスを確認する
下の画像のような証明書一覧画面が表示されます。
ステータスがまだ「保留中の検証」になっているため、こちらを「発行済み」にするための設定を行います。
6. CNAMEの登録
今回ドメインの取得はAWS(Route53)ではなく外部のサイトで行っているため、そちらのサイト内でCNAME名とCNAME値を登録していきます。
証明書IDをクリックすると、証明書の明細画面が表示されます。明細画面内の「ドメイン」の項目のCNAME名とCNAME値をコピーまたはCSVにエクスポートしておきましょう。
6-1. お名前ドットコムにログインする
今回は、ドメインをお名前ドットコムで取得しているので、お名前ドットコムにログインします。
6-2. 利用ドメイン一覧に移動する
ログイン後、メニューバーの「ドメイン」の「利用ドメイン一覧」をクリックします。
6-3. ドメイン機能一覧に移動する
利用ドメイン一覧に移動したら、画面上部の「ドメイン機能一覧」をクリックします。
6-4. DNS関連機能の設定に移動する
ドメイン機能一覧画面に移動したら、「DNS関連機能の設定」をクリックします。
6-5. 対象のドメインを選択する
対象のドメインを選択し、「次へ」をクリックします。
6-6. DNSレコード設定を利用するをクリックする
DNS設定/転送設定-機能一覧の画面が表示されるので、「DNS設定」項目内の「DNSレコード設定を利用する」をクリックします。
6-7. CNAMEレコードを登録する
DNSレコード設定の画面が表示されます。
「入力」の項目に下の画像のようなフォームがあるので、「ホスト名」にCNAME名、VALUEにCNAME値を入力し、「追加」をクリックします。
①使用したいドメインが「www.sample.com」と「www.test.com」のとき
→「sample.com」と「test.com」のドメイン設定画面それぞれでCNAME名とCNAME値を入力し、追加する。
②使用したいドメインが「a.test.com」と「b.test.com」のとき
→「test.com」のドメイン設定画面でCNAME名とCNAME値を入力し、追加する。
CNAMEの登録を終えたら、ACMの証明書一覧画面を確認しましょう。
対象証明書IDのステータスが「発行済み」になっていればOKです。
③ターゲットグループを作成
SSL証明書の取得ができたら、次はALBでSSL化するための設定を行っていきます。
ALBに紐づけるために必要な、ターゲットグループの設定から行っていきます。
【参考】ターゲットグループとは?
ターゲットグループは、指定されたプロトコルとポート番号を使用して、1 つ以上の登録済みのターゲット (EC2 インスタンスなど) にリクエストをルーティングできます。1 つのターゲットを複数のターゲットグループに登録できます。ターゲットグループ単位でヘルスチェックを設定できます。ヘルスチェックは、ロードバランサーのリスナールールに指定されたターゲットグループに登録されたすべてのターゲットで実行されます。
(AWS公式サイトより引用)
1.ターゲットグループを新規作成する
最初にターゲットグループを作成していきます。
AWSコンソールでEC2を検索、左のメニューバーの「ターゲットグループ」をクリックし、画面右上の「Create Target Group」をクリックします。
2.ターゲットグループの設定をする
ターゲットグループの設定画面(下の画像)が表示されます。
以下の表のように設定し、「Next」をクリックします。
Choose a target type | Instances |
Target group name | 任意のターゲットグループ名を設定 |
:Port
|
HTTP:80 |
VPC | 対象インスタンスが存在するVPCを設定 |
Protocol version | 任意のプロトコルバージョンを設定 |
Health check protocol | HTTP |
Health check path | ヘルスチェックしたいファイルのパス(Apacheのドキュメントルート以下のパス)を指定 |
Advanced health check settings | ヘルスチェックの成功回数/失敗回数のしきい値などの設定(今回はデフォルトで設定) |
Tags – optional | 任意のタグを設定 |
3.ターゲットグループとインスタンスを紐づける
ターゲットインスタンス登録画面(下の画像)が表示されます。
ターゲットとして設定したいインスタンスにチェックをいれ、「Include as pending below」をクリックします。
4.ターゲットグループを作成する
下の画像のようにReview targetsに選択したインスタンス表示されます。
「Create target groups」をクリックします。
これでターゲットグループの設定ができました!
④ALBの作成
ターゲットグループの作成ができたので、次はいよいよALBの設定を行っていきます。
【参考】AWS Application Load Balancer とは?
Elastic Load Balancing は、受信したトラフィックを複数のアベイラビリティーゾーンの複数のターゲット (EC2 インスタンス、コンテナ、IP アドレスなど) に自動的に分散させます。登録されているターゲットの状態をモニタリングし、正常なターゲットにのみトラフィックをルーティングします。Elastic Load Balancing は、受信トラフィックの時間的な変化に応じて、ロードバランサーをスケーリングします。また、大半のワークロードに合わせて自動的にスケーリングできます。
(AWS公式サイトより引用)
1.ロードバランサーを新規作成する
AWSコンソールでEC2を検索します。
左のメニューバーの「ロードバランサー」をクリックし、画面右上の「Create load balancer」をクリックします。
2.ロードバランサータイプを選択する
ロードバランサーには以下のタイプがあります。
Application Load Balancer | プロトコルリスナーがHTTP、HTTPS、gRPC。柔軟なアプリケーション管理が必要な場合に選択。 |
Network Load Balancer | プロトコルリスナーがTCP、UDP、TLS。非常に高度なパフォーマンスと静的 IP がアプリケーションで必要な場合に選択。 |
Gateway Load Balancer | プロトコルリスナーがIP。ファイアウォール、侵入検知および防止システム、ディープパケットインスペクションシステムなどの仮想アプライアンスをデプロイ、スケーリング、管理する場合に選択。 |
今回はHTTP/HTTPSリクエストの振り分け設定をするのでApplication Load Balancerを使用します。
「Application Load Balancer」を「Create」します。
3.ALBの設定をする①
下の画像のような画面が表示されます。
Basic configurationの項目を以下の表のように設定します。
Load balancer name | 任意のALB名を設定 |
Scheme | Internet-facing(インターネットからの接続許可) |
IP address type | IPv4 |
4.ALBの設定をする②
画面を下にスクロールするとネットワークマッピングとセキュリティグループの設定画面(下の画像)が表示されます。
Network mappingの項目を以下の表のように設定します。
VPC | ターゲットグループで選択したVPCを選択 |
Mappings | インスタンスのあるAZ + 任意のAZ の2つ選択 |
5.セキュリティグループの作成
セキュリティグループを新規作成します。
Security groupsの項目から「Create new security group 」をクリックします。
下の画像のようにインバウンドルールを設定し(すべてのトラフィックからHTTP、HTTPSのアクセスを許可します。)、セキュリティグループを新規作成します。
※アウトバウンドルールはデフォルトで設定しています。
セキュリティグループの作成ができたら、ALB新規作成の画面に戻り、上記で作成したセキュリティグループを選択します。
6.リスナーの設定をする
Listeners and routingを下の画像のように設定します。
※デフォルトではListener HTTP:80しか表示されていませんが、「Add Listener」でListenerを追加できます。
HTTP、HTTPSのDefault actionには③で作成したターゲットグループを選択します。
ListernerにHTTPSを選択すると、「Secure listener settings」という項目が表示されるので、Default SSL/TLS certificate に②Certificate Managerで作成したACMを選択します。
7.オプション項目の設定
Tagなどのオプション項目を設定する場合は設定します。
8.ALBの作成
すべての設定ができたら、Summaryで設定項目を確認します。
問題なければ、「Create Load Balancer」をクリックします。
これでALBの作成ができました!
⑤HTTP Listenerルールの設定
ここからはALBの詳細設定を行います。
まずは、HTTPでリクエストされたらHTTPSにリダイレクトするように設定を行います。
1.作成したALBを選択する
ALB一覧から、④で作成したALB名をクリックします。
2.リスナーの設定をする
ALBの詳細画面が表示されます。
まずはHTTPリスナーの設定から行っていきます。
今の設定では、HTTPでリクエストされたらそのままインスタンスにルーティングされるので、HTTPSにリダイレクトされるよう設定していきます。
画面下部のListenersタブのHTTPのRulesをクリックします(画像の赤丸部分)。
3.ルールの設定画面に移動する
HTTPリスナールールの一覧画面(下の画像)が表示されるので、「Manage rules」をクリックします。(画像の赤丸部分)
4.ルールの編集をする
ルールの編集画面(下の画像)が表示されます。
まずは既存のアクションを削除します。
最初に赤丸部分の編集アイコンをクリックし、次に、青丸部分の編集アイコンをクリックします。
すると、ルールの編集ができるようになるので削除アイコン(画像赤丸部分)をクリックします。
5.ルールのアクションを追加する
ルールのアクションを追加します。
まずは「アクションの追加」をクリックし、転送先に「リダイレクト先」を選択します。
6.リダイレクト先の設定をする
下の画像のようにリダイレクト先を設定します。
この設定を行うことで、HTTPでリクエストがきたらHTTPSにリダイレクトされるようになります。
設定ができたら赤丸部分のチェックマークアイコンをクリック→青丸部分の更新ボタンをクリックし、ルールの更新完了です。
これでHTTPのListenerルール設定は完了です!
⑥HTTPS Listenerルールの設定
次にHTTPSのListenerルール設定を行います。
①で設定したVirtualhostの振り分け設定をALBでしていきます。
1.作成したALBを選択する
ALB一覧から、作成したALB名をクリックします。
画面下部のListenersタブのHTTPSのRulesをクリックします(画像の赤丸部分)。
2.ルールの設定画面に移動する
HTTPSリスナールールの一覧画面(下の画像)が表示されるので、「Manage rules」をクリックします。(画像の赤丸部分)
3.ルールの追加①
HTTPSリスナールールを追加します。
最初に画像の赤丸部分の追加アイコンをクリックします。
次に、画像青丸部分の「ルールの挿入」をクリックします。
4.ルールの設定をする①
新規ルールが追加できるようになります。
以下の画像のように設定を行います。
ホストヘッダーにはVirtualhostで設定した一つ目のドメインを入力し、画像青丸部分のチェックマークアイコンをクリックします。
転送先には③で作成したターゲットグループを選択し、画像青丸部分のチェックマークアイコンをクリックします。
「保存」ボタンをクリックします。
これで「https://www.sample.com」でリクエストされると対象インスタンスにルーティングがされるようになります。
5.ルールの追加②
二つ目のルールを追加します。
3.と同じように画像青丸部分の「ルールの挿入」をクリックします。
6.ルールの設定をする②
新規ルールが追加できるようになります。
以下の画像のように設定します。
ホストヘッダーにVirtualhostで設定した二つ目のドメインを入力し、画像青丸部分のチェックマークアイコンをクリックします。
転送先には③で作成したターゲットグループを選択し、画像青丸部分のチェックマークアイコンをクリックします。
「保存」ボタンをクリックします。
これで「https://www.test.com」でリクエストされると対象インスタンスにルーティングがされるようになります。
これでListnerルールの設定が完了です!
⑦ALBのDNSをCNAMEレコードとして登録する
次に、ALBのDNSをドメイン登録サイトでCNAMEレコードとして登録します。
今回ドメインの取得はAWSではなく外部のサイトで行っているため、そちらのサイト内でCNAMEレコードを登録します。
1.DNS名をコピーする
事前に、ALBのDNS名をコピーします。
ALBのDNS名はALB一覧から対象のALB名前をクリック→DetailのDNS nameの項目で確認ができます。
2.お名前ドットコムでDNS名を登録する
※「②ACMでSSL証明書を取得する」の6-7でログイン~設定までの手順をご紹介しています。
①使用したいドメインが「www.sample.com」と「www.test.com」のとき
→「sample.com」のドメイン設定画面でホスト名に「www」、VALUEにコピーしたDNS名を入力し、追加する。
「test.com」のドメイン設定画面でホスト名に「www」、VALUEにコピーしたDNS名を入力し、追加する。
②使用したいドメインが「a.test.com」と「b.test.com」のとき
→「test.com」のドメイン設定画面でホスト名に「a」、VALUEにコピーしたDNS名を入力し、追加する。
「test.com」のドメイン設定画面でホスト名に「b」、VALUEにコピーしたDNS名を入力し、追加する。
⑧EC2のセキュリティグループの設定を変更する
最後に、EC2インスタンスのセキュリティグループの設定を変更します。
1.EC2のインスタンス一覧画面に移動する
AWSコンソールで「EC2」と検索し、左メニューから「インスタンス」をクリックします。
2.対象インスタンスのセキュリティグループの画面に移動する
対象インスタンスにチェックを入れ、「セキュリティ」タブよりセキュリティグループ名をクリックします。
3.インバウンドルールを編集する
セキュリティグループの「インバウンドルールの編集」をクリックし、以下の画像のように設定します。
検索アイコンのテキストボックスにALBにアタッチしているセキュリティグループIDを入力します。
こうすることで、インスタンスに入ってくるインバウンドがALBを経由したHTTP/HTTPSリクエストのみに限定されます。
4.ルールを保存する
設定ができたら、「ルールを保存」をクリックします。
これでEC2のセキュリティグループの設定ができました!
動作確認
以上で設定が完了したので、動作確認をしていきます。
ブラウザの検索窓に
「https://www.sample.com」※サンプル
「https://www.test.com」※サンプル
を入力してページが表示されればOKです。
また、
「http://www.sample.com」※サンプル
「http://www.test.com」※サンプル
で検索したときにhttpsに変換されているかも確認しましょう。
Apache設定(オプション)
Apacheを設定してALBのパフォーマンス最適化を行います。
※以下AWS公式サイトより抜粋
Timeout | アプリケーションのタイムアウトをロードバランサーのアイドルタイムアウト値よりも大きい値に設定します。これを行って、ロードバランサーがアイドル接続を適切に終了するようにします。ロードバランサーに適切に通知せずに、バックエンドサーバーで接続を終了すると、504 エラーが表示されることがあります。 |
KeepAlive | CPU 使用率を削減し、応答時間を改善するには、キープアライブをオンにします。キープアライブをオンにすると、ロードバランサーで、HTTP リクエストの度に新しい TCP 接続を確立する必要がありません。 |
KeepAliveTimeout | キープアライブオプションが有効になっている場合は、ロードバランサーのアイドルタイムアウトよりも長いキープアライブタイムアウトを選択します。 |
RequestReadTimeout | アプリケーションの応答時間に合わせて読み取りタイムアウトを設定します。こうすることで、ロードバランサーがリクエストのヘッダーとボディの両方を受信するために、接続を十分な時間開いたままにしておくことができます。
※ロードバランサーのアイドルタイムアウト値がバックエンドタイムアウトよりも小さいことを確認してください。 |
MaxKeepAliveRequests | このオプションでは、キープアライブがオンになった時に単一の TCP 接続で処理するリクエストの数を設定します。リソースを有効に使用するために、キープアライブリクエストの最大数は 100 以上に設定します。 |
AcceptFilter | AcceptFilter はデフォルトで有効になっており、接続に TCP_DEFER_ACCEPT オプションを使用するよう Apache に指示します。この設定により、TCP ソケットが「ハーフオープン」状態になる可能性があります。この状態では、ロードバランサーは接続が確立されていると見なしますが、バックエンドインスタンスは接続が確立されていません。ハーフオープン接続は、性能が高くないロードバランサーで最も一般的です。この場合、使用前の接続に時間がかかります。 |
ログ |
Apache の各リクエストのログに ELB の x-forwarded-for ヘッダーが表示されるように、%{X-Forwarded-For}i オプションを有効にします。このヘッダーには、元のクライアントの IP アドレスが含まれます。%D オプションは、アクセスログに対する各リクエストの処理にかかる時間を追加します。 LogFormat “%{X-Forwarded-For}i %h %l %u %t \”%r\” %>s %b %D \”%{Referer}i\” \”%{User-Agent}i\”” combined |
Apache MPM イベントモジュール | Apache MPM イベントモジュールは、ロードバランサーからの接続を早期に切断する可能性があります。接続が早期に切断されると、Application Load Balancer では HTTP 502 エラーが、Classic Load Balancer では HTTP 504 エラーが生成されます。この動作を抑制するためには、代わりに MPM ワーカーモジュールを使用するのがベストプラクティスです。 |
まとめ
お疲れさまでした!
以上、ApacheのVirtualhostで設定した複数ドメインをAWSのALBをつかってSSL化する方法でした。
ここまでお読みいただきありがとうございました。
- 電子工作で自作した植物の自動水やり機から土壌データをAWS IoT Coreに連携してみた - 2024-09-13
- 【ESP8266 NodeMCU】電子工作で植物の自動水やり機を作ってみた - 2024-08-14
- Amazon Bedrock APIでTypeScriptのテストコードを出力してみた - 2024-05-07
- AWS CDK × CodeBuild × CypressでE2Eテストを自動化&実行動画をS3に保存してみる - 2024-04-16
- AWS ECSでブルーグリーンデプロイメント!~デプロイメントタイプ別の動作比較~ - 2024-04-03