web-dev-qa-db-ja.com

AWS Elastic Beanstalk 504ゲートウェイのタイムアウト

Node AWS Elastic Beanstalkで実行されているサーバーがあります。エンドポイントの1つが巨大なペイロードを受け入れ、関数自体がかなり遅く、長く、10分以上かかる場合があります。

ビジネス要件のため、単一のHTTP POSTとして維持する必要があり、分割して小さくすることはできません。

より大きな通話では、常に60秒程度の504ゲートウェイタイムアウトが発生します。 Elastic Beanstalkロードバランサセクションのタイムアウト設定をいじってみましたが、最長のタイムアウト期間はとにかく60秒です。

https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html のドキュメントで有望な解決策が1つありました。

ファイルのアップロードなどの長い操作が完了するまでの時間を確保するには、各アイドルタイムアウト期間が経過する前に、少なくとも1バイトのデータを送信します

これはまさに私が必要とするもののように聞こえますが、私は達成する方法がわかりません

1)セッションを確実にするために、my Node appから「少なくとも1バイトのデータを送信する」にはどうすればよいですか?存続し、1分後にタイムアウトしない

11
Joshua Ohana

ElasticBeanstalk環境の504タイムアウトは、ELBポリシーを設定することで解決できます。 Nginxタイムアウト設定の更新も必要になる場合があります。

  • ELBポリシー:Elastic Load Balancerのアイドルタイムアウトを選択した値(デフォルトは60秒)に設定します。これを行うには、プロジェクトのルートに。ebextensionsフォルダーを作成します。このフォルダーで、ファイル拡張子が。configの別のファイルを作成し、ELBアイドルタイムアウトを任意の値(300秒など)に設定します。

    option_settings:
      - namespace: aws:elb:policies
        option_name: ConnectionSettingIdleTimeout
        value: 300
    

    または、アプリケーションロードバランサーを使用している場合:

    option_settings:
      - namespace: aws:elbv2:loadbalancer
        option_name: IdleTimeout
        value: 300
    
  • Nginxの設定:Nginxにタイムアウトの値を設定します:send_timeoutproxy_connect_timeoutproxy_read_timeout, proxy_Send_timeout all defaults to 60s(追加の仕様は次のとおりです:client_header_timeoutclient_body_timeoutkeepalive_timeout)。 Nginxのデフォルトのタイムアウト値は specifications および構成ファイル(たとえば、/etc/nginxの下の。configファイル)で指定されています。 .ebextensionsフォルダーに新しいファイルを作成(または上記の.configファイルで更新)し、ファイル内に次のコンテンツを追加します(監視されたタイムアウトに従って関連設定を追加または削除します)。

    files:
      "/etc/nginx/conf.d/nginx.custom.conf":
          mode: "644"
          owner: "root"
          group: "root"
          content: |
            client_header_timeout   300;
            client_body_timeout     300;
            keepalive_timeout       300;
            send_timeout            300;
            proxy_connect_timeout   300;
            proxy_read_timeout      300;
            proxy_send_timeout      300;
    
    container_commands:
      01_restart_nginx:
        command: "Sudo service nginx reload"
    

    この構成を追加する方法はいくつかあります。詳細は here および here です。

20
asaf am