loading...

บันทึก script สำหรับ stop ECS task

ilumin profile image Teerasak Vichadee ・1 min read

ทำไม

ตอนนี้กำลังเขียน 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 นั่นเอง

จบ

Discussion

markdown guide