19

3 つのインスタンスがアタッチされた Amazon AWS Elastic Load Balancer の背後で実行される Web アプリがあります。アプリには、/refresh参照データを再読み込みするためのエンドポイントがあります。週に数回、新しいデータが利用可能になるたびに実行する必要があります。

私が行ってきたことは、すべてのインスタンスにパブリック アドレスを割り当て、(を使用してec2-url/refresh) 個別に更新することです。別のトピックに関するマイケルの回答に同意します。ELB の背後にある EC2 インスタンスでは、直接のパブリック アクセスを許可しないでください。elb-url/refresh今私の問題は、ロードバランサーの背後にあるすべてのインスタンスに到達する呼び出しを行うにはどうすればよいですか?

そして、複数のインスタンスから HTTP 応答を収集できればいいのにと思います。しかし、今のところやみくもに更新してもかまいません。

4

7 に答える 7

11

この問題を解決する方法の 1 つは、

  1. データを AWS s3 バケットに書き込む
  2. s3書き込みからAWS Lambda関数を自動的にトリガーする
  3. AWS SDK を使用して、Lambda 関数から ELB にアタッチされたインスタンスを識別します。たとえば、pythonまたは AWS Java SDKのboto3 を使用します。
  4. Lambda から個々のインスタンスで /refresh を呼び出す
  5. (自動スケーリングまたはデプロイにより) 新しいインスタンスが作成されたときに、起動時に s3 バケットからデータをフェッチするようにする
  6. インスタンスが存在するプライベートサブネットが、Lambda にアタッチされたサブネットからのトラフィックを許可することを確認する
  7. インスタンスにアタッチされたセキュリティ グループが、Lambda にアタッチされたセキュリティ グループからのトラフィックを許可するようにします。

このソリューションの主な利点は次のとおりです。

  • データが s3 に書き込まれた瞬間から、プロセスは完全に自動化されます。
  • 自動スケーリング/デプロイによるデータの不整合を回避し、
  • 保守が簡単 (インスタンスの IP アドレスをハードコードする必要はありません)、
  • VPC の外部にインスタンスを公開する必要はありません
  • 高可用性 (AWS は、Lambda が s3 書き込みで呼び出されることを保証します。インスタンスでスクリプトを実行し、インスタンスが稼働中であることを確認することについて心配する必要はありません)

これが役に立つことを願っています。

于 2017-10-05T04:00:30.407 に答える
7

これは、アプリケーションと状況の制約を考えると不可能かもしれませんが、AWS ELB の背後で実行されているインスタンス (特に AutoScalingGroup の一部である場合) のベスト プラクティス アプリケーション アーキテクチャでは、インスタンスがステートフルではないことが保証されていることに注意してください。

アイデアは、データの整合性やパフォーマンスを損なうことなく、新しいインスタンスを追加してスケールアウトしたり、インスタンスを削除してスケールインしたりできるようにすることです。

1 つのオプションは、アプリケーションを変更して、参照データのリロードの結果をインメモリではなく、キャッシュやデータベース (Elasticache や RDS など) などのインスタンス外のデータ ストアに保存することです。

アプリケーションがそれを行うことができれば、refresh単一のサーバーでエンドポイントをヒットするだけで済みます。参照データをリロードし、目的に適した方法で効率的に保存するために必要な分析と操作を行います。アプリケーションをデータ ストアに保存すると、すべてのインスタンスが共有データ ストアを介して更新されたデータにアクセスできるようになります。

データ ストアへのラウンドトリップを追加するとレイテンシが増加しますが、現在のモデルでは、1 つのサーバーが参照データの更新で他のサーバーよりも遅れている場合、ELB がはスティッキー セッションを使用していないため、ELB 経由のリクエストは、割り当てられているサーバーに応じて一貫性のないデータを返します。

于 2016-09-14T20:31:34.680 に答える
6

これらのリクエストをロード バランサー経由で行うことはできないため、インスタンスのセキュリティ グループを開いて、ELB 以外のソースからの受信トラフィックを許可する必要があります。ただし、すべての直接トラフィックに対して開く必要があるという意味ではありません。セキュリティ グループの IP アドレスをホワイトリストに登録するだけで、特定のコンピューターからの要求を許可できます。

これらのサーバーにパブリック IP アドレスを追加したくない場合はcurl、VPC 内の EC2 インスタンスでコマンドのようなものを実行する必要があります。その場合、セキュリティ グループを開くだけで、VPC に存在するサーバー (またはサーバーのグループ) からのトラフィックを許可できます。

于 2016-09-14T19:48:08.610 に答える
2

ObjectCreatedS3 を使用しているため、S3 の通知を使用してタスクを自動化できます。

https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-notification.html

AWS CLI をインストールして、その ObjectCreated 通知を監視する簡単な Bash スクリプトを作成できます。新しいオブジェクトの作成に関する S3 通知を探す Cron ジョブを開始します。

スクリプト ファイルが S3 で作成された新しいオブジェクトを検出すると、そのスクリプト ファイルで「http://127.0.0.1/refresh」をカールするように条件をセットアップします。毎回。

于 2016-09-14T20:19:30.810 に答える