ทำไม
ตอนนี้กำลังเขียน node.js app บน ECS ซึ่งจะต้องรัน build ผ่าน Gitlab CI
ตอนแรกเราใช้วิธีการ push latest image แล้วเข้าไปใน ECS console เพื่อ stop task เอง เพราะว่าเร่งทำ code เลยไม่ได้ใส่ใจอะไรนัก (ช่วงแรกๆก็โค้ดบน local บ่อย ไม่ได้ deploy เลยไงล่ะ :D)
ก็ง่ายดี แต่ตอนนี้เริ่มขี้เกียจ
เลยเพิ่มคำสั่งไปใน GitlabCI หลังจากที่ทำ build และ push docker image เสร็จ ดังนี้
aws ecs list-tasks --cluster $CLUSTER_NAME | \
jq -r '.taskArns[]' | \
while IFS= read arnId; do aws ecs stop-task --cluster $CLUSTER_NAME --task $arnId; done
มันทำอะไร
1. มันลิสรายการของ task ที่รันอยู่บน cluster ที่ต้องการ
aws ecs list-tasks --cluster $CLUSTER_NAME
คำสั่งนี้คือการลิสรายการ task ใน cluster ที่ต้องการออกมา
จะได้ output ออกมาเป็ร JSON หน้าตาแบบนี้
{
"taskArns": [
"arnId",
...
]
}
ซึ่งจะเอาไปเป็น input ในคำสั่งถัดไปด้วย pipe (|)
2. ใช้ jq แปลงข้อมูลจาก JSON มาเป็น text ที่พร้อมเอาไปใช้งานต่อ
jq เป็นเครื่องมือที่ใช้อ่านและแปลง JSON เป็นอะไรก็ตามที่เราต้องการ
jq -r '.taskArns[]'
คำสั่งนี้จะดึงข้อมูลภายใต้ JSON ที่มี key ชื่อ taskArns (และ value เป็น Array)
จริงๆคำสั่งเต็มๆที่ผ่าน | จะเป็นแบบนี้
jq -r '.taskArns[]' "{
"taskArns": [
"arnId",
...
]
}"
และได้ output แบบนี้
arnId1
arnId2
...
3. สั่ง stop task พวกนั้น จาก output ของ jq
while IFS= read arnId; do aws ecs stop-task --cluster $CLUSTER_NAME --task $arnId; done
หลังจากได้ output ของ jq
จะเอามา loop read ลงตัวแปรชื่อ arnId
แล้วรัน aws ecs stop-task --cluster $CLUSTER_NAME --task $arnId
ซึ่งเป็นคำสั่งที่ใช้ stop task ที่ได้มาจาก loop นั่นเอง
จบ
Top comments (0)