web-dev-qa-db-ja.com

Amazon ECS-サービスのすべてのタスクをどのように再起動しますか?

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

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

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

18
Dennkster

AWS CLIツールの使用:

aws ecs update-service --force-new-deployment --service my-service
16
Ben Whaley

あなたがしたいことは、基本的にサービスを再デプロイすることと同じです。

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

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

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

参照: pdateService

9
Matt Callanan

これは私のために働きました:

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
3
user326608

ECSのビルディングブロックとしてのタスクは StopTask 呼び出しで停止できます。サービスは、同じAPI呼び出しで停止される可能性のある基礎となるタスクで構成されています。ここで欠けている部分は、定義済みの family パラメーターを使用した ListTasks 呼び出しからの結果のforeachのみです。私はこれを助けることができる簡単な Lambda関数 を書きました。

2
s7anley

上記の@ 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
1
sudo soul

私はpython ffを実行するboto3スクリプトを持っています:

  1. 経由でサービスのステータスが「実行中」のタスクのリストを作成する

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

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

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

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

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

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

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

Whileループがもう当てはまらない場合、つまり実行中のカウントと必要なカウントの両方が等しい場合は、リスト内の次のタスクを停止します。

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

0
pnocti

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

AWS CLI with ECS の使用に関するドキュメントが他にもあります。これは、サービスの再起動をバッチスクリプトで処理する最も簡単な方法のようです。

0
Matt

すばらしい https://github.com/fdfk/ecsServiceRestart

python ecsServiceRestart.py restart --services="app app2" --cluster=test
0
user8458170

私はこれに取り組んできました。一度に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
user130681