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

การใช้ Ruby บน AWS Lamba

เมื่อมีการประกาศการสนับสนุน Ruby บน AWS Lambda เมื่อวานนี้ ฉันตื่นเต้นมากจนต้องลองใช้งานทันที เราใช้แลมบ์ดามาระยะหนึ่งแล้วที่ฮันนี่แบดเจอร์ และฉันปรารถนาที่จะสามารถเขียนฟังก์ชันของเราใน Ruby ได้ หลังจากเล่นกับการสนับสนุน Ruby ใหม่มาสองสามชั่วโมงแล้ว ฉันรู้สึกมั่นใจว่าเราจะใช้เวลากับ Node, Go และ Python น้อยลง :)

ตัวอย่างด่วน

แม้ว่าบล็อกโพสต์ประกาศจาก AWS จะช่วยให้คุณพร้อมและทำงานได้อย่างรวดเร็วด้วย Ruby บน Lambda ฉันต้องการแชร์ตัวอย่างการใช้เฟรมเวิร์กแบบไร้เซิร์ฟเวอร์เพื่อปรับใช้ฟังก์ชัน Ruby Lambda ของคุณ ฉันพบว่าเฟรมเวิร์กนี้ทำงานได้อย่างยอดเยี่ยมในการขจัดความรำคาญในการทำงานกับฟังก์ชันของแลมบ์ดา ในขณะที่เวอร์ชันปัจจุบัน (1.34) ของเฟรมเวิร์กยังไม่มีการสร้างเทมเพลตสำหรับโปรเจ็กต์ Ruby (การประชาสัมพันธ์ถูกรวมเข้าด้วยกันสองสามชั่วโมงก่อนที่ฉันจะเริ่มเขียนโพสต์นี้) มันง่ายพอที่จะเริ่มต้นโดยไม่มีตัวสร้าง นี่คือไฟล์กำหนดค่าตัวอย่างที่ฉันจะใช้สำหรับการฝึกปฏิบัตินี้ ซึ่งเป็นฟังก์ชันง่าย ๆ ที่จะเติมตาราง DynamoDB ด้วยข้อมูลเมตาที่เชื่อมโยงกับวัตถุ S3 เมื่อสร้างขึ้น:

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

นี่คือรหัส Ruby:

โค้ดไม่ได้ทำอะไรมากมาย - รับเหตุการณ์ SNS วนซ้ำระเบียนในข้อความ SNS เพื่อรับข้อมูลเกี่ยวกับแต่ละ S3object ที่สร้างขึ้น ดำเนินการตามคำขอ HEAD บนวัตถุ S3 เพื่อรับข้อมูลเมตา จากนั้นจึงวาง (สร้าง หรืออัปเดต) รายการในตาราง DynamoDB การพึ่งพาฟังก์ชันนี้เพียงอย่างเดียวคือ AWS SDK ซึ่งรวมอยู่ในสภาพแวดล้อมรันไทม์ คุณจึงไม่ต้องกังวลเกี่ยวกับ Gemfile ด้วยซ้ำ อย่างไรก็ตาม หากคุณมีอัญมณีเพิ่มเติมที่คุณต้องการนำไปที่งานปาร์ตี้ ก็สามารถทำได้ง่าย มาดูวิธีการรวม gem เพิ่มเติมเมื่อเราพูดถึงการปรับใช้

การปรับใช้

การรับโค้ดนี้ในสถานะปัจจุบันไปยัง Lambda นั้นง่ายมาก ต้องขอบคุณเฟรมเวิร์กแบบไร้เซิร์ฟเวอร์:

sls deploy

คำสั่งเดียวจะทำสิ่งนี้ให้คุณ:

  • รหัสไปรษณีย์ของคุณ
  • ใส่ไฟล์ zip ลงใน S3
  • ปรับใช้ฟังก์ชันใน Lambda (พร้อมด้วยตัวแปรสภาพแวดล้อมและทริกเกอร์ SNS)
  • สร้างนโยบาย IAM
  • สร้างตาราง DynamoDB

เมื่อการปรับใช้เสร็จสิ้น การสร้างออบเจ็กต์ในบัคเก็ตจะส่งผลให้มีการเพิ่มรายการใหม่ในตาราง DynamoDB

การพึ่งพา

การรับการขึ้นต่อกันของ gem เพิ่มเติมที่รวมอยู่ในฟังก์ชันที่ปรับใช้ของคุณนั้นง่ายมาก สิ่งที่คุณต้องทำคือสร้าง Gemfile เพิ่มอัญมณีที่คุณต้องการรวมกลุ่ม และเรียกใช้ bundle install --path vendor/bundle . สิ่งนี้จะรวมอัญมณีไว้ในไดเร็กทอรีในเครื่อง และพวกเขาจะถูกบีบอัดและเพิ่มไปยังฟังก์ชันพร้อมกับโค้ดที่เหลือของคุณ

ข้อแม้ประการหนึ่งสำหรับการพึ่งพาคืออัญมณีที่ต้องมีการรวบรวมส่วนขยาย C บางประเภท เนื่องจากสภาพแวดล้อมการพัฒนาของคุณน่าจะแตกต่างจากสภาพแวดล้อมรันไทม์ของ Lambda มากที่สุด คุณจึงต้องทำงานเพิ่มขึ้นอีกเล็กน้อยเพื่อรวบรวมส่วนขยายเหล่านั้นเพื่อทำงานใน AWS อย่างไรก็ตาม ต้องขอบคุณอิมเมจ lambci Docker และอิมเมจ Docker ที่ฉันสร้างไว้บนอิมเมจ Ruby , ทำได้ไม่ยาก หากต้องการรวมข้อมูลอ้างอิงของคุณและคอมไพล์อย่างถูกต้อง เพียงเรียกใช้อิมเมจนักเทียบท่าของฉัน ดังนี้:

docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5

ทั้งหมดที่ทำคือเรียกใช้บรรทัดคำสั่งของบันเดิลที่กล่าวถึงข้างต้น ดังนั้นอัญมณีจะถูกวางไว้ใน vendor/bundle พร้อมที่จะรวมอยู่ในไฟล์ ZIP ที่สร้างโดย deploy คำสั่ง

ด้วยวิธีนี้คุณจะออกไปแข่ง ฉันหวังว่าคุณจะสนุกกับการวิ่ง Ruby inLambda เท่าที่ฉันมี :)