Amazon ECS - Làm thế nào để bạn khởi động lại tất cả các Nhiệm vụ của Dịch vụ?


16

Chúng tôi có một nhiệm vụ tải một số tệp cấu hình từ nguồn dữ liệu ngoài. Sau khi cài đặt được tải lên, chúng tôi muốn có thể khởi động lại tất cả các tác vụ trong một dịch vụ để các cài đặt lan truyền đến tất cả các trường hợp.

Cách tốt nhất để khởi động lại tất cả các dịch vụ là gì?

Chúng tôi có một 'cách giải quyết' liên quan đến việc đặt 'số lượng nhiệm vụ' thành 0 và sau đó sao lưu, nhưng đây chắc chắn không phải là cách nó được thực hiện và có thời gian chết.


Tái bút: Nếu ai đó có thể tạo thẻ amazon-ecs sẽ rất tuyệt :)
Dennkster 14/07/2015

Cuộc gọi tốt trên thẻ, tôi đã thêm nó cho bạn.
ceejayoz

Tài liệu này từ Amazon có giải thích cách giải quyết mà bạn hiện đang sử dụng không?
Matt

Câu trả lời:


15

Sử dụng công cụ AWS CLI:

aws ecs update-service --force-new-deployment --service my-service

7

Những gì bạn muốn làm về cơ bản giống như triển khai lại Dịch vụ.

Để triển khai lại dịch vụ mà không có thời gian chết:

  1. Đăng ký Định nghĩa nhiệm vụ mới dựa trên Định nghĩa nhiệm vụ hiện tại (có cùng chi tiết)
  2. Gọi UpdateService, liên kết Dịch vụ hiện tại với Định nghĩa nhiệm vụ mới.

Việc này sẽ khởi chạy các Nhiệm vụ mới cho Định nghĩa nhiệm vụ mới và sau đó tiêu diệt các Nhiệm vụ cũ cho Định nghĩa nhiệm vụ cũ, khởi động lại hiệu quả các nhiệm vụ mà không có thời gian chết.

Xem: Cập nhật dịch vụ


1
Tôi cần phải thực hiện việc này thông qua Bảng điều khiển AWS và đây là cách dễ nhất mà bạn có thể quản lý toàn bộ quy trình theo cách thủ công nếu bạn cần. Hữu ích khi bạn cần nhanh chóng khởi chạy lại tất cả các tác vụ và không có thứ gì mạnh mẽ hơn được thiết lập cho quy trình - trong UI, đi đến định nghĩa Nhiệm vụ, tạo bản sửa đổi mới, cập nhật dịch vụ, sau một thời gian Nhiệm vụ được khởi chạy lại!
ge Muffguy

2
Họ đã thêm một hộp kiểm vào bản cập nhật dịch vụ "Buộc triển khai mới" cho phép bạn bỏ qua bước 1 trong quy trình của mình.
Josh Vickery

Nhận xét về tùy chọn "Buộc triển khai mới" là Câu trả lời được chấp nhận cho bản thân tôi.
ecbrodie

3

điều này làm việc cho tôi:

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

các tác vụ sau đó tạo lại trên cùng một trường hợp.

nếu bạn cần phiên bản mới, thì hãy sử dụng điều này:

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

Cái thứ hai đó dường như làm một cái gì đó khác hơn là bắt đầu những trường hợp mới.
dùng130681

2

Nhiệm vụ như khối xây dựng của ECS có thể được dừng bằng cuộc gọi StopTask . Dịch vụ bao gồm các tác vụ cơ bản có thể bị dừng với cùng một lệnh gọi API. Chỉ thiếu một phần ở đây là thông báo xung quanh kết quả từ cuộc gọi ListT task với tham số gia đình được xác định . Tôi đã viết hàm Lambda đơn giản có thể giúp bạn điều này.


1

Tôi đang mở rộng câu trả lời của @ user326608 ở trên (cảm ơn vì sự sáng suốt!).

Điều này sẽ khởi động lại TẤT CẢ NHIỆM VỤ CHO TẤT CẢ CÁC DỊCH VỤ CHO MỘT CLUSTER bằng cách dừng tất cả các nhiệm vụ của nó. Mỗi dịch vụ sau đó sẽ tự động khởi chạy Xsố lượng tác vụ mới, đó Xlà dịch vụ 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

Lưu ý: Nếu bạn muốn khởi động lại các tác vụ cho một dịch vụ, chỉ cần buộc triển khai mới như @Ben Whaley đã mô tả.
linh hồn sudo

0

Dựa trên tài liệu của Amazon, có vẻ như bạn sẽ có thể tạo kịch bản cho các hoạt động được đề cập bằng cách sử dụng các lệnh gọi API UpdateService . Có một số mẫu mã có sẵn tại liên kết trước đó, có vẻ như bạn sẽ có thể thích nghi. Có vẻ như viết một kịch bản để xử lý việc tải lại các dịch vụ bằng cách sử dụng định nghĩa tác vụ phù hợp sau khi cập nhật cấu hình tác vụ sẽ là giải pháp tốt nhất cho vấn đề.

Có nhiều tài liệu hơn về việc sử dụng AWS CLI với ECS , có vẻ như đó là cách dễ nhất để xử lý kịch bản hàng loạt khi khởi động lại dịch vụ.


Tôi có thể viết và đăng chuỗi lệnh / lệnh nhưng hiện tại tôi không có quyền truy cập vào tài khoản AWS. Tôi có thể sử dụng để kiểm tra loại điều này, vì vậy nó sẽ là một bản nháp / điểm bắt đầu thô vì tôi sẽ không có thể kiểm tra nó một cách hiệu quả ...
Matt


0

Tôi đã làm việc về điều này. Nó khá hữu ích để có thể khởi động lại một nhiệm vụ một cách đáng tin cậy. Kịch bản dưới đây là những gì tôi đang sử dụng bây giờ. Nó là khá thận trọng. Yêu cầu bạn nhấn return cho mỗi nhiệm vụ. Có một lệnh để chờ dịch vụ ổn định, nhưng điều đó không có nghĩa là nhiệm vụ đó là lành mạnh. Và tôi có thể đặt thời gian trì hoãn. Nhưng cuối cùng, nếu mọi thứ trở nên tồi tệ, kịch bản sẽ từ từ giết chết ứng dụng. Vì thế...

#!/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

Tôi có một kịch bản boto3 python thực hiện ff:

  1. tạo danh sách các tác vụ với trạng thái 'CHẠY' cho một dịch vụ thông qua

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

  1. thực hiện một vòng lặp for cho danh sách các nhiệm vụ ở trên và dừng từng bước

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

  1. mô tả dịch vụ để có được RunningCount và mong muốnCount

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

  1. vòng lặp while nếu runningCount <wishCount - có nghĩa là một nhiệm vụ hiện đang bị dừng và chưa được thay thế, vì vậy đừng dừng nhiệm vụ tiếp theo!

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

Nếu vòng lặp while không còn đúng nữa - nghĩa là cả số lần chạy và số lượng mong muốn đều bằng nhau, hãy dừng tác vụ tiếp theo trong danh sách.

Đây là luồng thực tế và tôi không thể hiển thị mã thực tế vì tôi vẫn được sử dụng bởi công việc hiện tại của mình và tất cả mã của tôi thuộc về họ :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.