บทความนี้ก็เราจะเน้นเรื่องของการลงมือทําเหมือนเช่นเคย ไม่ต้องอ่านมาก ไปลงมือเล่นกันดีกว่า เรียนรู้อย่างงี้จะเข้าใจมากกว่า อ่านอย่างเดียวแน่นอน

GitHub Repository: https://github.com/howtoautomateinth/lazy-aws-slackbot

แนะนําให้กด STAR ไว้ที่ repository ด้วย จะได้ไม่พลาดทุกการ update เพราะว่าเวลามีอะไรใหม่มาจะคอยอัพเดตผ่าน repository นี้


เนื่องจากสมัยนี้เป็นยุคของเทคโนโลยีและคนทุกคนก็ขี้เกรี้ยจกันมากขึ้น ดังนั้นถ้าเรามี BOT ซักตัวที่คอยทําหน้าที่เหมือนพ่อบ้านให้เรา คอยจัดการธุระและคอยเตือนเราทําหลายๆอย่างคงดีไม่น้อย  🙂

ดังนั้นบทความนี้จะสอนวิธีการสร้าง Bot ที่ทํางานบน Chat ยอดนิยมอย่าง Slack ด้วยภาษา Python โดยบทความจะมีเนื้อหาหลักๆอยู่ 2 ส่วนก็คือ

  1. Simple Slack BOT
    • เป็นวิธีการสร้าง BOT application, deploy to workspace, get API & Secret Keys
    • register event ด้วย ngrok
    • tracking conversation สําหรับ interact with current user
    • ข้อควรระวังทั้งหลายเช่น X-Slack-No-Retry:ที่เมื่อเรา response ช้าเกิน 3 วิ มันจะส่ง retries message ให้
  2. AWS Lazy BOT
    • เป็น BOT ที่จะ queries EC2 instance name บน AWS ลงมาให้เรา เพื่อที่เราจะได้ไม่เสียเวลาไปเปิดดูชื่อ instance เอง
    • เป็นการลดเวลาการทํางานอย่างนึง ให้เรามีเวลาไปทําอย่างอื่นนั้นเอง

ส่วนเจ้า Lazy AWS BOT จะมี diagram ง่ายๆแบบรูปด้านล่างนี้

โดยมีขั้นตอนง่ายๆดังนี้

  1. เราคุยกับ BOT ผ่าน Slack
  2. BOT ส่ง request ไปหา API Gateway ที่ผูกกับ Lambda function ไว้
  3. Lambda function ไปทําการ queries EC2 instance แล้วก็เอาชื่อ instance ลงมาให้เรา display ผ่าน slack

ผลลัพธ์จะออกมาหน้าตาแบบนี้

จะเป็น BOT ที่เรา mention ด้วย @lazyawsbot บอกมันว่าต้องการคุยเรื่อง AWS แล้วมันจะตอบเรากลับมา

ลอง mention แบบไม่ถามสิ มันจะขี้บ่นหน่อยๆ

มาดูตัว Workshop ที่จะเล่นกัน

โดยแบ่งออกเป็น 2 ส่วนคือ

  1. Simple Slack BOT
    • พวกนี้จะเป็นตัวอย่างของการสร้าง Slack BOT ด้วยภาษา python
    • ซึ่งจริงๆแล้วการสร้าง Slack BOT ไม่ได้ยากอะไร เพียงแต่การเข้าใจ workflow ของมันและการ setup environment ในครั้งแรก อาจจะมีงงๆอยู่บ้าง
  2. AWS folder
    • ส่วนนี้จะเป็นตัวอย่างการเขียน BOTO ที่เป็น client AWS library (python) เชื่อมต่อกับ AWS
    • และ  AWS LAZY BOT ที่เป็นตัวหลักเวลาเราคุยกับ BOT นั้นเอง

ก่อนจะเริ่มใช้งานโปรเจคต้องทํา…

อย่างที่บอกมันค่อนข้างยุ่งยากกับการ setup environment มากหน่อย โดยแบ่งเป็น 2 ส่วนเหมือนเดิมนะ

Simple Slack BOT

  1. เราต้องไปสร้าง BOT ของเราที่ https://api.slack.com/apps ก่อนเลย พร้อมทั้งเลือก slack workspace ที่เราต้องการจะ deploy ลงไป
  2. ไปตั้งค่าใน OAuth & Permission เพื่อ install app ใน workspace นั้น เช่น permission ที่เจ้า Bot จะสามารถทําได้แบบตัวอย่างด้านล่าง
    • แล้วเราถึงจะสามารถกด install ได้
  3. หลังจากนั้นในหน้าของ Basic Information และ OAuth Permission จะมีพวก credential ที่เราต้องใช้ขึ้นมาละ
  4. ไอ้เจ้า Token สองตัวนั้นเอาไว้ทําอะไร? แน่นอน การเรียก API เราไม่มีทางที่จะสามารถเรียกตรงๆแบบไม่มี security ได้อยู่แล้ว มันอันตรายเกินไป
    • เจ้าสองตัวนี้ มันเลยมีไว้คุยกับ SLACK API นั้นเอง โดยเราจะเอาไปใส่ไว้ใน Launch.json ที่ทําขึ้นมาไว้แล้ว เพื่อให้ง่ายต่อการทํางาน
    • หรือ จะเอาไปใส่ใน script file เพื่อสั่ง export ไปเป็น environment variables ก็ได้เหมือนกัน
  5. มาถึงขั้นตอนนี้ สิ่งที่จะได้คือ เราจะมี Bot ที่สามารถส่ง Message เข้าไปใน Slack ได้แล้วนั้นเอง แต่ที่ยังขาดคือ
    • มันส่งได้อย่างเดียว … push strategy แต่ไม่สามารถทํา pull strategy ได้
    • หรืออีกความหมายมันฟังข้อความที่คุยกันในนัน้นไม่ได้ นั้นเอง
    • สิ่งที่เราจะทําคือ
      • Local server ด้วย ngrok
        • ngrok ทําหน้าที่เป็นตัวขุดเหมือง tunnel ให้กลายเป็น public DNS คนสามารถเข้ามาหาเราได้
        • ส่วน server ที่จะสร้างก็จะใช้ Flask ง่ายๆของ python ที่ทําให้มันกลายเป็น web server สบายๆ
        • ตัวอย่างแบบเข้าใจไม่ยากที่นี้เลย simple_RTM.py
          • จะใช้ Flask เปิด port 3000 รอรับ request
          • แล้วก็ใช้คําสั่ง ngrok http 3000 เพื่อสร้าง tunnel แค่นี้ก็จะได้ public DNS มาใช้งานละ
      • Event Subscription
        • เมื่อมีการส่ง event กันผ่าน slack มันจะทําการ call back กลับมาที่ subscription local server ของ ngrok นั้นเอง
        • แล้วเราก็ดัก event และ reaction กลับไป

แค่นี้ก็หมดขั้นตอนเตรียมตัวใช้งานของ Slack Bot ละ 🙂 อาจจะยุ่งยากนิดหน่อย แต่ทั้งหมดก็จะประมาณนี้ ไม่มากน้อยกว่านี้เท่าไร

AWS Slack BOT

ส่วนอันนี้ต้องเตรียมหลายอย่างหน่อยสําหรับคนที่ไม่เคยทํา AWS บนเครื่องมาก่อน

  1. สร้าง User บน AWS โดยสร้าง group และ user แยก permission ออกมา เพื่อให้เป็นระเบียบ
    • สั่ง AWS command line ให้มัน configure user นี้ลงเครื่องพร้อม secret & access key
  2. สร้าง API Gateway และ Resource,Method GET /instance
    • แล้วนํา URL ไปใส่ใน file aws_helper.py เพื่อไว้ใช้เวลา quries
  3. สร้าง EC2 Instance และ ติด Tag Purpose value เป็น slack
  4. สร้าง Lambda Function และ ให้ permission EC2 Administrator
    • copy-paste engineering โดยการเอา lambda_boto.py ไปแปะใน lambda จะได้ผลลัพธ์แบบด้านล่าง

ถ้าขั้นตอนพวกนี้ยากไป ทําแค่ขั้นแรกก็พอ สร้าง user กับ set configure ลงเครื่องแล้วลองรัน file list_instance.py มันจะได้ผลเหมือนข้างบน เป็นการใช้ BOTO3 ดึงข้อมูลลงมา (แต่มันจะไม่สามารถสร้าง Slack Bot ได้นะ)

ขั้นตอนการรันโปรเจค

  1. หลังจากทําขั้นตอนข้างบนของ Simple Slack Bot มาหมดแล้วให้รันด้วย launch.json จะง่ายสุดแต่ต้องใส่ signing secret และ bot token ก่อนนะ
  2. หลังจาก run flask server แล้วให้ใช้ ngrok ด้วย command line
    • ngrok http 3000
    • เพื่อเปิด tunnel
  3. ไปที่ slack workspace ของเราแล้วก็ mention bot ด้วย @something AWS
    • เราก็จะได้ message ของ BOT โต้ตอบกับเรานั้นเอง
  4. ของ AWS ก็แบบเดียวกันเพียงแต่ run file aws_lazy_bot.py แทน ซึ่งใน Launch.json สร้างไว้ให้แล้ว

ข้อควรระวัง

  • Slack ไม่มี logic ในการ track conversation นะ สิ่งพวกนั้นเราต้องทําเอง เช่นเราเก็บ user id ของคนที่คุยกับ Bot ลง database หรือ memory เพื่อ track user และคุยกันเป็นประโยคยาวๆๆๆได้ เช่นตัวอย่างอันนี้ simple_track_conversation.py
    • จะมีการเก็บ conversation ลง list นั้นเอง
  • บางทีเราจะได้ message ซํ้าจากทํา slack bot นะ เพราะว่ามันมีเรื่องของ retires 3 seconds แล้ว server เราช้าจาก localhost นั้นเอง อ่านเต็มๆได้จากที่นี้ Events API หัวข้อ Graceful retries
    • ช้าตอนยิงเข้า lambda แล้วเอา lambda ไป quires EC2 instance
    • ถ้าอยากปิดสามารถทําได้เหมือนกันส่ง HEADER เพิ่มใน HTTP request X-Slack-No-Retry นั้นเอง

บทความนี้ก็เราจะเน้นเรื่องของการลงมือทําเหมือนเช่นเคย ไม่ต้องอ่านมาก ไปลงมือเล่นกันดีกว่า เรียนรู้อย่างงี้จะเข้าใจมากกว่า อ่านอย่างเดียวแน่นอน

GitHub Repository: https://github.com/howtoautomateinth/lazy-aws-slackbot

แนะนําให้กด STAR ไว้ที่ repository ด้วย จะได้ไม่พลาดทุกการ update เพราะว่าเวลามีอะไรใหม่มาจะคอยอัพเดตผ่าน repository นี้


 

0 0 vote
Article Rating
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments