Amazon ECS-サービスのすべてのタスクを再起動するにはどうすればよいですか?


16

外部データソースからいくつかの設定ファイルをロードするタスクがあります。設定がアップロードされた後、設定がすべてのインスタンスに反映されるように、サービス内のすべてのタスクを再起動できるようにします。

すべてのサービスを再起動する最良の方法は何ですか?

「タスクの数」を0に設定してからバックアップする「回避策」がありますが、これは確実に実行されるはずの方法ではなく、ダウンタイムがあります。


PS:誰かが素晴らしいAmazon-ecsタグを作成できたら:)
Dennkster

タグを呼び出して、yaに追加しました。
ceejayoz

Amazonのこのドキュメントでは、現在使用している回避策について説明していますか?
マット

回答:



7

何をしたいのかは、基本的にサービスの再デプロイと同じです。

ダウンタイムなしでサービスを再デプロイするには:

  1. 現在のタスク定義に基づいて新しいタスク定義を登録します(同じ詳細を使用)
  2. UpdateServiceを呼び出して、既存のサービスを新しいタスク定義に関連付けます。

これにより、新しいタスク定義の新しいタスクが起動され、古いタスク定義の古いタスクが強制終了され、ダウンタイムなしでタスクが効果的に再起動されます。

参照:UpdateService


1
AWSコンソールでこれを行う必要があり、これが最も簡単な方法です。必要な場合は、プロセス全体を手動で管理できます。すべてのタスクをすばやく再起動する必要があり、プロセスに対してより堅牢な設定が必要ない場合に役立ちます。UIで、タスク定義に移動し、新しいリビジョンを作成して、サービスを更新します。タスクが再起動されました!
-geerlingguy

2
サービスの更新「Force new deployment」にチェックボックスが追加され、プロセスのステップ1をスキップできます。
ジョシュヴィッ

「新しい展開を強制する」オプションについてのコメントは、私自身の回答です。
ecbrodie

3

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

aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh

その後、タスクは同じインスタンスで再作成されます。

新しいインスタンスが必要な場合は、これを使用します:

aws ecs list-services --cluster <cluster_name> | jq -r ".serviceArns[]" | awk '{print "aws ecs update-service --cluster <cluster_name> --force-new-deployment  --service \""$0"\""}' | sh

2番目のものは、新しいインスタンスを開始する以外のことをしているようです。
user130681

2

ECSの構成要素としてのタスクは、StopTask呼び出しによって停止できます。サービスは、同じAPI呼び出しで停止される可能性のある基礎タスクで構成されます。ここで不足しているのは、定義されたファミリパラメータを使用したListTasks呼び出しの結果のforeach です。これに役立つ簡単なLambda関数を作成しました。


1

上記の@ user326608の回答を拡張しています(洞察に感謝します!)。

これは、すべてのタスクを停止することにより、クラスターのすべてのサービスのすべてのタスクを再起動します。各サービスは自動的に起動しますX新しいタスク、多数のXサービスのですがdesired task count

#!/bin/bash

index=0
taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)

until [ "$taskArn" = "None" ]
do 
  aws ecs stop-task --cluster ${CLUSTER_NAME} --task $taskArn
  ((index++))
  taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)
done

注:単一のサービスのタスクを再開する場合は、@ Ben Whaleyが説明したように、単に新しい展開を強制します。
sudoの魂

0

Amazonのドキュメントに基づくと、UpdateService API呼び出しを使用して問題の操作をスクリプト化できるはずです。前のリンクで利用可能ないくつかのコードサンプルがありますが、適応できるはずです。タスク構成の更新後、適切なタスク定義を使用してサービスをリロードするようにスクリプトを作成することが、この問題の最もエレガントな解決策のようです。

サービスの再起動をバッチスクリプトで処理する最も簡単な方法であると思われるECSでのAWS CLIの使用に関する詳細なドキュメントがあります。


スクリプト/コマンドシーケンスの作成と投稿に取り組むことはできますが、現在この種のテストに使用できるAWSアカウントへのアクセス権はありません。効果的にテストできるようになります...
マット


0

私はこれに取り組んでいます。一度に1つのタスクを確実に再起動できると便利です。以下のスクリプトは、私が現在使用しているものです。かなり慎重です。タスクごとにリターンを押す必要があります。サービスが安定するのを待つコマンドがありますが、それはタスクが正常であることを意味するものではありません。そして、私は時間を遅らせることができました。しかし、最終的に事態が悪化した場合、スクリプトはアプリをゆっくりと殺します。そう...

#!/bin/bash

if [ $# -eq 2 ]
then
    cluster=$1
    service=$2
else
    echo "Usage: $0 <cluster> <service>"
    exit 1
fi

echo
echo "Restarting $cluster $service tasks:"
echo

for task in $(aws ecs list-tasks --cluster $cluster --service-name $service | awk '{print $2}')
do
    echo
    echo -n "Press enter to stop $task"
    read -r
    echo
    echo "stopping $task..."
    aws ecs stop-task --cluster "$cluster" --task "$task"
    echo
    # aws ecs wait services-stable --cluster "$cluster" --services "$service"    done

0

ffを実行するPython boto3スクリプトがあります。

  1. を介してサービスの「実行中」ステータスのタスクのリストを作成します

ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')

  1. 上記のタスクのリストに対してforループを実行し、各ビアを停止します

ecs_client.stop_task(cluster=mycluster,task=mytask)

  1. runningCountとdesiredCountを取得するサービスを記述します

ecs_client.describe_services(cluster=mycluster,services=[myservice])

  1. whileループがrunningCount <desiredCountの場合-タスクが現在停止中であり、まだ置き換えられていないため、次のタスクをまだ停止しないでください!

while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:

whileループがもう真ではない場合-実行中のカウントと目的のカウントの両方が等しい場合は、リスト内の次のタスクを停止します。

これが実際のフローであり、現在の仕事にまだ雇用されており、すべてのコードがそれらに属しているため、実際のコードを表示することはできません:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.