Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

AWS Lambda ช่วยให้เราตั้งค่าฟังก์ชันที่ปรับขนาดได้ในขณะที่ลดค่าใช้จ่ายลง แทนที่จะเขียน โฮสต์ และดูแลแอป Ruby on Rails ทั้งหมด เราสามารถใช้ฟังก์ชัน Lambda เพื่อตอบสนองต่อแต่ละเหตุการณ์ได้อย่างอิสระ บทความนี้จะนำคุณจากผู้ใช้ใหม่ของ AWS ไปสู่การเขียน Ruby ในฟังก์ชัน Lambda ของคุณเอง

Lambda อนุญาตให้คุณเรียกใช้โค้ดเพื่อตอบสนองต่อเหตุการณ์โดยไม่ต้องจัดการเซิร์ฟเวอร์ สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์นี้ทำให้มั่นใจได้ว่าคุณจะจ่ายเฉพาะสำหรับรหัสของคุณในขณะที่มันทำงานให้คุณ ไม่ใช่ในขณะที่มันไม่ทำงาน แม้ว่า Lambda มักใช้เพื่อตอบสนองต่อเหตุการณ์ภายในระบบนิเวศของ AWS เช่น การลบไฟล์ใน S3 Bucket แต่ก็สามารถกำหนดค่าให้ทำหน้าที่เป็น API ร่วมกับ AWS API Gateway ได้

สามารถใช้ Lambda เพื่อทำงานอัตโนมัติตามเวลา เช่น Cron Jobs หรือเพื่อตอบสนองต่อเหตุการณ์ ซึ่งอาจขยายไปสู่การประมวลผลข้อมูล บ่อยครั้งกับบริการอื่นๆ ของ AWS เช่น DynamoDB หรือแม้แต่ใน API ที่ปรับขนาดได้ ตัวอย่างเช่น ไดอะแกรมต่อไปนี้จากเอกสารประกอบของ Amazon แสดงสถาปัตยกรรมอย่างง่ายที่ไคลเอนต์มือถือส่งคำขอ HTTP ซึ่งน่าจะดำเนินการบางอย่างของ CRUD บนฐานข้อมูล API Gateway จะกำหนดเส้นทางคำขอไปยังฟังก์ชัน Lambda ที่เกี่ยวข้อง (เหมือนกับ Rails กำหนดเส้นทางคำขอ HTTP ไปยังตัวควบคุม) และดำเนินการตามตรรกะทางธุรกิจและสื่อสารกับ AWS DynamoDB เพื่อดำเนินการตามคำขอ

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

เนื่องจากโค้ดของเราทำงานในคอนเทนเนอร์ โครงสร้างพื้นฐานของ Amazon จะทำให้ฟังก์ชันนี้อยู่ในโหมดสลีปโดยอัตโนมัติเมื่อไม่ได้ใช้งาน เมื่อมีคำขอใหม่เข้ามา คอนเทนเนอร์ต้องเริ่มต้นจากสถานะเย็น ซึ่งสามารถเพิ่มเวลาดำเนินการได้ถึง 2000 มิลลิวินาที สิ่งนี้ไม่เพียงลดคุณภาพการบริการของคุณในแง่ของเวลาตอบสนอง แต่ยังทำให้คุณเสียเงินอีกด้วย ด้วยเหตุผลนี้ การใช้ Lambda กับงานที่ละเอียดอ่อนเรื่องเวลา เช่น การส่งอีเมลของผู้ใช้หรือการตอบสนองต่อเหตุการณ์ UI อาจสร้างปัญหาคอขวดได้ คุณสามารถบรรเทาปัญหานี้ได้โดยกำหนดเวลาให้ AWS CloudWatch ส่งคำขอเป็นระยะเพื่อให้ฟังก์ชัน 'อบอุ่น' แต่สิ่งนี้จะเพิ่มต้นทุนการโฮสต์

เหตุใดจึงควรใช้ AWS Lambda

Amazon Web Services (AWS) เป็นบริการคลาวด์คอมพิวติ้งที่ได้รับความนิยมมากที่สุดในโลก นักพัฒนาอิสระใช้งานได้ง่าย แต่มีประสิทธิภาพและปรับขนาดได้เพียงพอที่จะใช้เป็นโครงสร้างพื้นฐานสำหรับบริษัทที่ใหญ่ที่สุดในโลกบางแห่ง

AWS Lambda เป็นหนึ่งในข้อเสนอจาก Amazon ที่ทำหน้าที่เป็น 'บริการประมวลผลแบบไร้เซิร์ฟเวอร์' ซึ่งช่วยให้เราเรียกใช้โค้ดเพื่อตอบสนองต่อเหตุการณ์เท่านั้น ซึ่งช่วยลดค่าใช้จ่ายและทำให้เราสามารถตอบสนองต่อบางสิ่งโดยทางโปรแกรม เช่น การเรียก API โดยไม่ต้องโฮสต์เซิร์ฟเวอร์ทั้งหมดหรือสร้างทั้งแอป

สำหรับกรณีการใช้งานที่เหมาะสม สถาปัตยกรรมไร้เซิร์ฟเวอร์นี้สามารถประหยัดค่าใช้จ่ายได้มหาศาล ราคาคำนวณด้วยต้นทุนต่อคำขอและต้นทุนต่อระยะเวลาของเวลาในการคำนวณ หลังจากหนึ่งล้านคำขอในเดือนที่กำหนด ราคาจะอยู่ที่ $0.20 ต่อหนึ่งล้านคำขอ บวก 0.00016667 USD ต่อเวลาประมวลผลทุกๆ GB วินาทีที่ฟังก์ชันใช้ อย่างที่คุณจินตนาการได้ การกำหนดราคาตามอัตรานี้ทำให้การใช้บริการขนาดเล็กบนแลมบ์ดามีราคาถูกอย่างน่าทึ่ง ในขณะที่ยังคงตัวเลือกในการปรับขนาดได้อย่างไม่จำกัดในอัตราเดียวกัน

นักพัฒนา Ruby สามารถใช้ประโยชน์จากบริการคลาวด์นี้ได้โดยใช้เป็นวิธีไร้สัญชาติในการตอบสนองต่อการเรียก API หรือแม้แต่เหตุการณ์อื่นๆ ของ AWS

การตั้งค่าบัญชีทดลองใช้ AWS

AWS มอบ Free Tier ที่ค่อนข้างกว้างขวาง ซึ่งรวมคำขอฟรีหนึ่งล้านคำขอและเวลาประมวลผลสูงสุด 3.2 ล้านวินาทีต่อเดือนด้วย AWS Lambda! หากคุณมีบัญชีอยู่แล้ว คุณสามารถข้ามขั้นตอนนี้ได้ แต่การตั้งค่าบัญชีนั้นง่ายมาก

ไปลงทะเบียนที่นี่และกรอกข้อมูลของคุณเพื่อเริ่มต้น! การเขียนฟังก์ชัน AWS Lambda ใน Ruby

คุณจะได้รับแจ้งให้กรอกข้อมูลเพิ่มเติม รวมถึงประเภทบัญชีและข้อมูลติดต่อ และคุณจะต้องป้อนข้อมูลบัตรเครดิต/เดบิตเพื่อให้ครอบคลุมการใช้งานนอกระดับฟรี การใช้งาน Lambda แบบง่ายๆ ของเรารวมอยู่ใน Free Tier แล้ว แต่หากคุณกังวลเกี่ยวกับการใช้ Lambda เกินขนาดโดยไม่ได้ตั้งใจ คุณสามารถกำหนดงบประมาณเพื่อควบคุมการใช้งานและป้องกันการเรียกเก็บเงินที่ไม่คาดคิดได้

การสร้างฟังก์ชัน Lambda ด้วย Ruby

เมื่อคุณลงทะเบียนแล้ว ให้วางเมาส์เหนือ ผลิตภัณฑ์ จากนั้น คำนวณ และเลือก แลมบ์ดา .

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

เมื่อคุณอยู่ใน Lambda Console (คุณอาจต้องกด 'เริ่มต้น') คุณจะเห็นรายการฟังก์ชันว่างพร้อมปุ่มสีส้มสำหรับ "สร้างฟังก์ชัน" อย่างที่คุณอาจเดาได้ เราจะกดปุ่ม "สร้างฟังก์ชัน" สีส้ม

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

จากนั้น เราจะเลือก "Author from Scratch" เนื่องจากยังไม่มีฟังก์ชันเทมเพลตสำหรับ Ruby และการทำงานตั้งแต่เริ่มต้นคือวิธีที่ดีที่สุดในการเรียนรู้

คุณควรตั้งชื่อฟังก์ชันของคุณอย่างเหมาะสมและเลือกเวอร์ชัน Ruby ที่คุณต้องการใช้งาน ฉันโทรหา FizzBuzz หลังจากเกิดปัญหาการเขียนโปรแกรมอันโด่งดัง

คุณอาจต้องดับเบิลคลิกที่ lambda_function.rb ในบานหน้าต่างนำทางเพื่อให้ซอร์สโค้ดปรากฏขึ้น

ฟังก์ชันนี้เขียนไว้ล่วงหน้าและมีชื่อว่า lambda_handler . ตามที่ปรากฏ เมื่อมีการเรียกใช้ฟังก์ชันจะส่งคืนการตอบสนอง 200 พร้อมข้อความ "สวัสดีจากแลมบ์ดา!" ดังที่คุณเห็นด้านล่าง การเขียนฟังก์ชัน AWS Lambda ใน Ruby

การใช้ทริกเกอร์ทดสอบสำหรับฟังก์ชันแลมบ์ดา

ตามที่กล่าวไว้ในบทนำ ฟังก์ชันของแลมบ์ดาสามารถเรียกใช้งานได้หลากหลายวิธี สิ่งหนึ่งที่พบได้บ่อยที่สุดคือผ่านการเรียก API อย่างไรก็ตาม สิ่งนี้ต้องมีการตั้งค่า AWS API Gateway ซึ่งอยู่นอกขอบเขตของบทความนี้เล็กน้อย API Gateway ทำงานได้อย่างยอดเยี่ยมกับ Lambda เพื่อสร้าง API ที่มีการกำหนดค่าเพียงเล็กน้อยและปรับขนาดได้ไม่จำกัด

โชคดีสำหรับเรา การจำลองการเรียก API ผ่านคอนโซลฟังก์ชันไม่ยากเกินไป และ จัดคิวเหตุการณ์ทดสอบสำหรับเราแล้ว .

ข้างใต้ภาพรวมฟังก์ชันจะมีแถบเครื่องมือที่เลือก "รหัส" อยู่ ดังที่แสดงในภาพหน้าจอที่แล้ว ถัดจาก "รหัส" จะเป็นแท็บชื่อ "ทดสอบ " ไปข้างหน้าและเลือก "ทดสอบ" แล้วคุณจะเห็นคอนโซลการทดสอบปรากฏขึ้นแทนที่ซอร์สโค้ด

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

เหตุการณ์ทดสอบที่กำหนดค่าไว้ล่วงหน้าเป็นวัตถุ JSON ที่ถูกส่งไปยังฟังก์ชัน Lambda เป็น event วัตถุซึ่งฟังก์ชันใช้เป็นพารามิเตอร์ หากคุณกำลังเรียกปลายทางผ่าน API Gateway นี่จะเป็นเนื้อความของคำขอ

เนื่องจากฟังก์ชันตัวยึดตำแหน่ง Lambda ไม่อ่านเหตุการณ์ สิ่งที่เราส่งเป็นเนื้อหาจึงไม่สำคัญมากนัก ดังนั้น เราสามารถดำเนินการตามที่เขียนไว้ได้โดยแตะที่สีส้ม "Invoke ปุ่ม "

หากคุณตั้งค่าฟังก์ชันอย่างถูกต้อง คุณควรเห็นช่องสีเขียวชื่อ "Execution Succeeded" ซึ่งคุณสามารถขยายเพื่อดูการตอบสนอง JSON จากฟังก์ชันของคุณได้

การเขียน FizzBuzz

ตอนนี้เราได้ยืนยันแล้วว่าฟังก์ชัน Lambda ทำงานอย่างถูกต้องแล้ว เราสามารถปรับแต่งได้ด้วยโค้ด Ruby ของเราเอง ในตัวอย่างนี้ เราจะให้ฟังก์ชัน Lambda ของเราตอบสนองต่อปัญหา FizzBuzz ที่มีชื่อเสียง FizzBuzz เป็นรายการโปรดของการสัมภาษณ์ และข้อความแจ้งจะเป็นแบบนี้

เขียนโปรแกรมที่พิมพ์ตัวเลขตั้งแต่ 1 ถึง 50 แต่สำหรับผลคูณของสาม ให้พิมพ์ “Fizz” แทนตัวเลข จากนั้นพิมพ์ “Buzz” สำหรับผลคูณของห้า Fornumbers ที่ทวีคูณของทั้ง 3 และ fiveprint “FizzBuzz”

แทนที่โค้ดในฟังก์ชัน Lambda ด้วยโซลูชัน FizzBuzz ของฉัน -

require 'json'

def lambda_handler(event:, context:)
    max_val = event['max_val']
    textResponse = ''
    1.upto(max_val) do |i|
      if i % 5 == 0 and i % 3 == 0
        textResponse += "FizzBuzz"
      elsif i % 5 == 0
        textResponse += "Buzz"
      elsif i % 3 == 0
        textResponse += "Fizz"
      else
        textResponse += i.to_s
      end
    end
    { statusCode: 200, body: JSON.generate(textResponse) }
end

นี่เป็นเรื่องเล็กน้อยเกี่ยวกับ FizzBuzz ปกติ แทนที่จะวนซ้ำถึง 50 เราจะวนซ้ำผ่านหมายเลขที่ส่งไปพร้อมกับเหตุการณ์ วัตถุเหตุการณ์ถูกส่งผ่านเหมือนพจนานุกรม ดังนั้นขอ event[max_val] ส่งคืนค่าที่ max_val กุญแจ. สุดท้าย แทนที่จะพิมพ์โซลูชัน FizzBuzz เราเพียงแค่ผนวกเข้ากับสตริงที่เราส่งคืนเป็นวัตถุ JSON

ต่อไป อย่าลืมกดปุ่ม "ปรับใช้" สีส้มเพื่ออัปเดตฟังก์ชัน Lambda ของคุณด้วยโค้ดใหม่ .

หลังจากที่คุณได้เขียนโซลูชันและปรับใช้แล้ว ให้กลับไปที่คอนโซลการทดสอบ เปลี่ยนกิจกรรมทดสอบของคุณให้ผ่านใน max_val คู่คีย์/ค่า ควรมีลักษณะดังนี้:

การเขียนฟังก์ชัน AWS Lambda ใน Ruby

JSON นั้นเรียบง่าย

{
  "max_val": 70
}

สุดท้าย กด "เรียก" เพื่อเรียกใช้การทดสอบของคุณ! คุณสามารถขยายผลลัพธ์เพื่อแสดงว่าฟังก์ชันอ่านอินพุตและส่งคืนผลลัพธ์ของปัญหา FizzBuzz

การพัฒนาที่ง่ายขึ้น

แม้ว่าการทำงานในเว็บคอนโซลจะสะดวกสำหรับจุดประสงค์ในการเรียนรู้ แต่การถูกจำกัดให้อยู่แค่ในเว็บคอนโซลนั้นถือเป็นฝันร้าย วิธีหนึ่งที่ได้รับความนิยมมากที่สุดในการพัฒนาด้วย AWS Lambda คือการใช้ CLI ซึ่งย่อมาจาก Command Line Interface

เมื่อคุณสร้างการอนุญาตที่ถูกต้องผ่านบทบาท IAM แล้ว ให้ติดตั้ง CLI บนเครื่องของคุณและกำหนดค่าด้วยข้อมูลประจำตัวของคุณ จากนั้น คุณสามารถใช้ Lambda CLI เพื่อทดสอบฟังก์ชันของคุณในขณะที่คุณพัฒนาในเครื่อง (ใน IDE ที่คุณเลือก) และปรับใช้การเปลี่ยนแปลงของคุณผ่านบรรทัดคำสั่ง

วิธีการพัฒนาที่เป็นที่นิยมอีกวิธีหนึ่งคือการใช้เฟรมเวิร์ก เช่น Serverless Serverless จัดการกับการกำหนดค่าที่ยุ่งยากส่วนใหญ่ที่ AWS ประสบปัญหา รวมถึงการตั้งค่า API Gateway หากคุณต้องการใช้สำหรับฟังก์ชันของคุณ Serverless ยังปรับปรุงการบันทึก ทำให้การจัดการ Ruby Gem ง่ายขึ้น และอนุญาตให้กำหนดค่า CI/CD เพื่อให้คุณปรับใช้จากที่เก็บของคุณโดยอัตโนมัติตามไปป์ไลน์

โดยไม่ใช้ Serverless หรือเฟรมเวิร์กที่คล้ายคลึงกัน รวมถึง Ruby Gems ต้องกระโดดข้ามห่วง คุณจะต้องขยายฟังก์ชันของคุณให้เกี่ยวข้องกับโฟลเดอร์ แล้วสร้าง .bundle/config ในไดเร็กทอรีรูทของคุณที่มีโค้ดเริ่มต้นต่อไปนี้เพื่อบอกให้ผู้บันเดิลทราบว่าจะวางอัญมณีที่คุณติดตั้งไว้ที่ไหน:

---
BUNDLE_PATH: "vendor/bundle"

จากนั้น คุณสามารถใช้ CLI เพื่อ bundle add อัญมณีที่คุณต้องการและ require โดยตรงในรหัสของคุณ

ข้อจำกัดของ AWS Lambda

ขอแสดงความยินดี คุณเพิ่งเขียนฟังก์ชัน AWS Lambda แรกใน Ruby! ก่อนหน้านี้ ทางออกเดียวที่เป็นไปได้ในการเรียกใช้ API ด้วย Ruby คือการสร้างแอป Rails ทั้งหมด ตอนนี้คุณสามารถสร้างปลายทางได้ทีละรายการ โดยข้ามขอบเขตทั้งหมดที่มาพร้อมกับแอปพลิเคชันเต็มรูปแบบ Lambda เรียกเก็บเงินสำหรับการใช้งานเป็นไมโครวินาที ดังนั้นจึงมีราคาถูกอย่างน่าทึ่งสำหรับการแก้ปัญหาอย่างรวดเร็ว นอกจากนี้ การใช้ประโยชน์จากข้อเสนอระบบคลาวด์นี้ช่วยให้เราดำเนินการได้ในราคาประหยัดแต่ยังคงขยายขนาดได้อย่างรวดเร็วอย่างเหลือเชื่อ AWS เป็นเหตุผลที่ Netflix ทำงานในช่วงเวลาเร่งด่วนโดยไม่ต้องจ่ายแบนด์วิดท์เซิร์ฟเวอร์ความจุสูงสุดคงที่

แม้จะคว้าชัยชนะมาทั้งหมด แต่ AWS Lambda ไม่ใช่โซลูชันที่จับต้องได้ มันจะไม่ทำงานเป็น API ด้วยตัวมันเองและถูกจำกัดในความสามารถของรัฐ ฟังก์ชันแลมบ์ดาใช้เวลาไม่เกิน 15 นาทีในการทำงาน และหน่วยความจำถูกจำกัดที่ 6GB การทดสอบฟังก์ชันของแลมบ์ดายังค่อนข้างท้าทาย เนื่องจากคุณมักจะต้องทำซ้ำโครงสร้างพื้นฐานทั้งหมดในสภาพแวดล้อมที่แยกจากกัน

หากคุณมีแอปหรือคุณลักษณะที่ไม่จำเป็นต้องทำงานตลอด 24 ชั่วโมงทุกวัน Lambda อาจ เป็นแบบที่ดี หากฟังก์ชันของคุณต้องรักษาสถานะบางอย่างหรือแม้กระทั่งอัปเดตข้อมูลนอกระบบนิเวศของ AWS แล้ว Lambda ก็ไม่เหมาะ แลมบ์ดายังตั้งค่าเริ่มต้นเป็น 1,000 การเชื่อมต่อพร้อมกัน ดังนั้นแอปพลิเคชันที่เห็นการใช้งานอย่างต่อเนื่องมากกว่านั้นจะไม่น่าเชื่อถืออย่างมากในแลมบ์ดา โดยพื้นฐานแล้ว Lambda เหมาะที่สุดสำหรับงานอัตโนมัติที่ขับเคลื่อนด้วยเหตุการณ์ในช่วงเวลาสั้น ๆ ซึ่งไม่ต้องการสถานะคงอยู่

ฟังก์ชัน Lambda สามารถเป็นเครื่องมือที่ทรงพลัง โดยเฉพาะอย่างยิ่งในมือของนักพัฒนา Ruby เช่นคุณ