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

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

ただいまの
回答率

88.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 732

gerigeritom

score 1

前提・実現したいこと

ネットワーク・セキュリティ初心者です。
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

@dir = "/app/"

worker_processes 2
working_directory @dir

timeout 300
listen "#{@dir}tmp/unicorn.sock", backlog: 1024

pid "#{@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;
            }
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yu_1985

    2020/05/22 15:03

    それであればALB→コンテナの通信ができていないということはなさそうですね。
    > ターゲットグループのプロトコル - ポート: HTTPS - 443

    コンテナでは443の通信を受けられるようになっているのでしょうか?
    確認の時はhttpでアクセスしているかと思いますが…。
    > http://{タスクのパブリックIP}
    もし受けられないようになっているのなら当然HTTPSで設定しているヘルスチェックも失敗します。

    ALBを介すならALBが443の通信を受ければ十分なので、ターゲットとして設定するポートは80番(正確に言うと、コンテナ側で待ち受けているポート)を設定してください。

    キャンセル

  • gerigeritom

    2020/05/22 15:14

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

    キャンセル

  • この投稿は削除されました

回答 1

checkベストアンサー

+1

結論

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 20:42

    ご回答いただき、ありがとうございます!

    別の方からも同様のご指摘いただいたため変更したところ、
    「発生している問題・エラーメッセージ」2は治りましたが、
    1は「502 Bad Gateway」ではなく、下記のエラーが発生するようになりました。

    ・一番最初のページ(ログインページ)は表示されるが、ログイン後のページが表示されず下記が表示される。

    このサイトにアクセスできません
    unicorn_server のサーバーの IP アドレスが見つかりませんでした。
    DNS_PROBE_FINISHED_NXDOMAIN


    unicorn.rbかnginx.confに当たりをつけて調べておりますが、
    現象について何かご存知でしたら、共有いただけると幸いです。

    よろしくお願いいたします。

    キャンセル

  • 2020/05/23 23:24 編集

    追記コメントを見落としていました。失礼しました。

    nginx.confにおいて、proxy_passの直後に以下を追記してはいかがでしょうか。
    proxy_set_header Host $host;

    ・1ページ目は表示される
    ・ただし遷移後のページが表示されない
    ・ブラウザのエラーが unicorn_server のDNSエラーになっている

    ことから、unicornに渡されるHostヘッダが書き換わっている可能性があります。
    nginx側でHostヘッダを維持するように設定することで解消しそうです。

    キャンセル

  • 2020/05/24 11: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;
    }
    }
    }
    }

    キャンセル

  • 2020/05/24 12:41

    >httpモジュールに置いたところ、2ページ目以降もhttpsで表示されました!

    解決したようで良かったです!

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る