88

Elastic Beanstalk の無料使用層で https を強制することはできないようです。

ヘルスチェックに失敗せずに Amazon Elastic Beanstalk で https を強制する方法で次の提案を試しました

この Apache 書き換えルールを使用する

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

それを試してみると、http リクエストが希望どおりに https にリダイレクトされません。代わりに、http ページが正常にロードされます。また、同じ結果で X-Forwarded-Port ヘッダーを使用しようとしました。

次の書き換えルールも試しました

RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

そして、このルールはリダイレクト ループを引き起こします。そのため、Apache の書き換えルールは、Elastic Load Balancer ヘッダーの X-Forwarded-Port と X-Forwarded-Proto を取得しないように見えますが、リダイレクト ループも私が目指しているものではありません。

助けてください。私は AWS と Elastic Beanstalk を初めて使用し、Apache のルールにあまり詳しくありません。ここからどこへ行けばいいのかよくわかりません。ありがとう。

4

23 に答える 23

189

この回答は、ロード バランサー セキュリティ グループですでに https を有効にし、ロード バランサーに SSL 証明書を追加し、ポート 80 と 443 の両方がロード バランサーによって転送され、Route 53 を使用して Elastic Beanstalk 環境でドメイン名を指定していることを前提としています。 (または同等の DNS サービス)。

オプション 1: Apache でリダイレクトを行う

これは、Apache を使用する Elastic Beanstalk 環境にいる場合にのみ可能です (AWS Linux 2 ベースのデプロイは、Apache を使用するように設定できます)。Docker ベースの展開では機能しない場合があります。

アマゾン Linux 2

ほとんどの AWS Linux バージョン 2 ベースのプラットフォームには、プロキシ ホストとして Apache を選択するオプションがあります。これを行うには、[構成] > [ソフトウェア] > [コンテナー オプション] に移動し、[プロキシ サーバー] を [Apache] に設定するか.config.ebextensions.

option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache

.platform/httpd/conf.d/ssl_rewrite.confそれが完了したら、コードベース (関連する AWS docs ) に名前が付けられた構成ファイルを次の内容で追加します。

RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>

アマゾン リナックス 1

プロジェクト.configのディレクトリにあるファイルの.ebextensions1 つに以下を追加するだけです。

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

説明

これは、Elastic Beanstalk の外部ではやや単純です。通常、次のような Apache 書き換えルールを追加します。

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

または、この場合のように、ロード バランサーの背後にある場合:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

ただし、これらの構成は<VirtualHost>ブロック内でのみ機能します。をブロックに変更するRewriteCondと、<If>ブロックの外で適切に動作するよう<VirtualHost>になり、スタンドアロンの Apache 構成ファイルに入れることができます。CentOS での標準の Apache セットアップ (ElasticBeanstalk でのセットアップを含む)/etc/httpd/conf.d/*.confには、このファイルを保存するファイル パスに一致するすべてのファイルが含まれることに注意してください。

条件の-n '%{HTTP:X-Forwarded-Proto}'一部により、ロード バランサーの背後にいない場合にリダイレクトが防止され、ロード バランサーと https を使用する運用環境と、単一インスタンスであり https を持たないステージング環境の間で構成を共有できます。すべての環境でロード バランサーと https を使用している場合、これは必要ありませんが、使用しても問題はありません。

オプション 2: ALB でリダイレクトを行う

これは、Application Load Balancer を使用している場合にのみ可能です。Amazon には、その方法についての説明があります: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

プロジェクト.configのディレクトリにあるファイルの.ebextensions1 つに以下を追加して、http リスナーをリダイレクトに置き換えるだけです。

Resources:
 AWSEBV2LoadBalancerListener:
  Type: AWS::ElasticLoadBalancingV2::Listener
  Properties:
    LoadBalancerArn:
      Ref: AWSEBV2LoadBalancer
    Port: 80
    Protocol: HTTP
    DefaultActions:
      - Type: redirect
        RedirectConfig:
          Host: "#{host}"
          Path: "/#{path}"
          Port: "443"
          Protocol: "HTTPS"
          Query: "#{query}"
          StatusCode: "HTTP_301"

私が見た悪い解決策

私はこの問題に対する悪い解決策をたくさん見てきましたが、なぜこの解決策が必要なのかを理解するためにそれらを一通り調べる価値があります。

  1. Cloudfront を使用する: Elastic Beanstalk の前にキャッシュされていない Cloudfront セットアップを使用して、HTTP から HTTPS へのリダイレクトを行うことを提案する人もいます。これにより、まったく適切ではないまったく新しいサービスが追加されます (したがって、複雑さが増します) (Cloudfront は CDN です。本質的に動的なコンテンツに HTTPS を強制するための適切なツールではありません)。Apache config はこの問題に対する通常の解決策であり、Elastic Beanstalk は Apache を使用するため、それを使用する必要があります。

  2. サーバーに SSH 接続して...:これは、Elastic Beanstalk の点とは完全に対照的であり、非常に多くの問題があります。自動スケーリングによって作成された新しいインスタンスには、変更された構成はありません。複製された環境には構成がありません。合理的な一連の環境変更が何度でも行われると、構成が消去されます。これはとても悪い考えです。

  3. 新しいファイルで Apache 構成を上書きします。これは適切な解決策の領域に入りつつありますが、Elastic Beanstalk がサーバーのセットアップの側面を変更した場合 (彼らは非常によく行う可能性があります)、メンテナンスの悪夢が残ります。次の項目の問題も参照してください。

  4. Apache 構成ファイルを動的に編集して、数行を追加します。これは適切なアイデアです。これに関する問題は、Elastic Beanstalk がデフォルトの Apache 構成ファイルの名前を変更した場合に機能しないことと、このファイルが予期しないときに上書きされる可能性があることです: https://forums.aws.amazon.com/thread .jspa?threadID=163369

于 2016-08-03T19:05:13.740 に答える
16

編集:私はこの答えが大好きですが、今では非常に古いです。AWS は、この回答の一部を廃止する新しいサービス ( Certificate Managerなど) を考え出しました。さらに、.ebextensionsApache でフォルダーを使用すると、上記で説明したように、このリダイレクトをよりクリーンに処理できます。

S3 で Web サイトをホストしている場合でも、この回答の一部が役立つ場合があります。


これは私のために働いた:

  1. awsコンソール コマンドを使用して証明書を AWS にアップロードします。コマンド構造は次のとおりです。

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    
  2. Elastic Beanstalk アプリケーションで、 [ Configuration ] -> [ Network Tier ] -> [ Load Balancing ] に移動し、歯車のアイコンをクリックします。

  3. セキュア リスナー ポート443として選択します。プロトコルとしてHTTPSを選択します。ステップ 2SSL 証明書 IDを選択しCERTIFICATE_NAMEます。構成を保存します。

  4. コンソールに移動します。[ EC2 インスタンス]をクリックします。[ロード バランサー]をクリックします。ロード バランサーをクリックします。[インスタンス]をクリックして下にスクロールし、そのロード バランサーに割り当てられている EC2 インスタンスを表示します。EC2 インスタンスの名前がアプリケーション URL と同じ (またはそれに近いもの) である場合は、ロード バランサーのDNS 名をメモしておいてください。形式である必要がありますawseb-e-...

  5. コンソールに戻ります。CloudFrontをクリックします。[ディストリビューションの作成]をクリックします。Webディストリビューションを選択します。

  6. ディストリビューションをセットアップします。Origin Domain Nameを、手順 5で見つけたロード バランサーの DNS 名に設定します。ビューア プロトコル ポリシーRedirect HTTP to HTTPSに設定します。[クエリ文字列の転送]を[はい] に設定します。アプリケーションに使用する URL に代替ドメイン名 (CNAME)を設定します。手順 2でアップロードしたSSL 証明書を設定します。ディストリビューションを作成します。CERTIFICATE_NAME

  7. CloudFront でディストリビューション名をクリックします。Originsをクリックし、オリジンを選択してEditをクリックします。Origin Protocol PolicyMatch Viewerであることを確認します。戻る。[動作] をクリックし、オリジンを選択して、[編集] をクリックします。Forward HeadersWhitelistに変更し、 Hostを追加します。保存。

注: より長いガイドも書きました

于 2015-03-20T16:54:24.030 に答える
6

<If> ディレクティブは Apache 2.4+ でのみ機能しますが、ElasticBeanstalkのバージョンは 2.2.x です。

したがって、上記と同じアドバイスに従います。次の内容で .ebextensions/https_rewrite.config というファイルを作成します。

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %{HTTPS} !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

これは私にはうまくいくようです。

このファイルをWARファイルに組み込む方法については、この回答を参照してください

于 2016-11-18T05:37:31.990 に答える
4

編集:Zagsソリューションはより一般的で正しいです。私よりもお勧めします(これはpython envに固有です)

これは、wsgi.conf のハッキングや CloudFront の使用を回避する、私が思いついたクリーンで迅速なソリューションです。

.ebextensions/some_file.config で:

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      </Directory>

これは簡単すぎる気がしますが、うまく機能しているようです。

また、「HTTPS ではない」のではなく、HTTP を明示的にリダイレクトしていることにも注意してください。

于 2016-06-23T23:50:14.407 に答える
3

次のコマンドでうまくいきます:

RewriteCond %{HTTP:X-Forwarded-Port} !=443

httpsチェックなし:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

ELB が X-Forwarded-Proto の値を http に変更したようです (TCP プロトコルでも)。

于 2015-05-11T08:22:02.480 に答える
3

上記の回答はどれも私にとってはうまくいきませんでしたが、いくつかは私にとってうまくいった答えを見つけるのに役立ちましたまた、 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/Java-tomcat -platform.html

上記のURLに記載されているファイル構造を作成して、2つのファイル httpd.conf 00_application.conf を変更しました

インスタンスから httpd.conf 全体をコピーし、上記のリンクに記載されているフォルダー構造の下の .ebextention の下のコードに配置します。次に、プロジェクトのそのファイルに以下の行を追加するだけです

LoadModule rewrite_module modules/mod_rewrite.so

00_application.conf についても同じことを行い、インスタンスからコピーして、httpd/conf.d/elasticbeanstalk/00_application.conf の下の .ebextention の下のコードベースに配置します。次に、このファイルを編集し、VirtualHost の間に以下を追加します。

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

今すぐコードをデプロイしてください。動作するはずです。

于 2017-01-09T14:50:31.770 に答える
2

Elastic Beanstalk では、AWS がそれらを上書きするように設定を追加するだけで、Web サーバーの設定を上書きして独自の設定を送信できます。

次のファイルをパスの下に追加するだけです: .ebextensions\httpd\conf.d

ファイルの内容:

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

「.ebextensions」は AWS の標準設定フォルダで、残りは上書きしたいファイルとフォルダを指すだけです。ファイルまたはフォルダーが存在しない場合は、単純に作成します。

于 2017-03-26T07:12:07.647 に答える
1

誰かがまだ苦労している場合に備えて:

私はしばらく苦労しましたが、最終的に、すべての AWS 構成を含む GitHub (AWS チームから) を見つけました。以下の例は、Apache 2.2 の HTTP>HTTPS リダイレクトで機能します。(Apache 2.4 および Nginx の構成については、以下のリンクを参照してください)。

アパッチ 2.2

  1. アプリのルート ディレクトリにファイルを作成します: YOUR_PROJECT_ROOT/.ebextensions/httpd/conf.d/elasticbeanstalk.conf (IntelliJ / Java を使用している場合は、最終的な .WAR アーティファクトに追加されていることを確認してください)

  2. 次の行を追加して、仮想ホストでリダイレクトを有効にします。

    <VirtualHost *:80>
        LoadModule rewrite_module modules/mod_rewrite.so
        RewriteEngine On
        RewriteCond %{HTTP:X-Forwarded-Proto} !https
        RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
    
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
    </VirtualHost>
    

Apache 2.4 と Nginx のその他の例については、次の GitHub リポジトリにアクセスしてください。

https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat

また、より便利な構成と使用可能な例がたくさんあります。

よろしく

于 2018-10-04T07:49:57.807 に答える
-4
于 2014-02-20T02:43:10.590 に答える