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

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

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

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSL

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

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

6136閲覧

AWS Fargate上アプリのドメイン名アクセス、SSL通信

gerigeritom

総合スコア1

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSL

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

AWS(Amazon Web Services)

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

1グッド

0クリップ

投稿2020/05/21 20:01

前提・実現したいこと

ネットワーク・セキュリティ初心者です。
nginx + unicorn + sinatra で作成したアプリを AWS Fargate 上で動作させております。

アプリケーションロードバランサーを利用してドメイン名でのアクセスと、
HTTPSでのSSL通信を実現したいと考えておりますが、以下の現象が発生してしまいます。

どなたか原因・解決方法についてお知恵をお借りできませんでしょうか?

よろしくお願いします。

発生している問題・エラーメッセージ

1.ECSのサービスを実行しタスクがRUNNINGになった状態で、https://www.{パブリックドメイン}(例: https://www.example.com)にアクセスすると、「502 Bad Gateway」が表示される
(http://{タスクのパブリックIP}にアクセスすると、正常にページが表示される)

2.ECSのサービス実行後、ヘルスチェックがミスを起こし、タスクのステータスがすぐに'STOPPED (Task failed ELB health checks in 〜)'になる

環境構築状況

SSL証明書

 ・ 東京リージョンで、 *.{パブリックドメイン} の証明書を発行済み

アプリケーションロードバランサー

・ ロードバランサーの設定
* スキーム:インターネット向け
* IP アドレスタイプ:ipv4
* リスナーのプロトコル - ポート: HTTPS - 443

・ セキュリティ設定の構成・セキュリティグループの設定
* 証明書タイプ:上記SSL証明書
* 証明書の名前:*.{パブリックドメイン}
* セキュリティポリシー: ELBSecurityPolicy-2016-08

・ ルーティングの設定
* ターゲットグループ: 新規作成
* ターゲットの種類: IP
* ターゲットグループのプロトコル - ポート: HTTPS - 443
* ヘルスチェックのプロトコル - パス: HTTPS - /
* ヘルスチェックの詳細設定: デフォルト

DNS ホストゾーン

・下記レコードを登録
* Aレコード { www.{パブリックドメイン} : ALBのドメイン名(エイリアス) }
* SSL証明書DNS検証用のCNAMEレコード
* NS,SOAレコード は初期設定値

ECS

・タスク定義
* タスクロール:なし
* ネットワークモード:awsvpc
* 互換性が必要:FARGATE
* タスク実行ロール:ecsTaskExecutionRole
* タスクメモリ (MiB):512
* タスク CPU (単位):256
* コンテナ定義
- メモリ制限 (MiB):ソフト制限 128
- ポートマッピング:80 tcp, 443 tcp
- 他は、コンテナ名、イメージ、環境変数以外初期設定
* その他は初期設定

・クラスター
* クラスターテンプレート:ネットワーキングのみ

・サービス
* キャパシティープロバイダー戦略
- キャパシティープロバイダ:FARGATE_SPOT
* サービスタイプ:REPLICA
* タスクの数:3
* 最小ヘルス率:100
* 最大率:200
* デプロイメントタイプ:ローリングアップデート
* ネットワーク構成
- パブリック IP の自動割り当て:ENABLE
* ロードバランシング
- ロードバランサー名:上記ロードバランサ
- ロードバランス用のコンテナ: [定義したコンテナ名] : 443
- ターゲットグループ名:上記ターゲットグループ
- プロダクションリスナーポート: 443:HTTPS
- プロダクションリスナープロトコル: HTTPS
- ターゲットグループのプロトコル:HTTPS
- ターゲットの種類:ip
* サービスの検出:なし
* Auto Scaling:サービスの必要数を直接調整しない

unicorn.rb

ruby

1@dir = "/app/" 2 3worker_processes 2 4working_directory @dir 5 6timeout 300 7listen "#{@dir}tmp/unicorn.sock", backlog: 1024 8 9pid "#{@dir}tmp/pids/unicorn.pid"

nginx.conf

user root; worker_processes 2; events { worker_connections 768; } http { upstream unicorn_server { server unix:/app/tmp/unicorn.sock; } server { listen 80; listen 443 ssl; server_name www.{パブリックドメイン}; root /app/static; location / { if (!-f $request_filename) { proxy_pass http://unicorn_server; break; } } } }
ikore908👍を押しています

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

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

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

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

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

yu_1985

2020/05/22 04:25

サービスの「ネットワーク構成」のところでセキュリティグループが設定されているかと思いますが、そのセキュリティグループはALBからの通信を許可していますか?
gerigeritom

2020/05/22 04:30

ご確認ありがとうございます! セキュリティグループの設定では明示的に通信許可設定はしていないです。 下記が現在のセキュリティグループの設定です。 ・セキュリティグループ * インバウンドルール - {タイプ:HTTP, プロトコル:TCP, ポート範囲:80, ソース: 0.0.0.0/0} - {タイプ:HTTP, プロトコル:TCP, ポート範囲:80, ソース: ::/0} - {タイプ:HTTPS, プロトコル:TCP, ポート範囲:443, ソース: 0.0.0.0/0} - {タイプ:HTTPS, プロトコル:TCP, ポート範囲:443, ソース: ::/0} * アウトバウンド - {タイプ:すべてのトラフィック, プロトコル:すべて, ポート範囲:すべて, ソース: 0.0.0.0/0}
yu_1985

2020/05/22 04:34

どれに設定しているセキュリティグループ化を明示してください。ここではセキュリティグループは複数登場します。 ALBに設定しているセキュリティグループなのか、サービスに設定しているセキュリティグループなのか(ここで確認したいのは後者の方です)
gerigeritom

2020/05/22 05:01

全て上記のセキュリティグループを設定しております。
yu_1985

2020/05/22 06:03

それであればALB→コンテナの通信ができていないということはなさそうですね。 > ターゲットグループのプロトコル - ポート: HTTPS - 443 コンテナでは443の通信を受けられるようになっているのでしょうか? 確認の時はhttpでアクセスしているかと思いますが…。 > http://{タスクのパブリックIP} もし受けられないようになっているのなら当然HTTPSで設定しているヘルスチェックも失敗します。 ALBを介すならALBが443の通信を受ければ十分なので、ターゲットとして設定するポートは80番(正確に言うと、コンテナ側で待ち受けているポート)を設定してください。
gerigeritom

2020/05/22 06:14

ありがとうございます!上記で試してみます!
guest

回答1

0

ベストアンサー

結論

ALBとnginx間の通信がエラーになっています。
以下の3設定を「HTTPS:443」→「HTTP:80」に変更すればOKです。

  • [ALB] ターゲットグループのプロトコル
  • [ALB] ヘルスチェックのプロトコル
  • [ECS] ロードバランス用のコンテナ

詳細

ブラウザ→ALB→nginx→unicorn の順にアクセスが発生しますが、現状の構成では「ブラウザ→ALB」の箇所でしかHTTPSが有効に機能しません。

HTTPS通信には証明書が必要となるものの、AWS ACMで発行した証明書はALBにしか適用されておらず、nginxには証明書が入っていない状態です。

ALB→nginxでHTTPS通信が行えないために、ALBが502エラーを返しています。
ALB→nginxの通信をHTTP:80へ変更することにより、アプリケーションへのアクセスおよびヘルスチェックが通るようになります。

HTTPS通信をALBまでに留めておき、ALBより後ろの内部通信にはHTTPを用いる構成が一般的です。詳しく知りたい場合は「SSL Termination」などで調べてみて下さい。

投稿2020/05/23 10:54

yuu26

総合スコア38

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

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

gerigeritom

2020/05/23 11:42

ご回答いただき、ありがとうございます! 別の方からも同様のご指摘いただいたため変更したところ、 「発生している問題・エラーメッセージ」2は治りましたが、 1は「502 Bad Gateway」ではなく、下記のエラーが発生するようになりました。 ・一番最初のページ(ログインページ)は表示されるが、ログイン後のページが表示されず下記が表示される。 このサイトにアクセスできません unicorn_server のサーバーの IP アドレスが見つかりませんでした。 DNS_PROBE_FINISHED_NXDOMAIN unicorn.rbかnginx.confに当たりをつけて調べておりますが、 現象について何かご存知でしたら、共有いただけると幸いです。 よろしくお願いいたします。
yuu26

2020/05/23 14:25 編集

追記コメントを見落としていました。失礼しました。 nginx.confにおいて、proxy_passの直後に以下を追記してはいかがでしょうか。 proxy_set_header Host $host; ・1ページ目は表示される ・ただし遷移後のページが表示されない ・ブラウザのエラーが unicorn_server のDNSエラーになっている ことから、unicornに渡されるHostヘッダが書き換わっている可能性があります。 nginx側でHostヘッダを維持するように設定することで解消しそうです。
gerigeritom

2020/05/24 02:52

再度ご回答いただき、有難うございます! proxy_set_header Host $host; ですが、nginx.confのproxy_pass直下に置くと「502 Bad Gateway」が表示されましたが、 下記の通りhttpモジュールに置いたところ、2ページ目以降もhttpsで表示されました! yuu26さん、yu_1985さん、お力添えいただき大変有難うございました! ↓変更後nginx.conf user root; worker_processes 2; events { worker_connections 768; } http { proxy_set_header Host $host; upstream unicorn_server { server unix:/app/tmp/unicorn.sock; } server { listen 80; listen 443 ssl; server_name www.{パブリックドメイン}; root /app/static; location / { if (!-f $request_filename) { proxy_pass http://unicorn_server; break; } } } }
yuu26

2020/05/24 03:41

>httpモジュールに置いたところ、2ページ目以降もhttpsで表示されました! 解決したようで良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問