外部データソースからいくつかの設定ファイルをロードするタスクがあります。設定がアップロードされたら、サービス内のすべてのタスクを再起動して、設定がすべてのインスタンスに伝達されるようにしたいと考えています。
すべてのサービスを再起動する最良の方法は何ですか?
「タスク数」を0に設定してからバックアップするという「回避策」がありますが、これは確実に想定されている方法ではなく、ダウンタイムがあります。
AWS CLIツールの使用:
aws ecs update-service --force-new-deployment --service my-service
あなたがしたいことは、基本的にサービスを再デプロイすることと同じです。
ダウンタイムなしでサービスを再デプロイするには:
これにより、新しいタスク定義の新しいタスクが起動され、古いタスク定義の古いタスクが強制終了され、ダウンタイムなしでタスクが効果的に再開されます。
参照: pdateService
これは私のために働きました:
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
上記の@ 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
私はpython ffを実行するboto3スクリプトを持っています:
ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')
ecs_client.stop_task(cluster=mycluster,task=mytask)
ecs_client.describe_services(cluster=mycluster,services=[myservice])
while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:
Whileループがもう当てはまらない場合、つまり実行中のカウントと必要なカウントの両方が等しい場合は、リスト内の次のタスクを停止します。
これは実際のフローであり、現在の仕事でまだ雇用されており、すべてのコードがそれらに属しているため、実際のコードを表示できません:)
アマゾンのドキュメントによると、問題の操作を pdateService API呼び出し を使用してスクリプト化できるようです。前のリンクで利用可能ないくつかのコードサンプルがありますが、適応できるはずです。タスク構成の更新後、適切なタスク定義を使用してサービスのリロードを処理するスクリプトを作成することが、問題に対する最もエレガントな解決策となるようです。
AWS CLI with ECS の使用に関するドキュメントが他にもあります。これは、サービスの再起動をバッチスクリプトで処理する最も簡単な方法のようです。
すばらしい https://github.com/fdfk/ecsServiceRestart
python ecsServiceRestart.py restart --services="app app2" --cluster=test
私はこれに取り組んできました。一度に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