2015-07-17 32 views
16

Tôi muốn tự động triển khai ứng dụng của mình bằng cách khởi chạy dịch vụ ECS bằng hình ảnh Docker mới nhất. Từ những gì tôi đã đọc, cách triển khai phiên bản hình ảnh mới như sau:Dịch vụ ECS - Tự động triển khai với hình ảnh Docker mới

  1. Tạo bản sửa đổi công việc mới (sau khi cập nhật hình ảnh trên kho lưu trữ Docker).
  2. Cập nhật dịch vụ và chỉ định bản sửa đổi mới.

Điều này có vẻ hiệu quả nhưng tôi muốn thực hiện điều này thông qua CLI để tôi có thể viết kịch bản. # 2 có vẻ dễ dàng để thực hiện thông qua AWS CLI với update-service, nhưng tôi không thấy cách làm # 1 mà không chỉ định toàn bộ Task JSON một lần nữa như với register-task-definition (JSON của tôi sẽ bao gồm thông tin đăng nhập trong các biến môi trường, vì vậy tôi muốn có điều đó ở càng ít địa điểm càng tốt).

Đây có phải là cách tôi nên tự động hóa triển khai bản cập nhật Dịch vụ ECS của mình không? Và nếu có, liệu có một cách "tốt" để Định nghĩa tác vụ khởi chạy bản sửa đổi mới (tức là không sao chép mọi thứ)?

+2

Bí quyết này là 'description-task-definition' sẽ chứa định nghĩa công việc ban đầu của bạn với _containerDefinitions_ làm khóa. Tôi đã thành công với việc sửa đổi điều này rồi chạy 'register-task-definition' để đăng ký một định nghĩa mới. Nếu bạn lo lắng về ENV, giải pháp dễ nhất là sử dụng một trong các SDK không bash. –

Trả lời

12

Vâng, đó là cách tiếp cận chính xác.

Và không, với API hiện tại, bạn không thể đăng ký bản sửa đổi mới của định nghĩa tác vụ hiện có mà không cần sao chép nó.

Nếu bạn không sử dụng CLI để tạo ra định nghĩa nhiệm vụ ban đầu (hoặc không muốn sử dụng lại các lệnh ban đầu mà tạo ra nó), bạn có thể thử một cái gì đó như sau qua CLI:

OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>) 
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"') 
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

Không an toàn 100% khi đối số --container-defintions của lệnh cuối cùng (bao gồm các mục nhập "environment") sẽ vẫn hiển thị thông qua các quá trình như ps. Một trong những SDK AWS sẽ mang lại sự an tâm tốt hơn.

+0

Bạn cũng có thể cần các phần khác như khối lượng. Chỉ cần sử dụng jq để phân tích cú pháp, sau đó nối thêm các tùy chọn (ví dụ: --volumes VOLUMES_DEF) vào 'register-task-definition' –

4

Câu trả lời được cung cấp bởi Matt Callanan không làm việc cho tôi: Tôi nhận được một lỗi trên phần này:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

Dẫn đến: Lỗi phân tích cú pháp tham số '--container-định nghĩa': Dự kiến: '=' , nhận được: '' 'cho đầu vào:

' {môi trường: [{etc etc ....

tôi đã làm gì để giải quyết nó là:

TASK_FAMILY=<task familiy name> 
DOCKER_IMAGE=<new_image_name> 
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY}) 

echo $LATEST_TASK_DEFINITION \ 
    | jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \ 
    | jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \ 
    > /tmp/tmp.json 

aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json 

Tôi lấy cả phần tử containerDefinitions và khối lượng từ tài liệu json gốc, vì containerDefinition của tôi sử dụng các ổ đĩa này (vì vậy nó không cần thiết nếu bạn không sử dụng khối lượng).

Các vấn đề liên quan