使用中のポートのため、ECS クラスターに新しいコンテナをデプロイできません。質問する

使用中のポートのため、ECS クラスターに新しいコンテナをデプロイできません。質問する

私のサービスが使用するタスク定義は、イメージの「最新」タグ付きバージョンを取得します。

ただし、サービスを更新して「新しいデプロイメントを強制」すると、イベントを確認すると次のようになります。

service MYSERVICE was unable to place a task because no container instance met all of its requirements. The closest matching container-instance .... is already using a port required by your task

その後、クラスターに移動してすべてのタスクを停止しました。

その後、サービスに戻り、強制的に新規デプロイして再度更新しました。これでうまくいったようです。

新しいイメージを展開するたびに、すべてのタスクを停止してサービスを更新する必要がありますか? または、これを行う「正しい」方法はありますか?

編集: 1 つのタスクを停止すると、サービスが自動的にそれを置き換えます。したがって、サービスを更新して「新しいデプロイを強制」し、一度に 1 つのタスクを停止して、一種のローリング アップデートを実行できます。独自のスクリプト以外に、これを自動化する機能があるかどうかはわかりません。

追記ですが、回答に記載されているように、動的ポート マッピングを使用する必要がありました。

最初はロードバランサーがなかったので、実行中のコンテナにアクセスするために EC2 インスタンスに直接アクセスしていました。もちろん、これを行うには EC2 ホストで静的ポートを公開する必要がありました。

ロード バランサを追加しましたが、動的ポート マッピングの仕組みを理解していないため、静的ポート マッピングを維持しました。タスク定義を変更してホスト ポートを「0」に設定するだけで済みました。これでホストに静的ポート マッピングがなくなり、NLB がルーティングを行い、期待どおりにデプロイされます。

ベストアンサー1

他の回答は正しいですが、あなたの問題には当てはまらないと思います。これは私のチームも直面した問題であり、同じインスタンスで複数のコンテナを起動しようとすることとはまったく関係がないため、このように言います。私の理解が正しければ、更新されたタスク定義から既存のコンテナを置き換えようとしているだけです。同じコンテナの複数のコピーを 1 つのボックスに配置したい場合は、他の回答の提案 (および以下の詳細) を必ず確認してください。ただし、ローリング デプロイの場合、動的ポートはまったく必要ありません。

[[ 完全を期すための補足: EC2 が ECS によって停止されたリソースをクリーンアップするのに時間がかかるため、強制デプロイでエラーが発生した可能性があります。タスクを強制的に停止/開始しようとすると、同じ種類の問題が発生します。使用可能なインスタンス メモリの 50% 以上を割り当てるように構成されたコンテナを再起動しようとしたときに、同様のエラーが発生しています。EC2 インスタンスが完全にクリーンアップされ、ECS に報告されるまで、これらのタイプのリソース エラーが発生します。これには 5 分以上かかることがあります。 ]]

では、あなたの質問ですが、残念ながら現時点ではAWSにはタスクのローリング再起動を実行するための優れた組み込みメカニズムはありません。しかし、できるローリングをする展開する

すでにご存知かと思いますが、サービスは指定されたタスク定義に依存しています。タスク定義番号、そして気にしないコンテナタグEC2 インスタンスと同じように。

以下の設定は、ローリング デプロイを有効にするための魔法が起こる場所です。これらの構成オプションは、サービス設定で見つけることができます。

魔法

ローリングデプロイを実行するには、少なくとも 2 つのタスクを実行する必要があります。

  • タスク数 --サービスが実行したいタスクの数 (n)
  • 健康の最低割合 --n新しいタスクを展開するときの最小の健全な%
  • 最大パーセント --n新しいタスクを展開するときに追加できる最大%

実際の例として、次のような構成があると仮定します。

Number of tasks: 3
Minimum healthy percent:  50
Maximum percent: 100

サービスが指しているタスク定義を変更すると、ローリング デプロイが開始されます。3実行中のタスクがありますが、>=50%正常 を許可します。ECS はタスクの 1 つを強制終了し、正常 % を に下げますが66%、それでも を上回っています50%。新しいタスクが起動すると、サービスは再び になり100%、ECS は次のインスタンスへのデプロイのローリングを続行できます。

同様に、 、 (容量があるminimum % == 100と仮定)という構成の場合、ECSはmaximum % == 150追加タスクを開始する; 一度起動すると、 の適切な割合が確保され133%、古いタスクの 1 つを安全に終了できます。このプロセスは、新しいタスクが完全に展開されるまで継続されます。

おすすめ記事