質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4605閲覧

【AWS】ALBを用いたWEBサーバのHTTPS化

gesunokiwami

総合スコア17

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/06/08 06:32

編集2021/06/08 11:10

いつもお世話になっております。
この度はAWSのSSL化についてです。

AWSにて http://sb.example.com といったドメインを持つインスタンスを作成しました。
実際、アクセスができている状況です。

しかし、ACMにて証明書を取得し、設定に https://sb.example.com にアクセスすると、
『502 Bad Gateway』と表示されてしまいアクセスすることができません。

様々な設定を試したのですが、解決に至ることができませんでした。
ご存知の方いらっしゃいましたらお力添え願えますでしょうか...。

AWS

AWSのコンソール(管理画面)ではそれぞれ下記のとおりに設定いたしました。

証明書

AWS Certificate Manager (ACM)を利用して証明書を発行しました。
状況「発行済み」となっていること、有効期限が切れていないことを確認済みです。

インスタンス

EC2にてインスタンスを作成しました。
タイプは『t2.micro』(Linux)になります。
Elastic IPは設定済みで、IPアドレスが変わらないことを確認済みです。

ロードバランサー

ロードバランサーは下記のように設定しました。
ターゲットグループ
|port|Protocol|Targget type|Load balancer|
|:--|:--:|--:|
|80|HTTP|Instance|exple-lb|
|443|HTTPS|Instance|exple-lb|

リスナーIDに追加

DNS

Route53にて、独自のドメインを割り当てました。

NameTypeValue
sb.example.comA作成したロードバランサーへのエイリアス
res.example.comA作成したロードバランサーへのエイリアス
admin.example.comA作成したロードバランサーへのエイリアス

Apache

/etc/httpd/conf.d
にvirtualhost.confを設定しております。内容は以下です。

NameVirtualHost * # webサーバー <VirtualHost *> DocumentRoot /var/www/html/web_server/ ServerName res.example.com ErrorLog logs/virtual-error_log CustomLog logs/virtual-access_log combined env=!no_log </VirtualHost> # adminAPPサーバー <VirtualHost *> DocumentRoot /var/www/html/app_admin/ ServerName admin.example.com ErrorLog logs/virtual-error_log CustomLog logs/virtual-access_log combined env=!no_log </VirtualHost> <VirtualHost *> DocumentRoot /var/www/html/app/ ServerName sb.example.com ErrorLog logs/virtual-error_log CustomLog logs/virtual-access_log combined env=!no_log </VirtualHost> Listen 443 NameVirtualHost *:443 <VirtualHost *:443> DocumentRoot /var/www/html/app/ ServerName sb.example.com ErrorLog logs/virtual-error_log CustomLog logs/virtual-access_log combined env=!no_log </VirtualHost>

アクセスログはこのように出ていました

[08/Jun/2021:16:00:46 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:00:46 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:00:46 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:00:48 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:00:48 +0900] "GET /index.php HTTP/1.1" 404 972 "-" "ELB-HealthChecker/2.0" [08/Jun/2021:16:00:59 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:00:59 +0900] "GET /index.php HTTP/1.1" 404 972 "-" "ELB-HealthChecker/2.0" [08/Jun/2021:16:01:02 +0900] "\x16\x03\x01" 400 226 "-" "-" [08/Jun/2021:16:01:02 +0900] "\x16\x03\x01" 400 226 "-" "-"

エラーログに関しては以下が出ておりましので、階層にindex.phpを追加したらエラーは発生しなくなりました。

'/var/www/html/web_server/index.php' not found or unable to stat

目標に辿り着けず困惑しています。
設定についてご不明な点がございましたらぜひお願いいたします。

以上、どうぞよろしくお願いいたします。

追記
ターゲットグループのスクリーンショットを追加しました。
イメージ説明
イメージ説明
イメージ説明

イメージ説明

証明書

証明書は以下の状態になっております。
|ドメイン名 |追加の名前|状況|種類|使用中?|更新資格|
|:--|:--:|--:|
|*.example.com|example.com|発行済み|Amazonが発行|はい|有|

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/08 06:33

apache httpdのログは?
yukky1201

2021/06/08 07:49

apacheのerrorログも確認し、502エラーが出ているか確認。 出ていない場合は、apacheまで到達できてない(serverまで到達していないとは言っていません)ので、どこまで処理できているのか詰めていきましょう。 ELB-HealthCheckerにエラーのステータスコード(404)を返しているのでそこも気になります。
gesunokiwami

2021/06/08 08:20 編集

error_logを確認した限りですと、エラーは出ていませんでした。 apacheに到達できていないとのことですが、次に確認したほうがいい場所はございますでしょうか? ELB-HealthCheckerの404についてなのですが、ターゲットグループのStatusが「unhealthy」となっておりました。 Health checksのPathなのですが、virtualhost.confで設定されているどのドキュメントルートを見る形になるのでしょうか? それとも関係なくvar/www/htmlになるのでしょうか? あまり分かっておらずすいません...
yu_1985

2021/06/08 09:08

ターゲットグループの設定をスクリーンショットで貼ってください。貼ってくれてるのはリスナーの設定のところだけかと思います。 Unhealthyになってるならそもそもヘルスチェックに失敗してインスタンスにリクエストが届いていませんね。 ヘルスチェック失敗の原因もたどる必要があります。 あと、ここでやろうとしているのは「EC2のSSL化」ではなく、ALBを用いたWEBサーバのHTTPS化ではなないでしょうか。 (そもそもEC2のSSL化という表現もちょっと違いますが…。) まず、ALBを介さずに直接EIPを使ってアクセスしたらエラーなくアクセスできますか?
yukky1201

2021/06/08 09:34

HealthCheckはApache側で404(NotFound)を返していますので、単純にindex.phpファイルが無いだけの可能性が高いです。 → 正常な(ステータス200を返す)index.phpファイルを配置しましょう
yu_1985

2021/06/08 09:40 編集

ターゲットグループにはヘルスチェックの設定のタブがあるのでそこも貼ってください。 また、80と443で別々のターゲットグループを作っていますが、ELB→EC2の通信を暗号化したいという特別な要件がない限りは80番ポートへのターゲットグループだけで十分です。(つまり、EC2側で443を使う必要がありません) どのみちApache側のHTTPSの設定で証明書を設定していないのでEC2にHTTPSでアクセス時に警告が出るのは正しい挙動です
gesunokiwami

2021/06/08 09:49

ヘルスチェックのスクショを追加しました。 yukky1201さんにお聞きしたいのですが、index.phpはどこに配置すればよろしいのでしょうか? virtualhost.confで設定しているDocumentRootには配置しているのですが、 var/www/htmlに配置すればよろしいのでしょうか?
yu_1985

2021/06/08 10:08

VirtualHostで複数のサイトを設定してDocumentRootも複数ありますが、どこにindex,phpを置いたんでしょうか? また、複数のサイトに分けているにも関わらず全てが同一のログファイルに出力しているので分けたほうがよいです。
gesunokiwami

2021/06/08 10:14

現在は以下にindex.php置いております。 /var/www/html/app_admin/ /var/www/html/app/ ログファイルを分けること承知いたしました。
yu_1985

2021/06/08 11:41

確かServernameにホスト名が一致しない場合デフォルトでは一番上にある設定が適用されるはずだったと思うので、ヘルスチェックに失敗するのは/var/www/html/web_server/にindex.phpがないにも関わらずindex.php宛にヘルスチェックのリクエストを送っているからではないでしょうか と、いうのがログを見るとわかると思うので確認してみてください。
gesunokiwami

2021/06/08 13:04

/var/www/html/web_server/にindex.phpを配置したらHealth checkは「Healthy」になりました。 アクセスログも以下のようになりました。 GET /index.php HTTP/1.1" 200 102 "-" "ELB-HealthChecker/2.0" ですが変わらずhttpsでアクセスすると『502 Bad Gateway』と表示されます。 他に何か設定が必要でしょうか?
guest

回答1

0

ベストアンサー

散発的に書きましたが、見直すべき点は複数あるのでそろそろこちらに書きます。

ヘルスチェックのエラーについては、ヘルスチェックのリクエストをindex.php宛に送っているのに対し、リクエストを受けるApacheがindex.phpの置かれていないところにリクエストを受けさせているから発生していたエラーでした。
ヘルスチェックによって何をチェックしたいかにもよりますが、単にApacheが生きてるかどうかを確認したいなら、ヘルスチェックを受けるためだけのVirtualHostを作ってしまうのもいいでしょう。
もしWEBサイトごとにヘルスチェックしたいならポートを分けてALBのリスナールールでホストごとにポートを分けるとかする必要がありそうです。今の所ヘルスチェックの

その他、問題になっていると思われるのは、ApacheのHTTPS(443ポート)の設定が不足しているにも関わらず、ALBがHTTPSで受けているリクエストをEC2の443ポートに転送していることです。
Bad Gatewayになる原因はこれだと思います。ApacheにHTTPSの設定をするにはApacheでも証明書を用意する必要がありますが、それがありません。
HTTP 502: Bad gateway
ただ、コメントにも書きましたがALBでHTTPSを終端させるならEC2側ではHTTPSの設定は不要です(※)
ALBの443ポートで受けたリクエストをターゲットグループの設定でEC2の80ポート(HTTP)に転送すれば十分です。
※もしALBとEC2の間の通信を暗号化したいという要件があるのなら話は別ですが、AWS内部の通信なので多くの場合不要です。
ALBの80番ポートへのリクエストはALB側で443に転送すれば常時HTTPSになります。
[新機能]Webサーバでの実装不要!ALBだけでリダイレクト出来るようになりました!

ALBとApacheでVirtualHostをしている例をいくつか貼っておくので参考にしてみてください。
EC2+ALB+ACMとApacheでセキュアな名前ベースのバーチャルホスト環境を作ってみた
ELB(ALB)1つで複数のバーチャルホストに対応する Host-based routing

ただ、個人的にはALBを使うなら複数サイトを1サーバ同居よりなるべくEC2インスタンスを分けたいところですね…。
ALBを使うことでAWS WAFを使うことができたりALBだけでHTTPS化することでWEBサーバ側の設定をシンプルに保ったりと確かにメリットは大きいですけれど。

とりあえず、パッと見て問題を感じたのはこのあたりです。

投稿2021/06/08 16:10

yu_1985

総合スコア7447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gesunokiwami

2021/06/09 02:27

ご指摘通りターゲットグループの設定の問題でした... リンクをご参考させて頂き、無事httpsにアクセスすることが出来ました!! 色々と分からない部分を知ることが出来ました。 本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問