外部データソースからいくつかの設定ファイルをロードするタスクがあります。設定がアップロードされた後、設定がすべてのインスタンスに反映されるように、サービス内のすべてのタスクを再起動できるようにします。
すべてのサービスを再起動する最良の方法は何ですか?
「タスクの数」を0に設定してからバックアップする「回避策」がありますが、これは確実に実行されるはずの方法ではなく、ダウンタイムがあります。
外部データソースからいくつかの設定ファイルをロードするタスクがあります。設定がアップロードされた後、設定がすべてのインスタンスに反映されるように、サービス内のすべてのタスクを再起動できるようにします。
すべてのサービスを再起動する最良の方法は何ですか?
「タスクの数」を0に設定してからバックアップする「回避策」がありますが、これは確実に実行されるはずの方法ではなく、ダウンタイムがあります。
回答:
何をしたいのかは、基本的にサービスの再デプロイと同じです。
ダウンタイムなしでサービスを再デプロイするには:
これにより、新しいタスク定義の新しいタスクが起動され、古いタスク定義の古いタスクが強制終了され、ダウンタイムなしでタスクが効果的に再起動されます。
これは私のために働いた:
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
Amazonのドキュメントに基づくと、UpdateService API呼び出しを使用して問題の操作をスクリプト化できるはずです。前のリンクで利用可能ないくつかのコードサンプルがありますが、適応できるはずです。タスク構成の更新後、適切なタスク定義を使用してサービスをリロードするようにスクリプトを作成することが、この問題の最もエレガントな解決策のようです。
サービスの再起動をバッチスクリプトで処理する最も簡単な方法であると思われるECSでのAWS CLIの使用に関する詳細なドキュメントがあります。
すばらしい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
ffを実行するPython 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ループがもう真ではない場合-実行中のカウントと目的のカウントの両方が等しい場合は、リスト内の次のタスクを停止します。
これが実際のフローであり、現在の仕事にまだ雇用されており、すべてのコードがそれらに属しているため、実際のコードを表示することはできません:)