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

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

Serverless computing ช่วยลดภาระการจัดการและ provision servers ให้ cloud provider และกำลังกลายเป็นมาตรฐานสำหรับทีมเทคโนโลยีส่วนใหญ่ AWS Lambda เป็น serverless technology ชนิดหนึ่งที่ทีมเทคโนโลยีหลายทีมใช้งาน AWS Lambda รองรับภาษาโปรแกรมมิ่งหลักส่วนใหญ่ รวมถึง NodeJS, Java, Python และ Ruby แม้ภาษาหลักจะรองรับแล้ว แตอาจมีเวลาที่คุณอยากรัน serverless functions ที่พึ่งพา features ที่เป็นส่วนหนึ่งของ frameworks ที่สร้างด้วยภาษาเหล่านี้ ในบทความนี้ เราจะสำรวจวิธีการรันแอพ Rails บน AWS Lambda บทความนี้สมมติว่าคุณคุ้นเคยกับ serverless computing และ AWS Lambda และอยากรู้วิธีรัน Rails บน Lambda เครื่องมือชื่อ Lamby ทำให้การรัน Rails บน AWS Lambda เกือบจะไร้ความยุ่งยาก เราจะครอบคลุมวิธีใช้ Lamby สร้างและ deploy Rails ไป Lambda จะเรียกว่า "Rails on Lambda"

Lamby คืออะไร?

Lambda ให้คุณ deploy โค้ดและรันในทุก scale โดยไม่ต้องดูแล servers เอง คุณเพียงอัปโหลดโค้ดไป AWS มันจะรันทุกครั้งที่ถูก trigger โดย event เช่น user request หน้าเว็บ หรือ job ถูก queued

Lambda คาดหวังให้โค้ดของคุณมีโครงสร้างแบบเฉพาะ ดังนั้นหากคุณอยากใช้มัน host ตัวอย่างเช่น Rails app คุณจะต้องใช้ adapter เช่น Lamby

Lamby เป็น Rack adapter เรียบง่าย มันอยู่ระหว่าง Rails app ของคุณและ AWS Lambda และแปลง Lambda invocation events จากแหล่ง AWS ต่างๆ เช่น API Gateway หรือ Application Load Balancers ให้เป็น Rack events ที่ Rails app ของคุณสามารถรับได้

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน Rails Lambda architecture แหล่งที่มา: Lamby Docs

Lamby ใช้ Docker & AWS SAM ในการ build, package และ deploy Rails app ไป Lambda

AWS Serverless Application Model (AWS SAM) เป็น open-source framework ที่คุณสามารถใช้สร้าง serverless applications บน AWS Serverless application คือการรวมของ Lambda functions, event sources และ resources อื่นๆ ที่ทำงานร่วมกันเพื่อทำหน้าที่ โปรดทราบว่า serverless application มากกว่าแค่ Lambda function—อาจรวม resources เพิ่มเติม เช่น APIs, databases และ event source mappings -- AWS SAM documentation

เพื่อเริ่มต้นกับ Lamby เราต้องติดตั้ง Docker สร้าง AWS account และตั้งค่า programmatic access ไปยัง AWS account ของคุณ

การติดตั้ง Docker

AWS SAM ใช้ Docker เพื่อ simulate Lambda Runtime environment Docker ยังลดความซับซ้อนของการติดตั้ง AWS CLI และ SAM CLI ซึ่งทั้งคู่พึ่งพา Python หากคุณยังไม่มี Docker ติดตั้ง การติดตั้ง Docker ง่ายมาก ดาวน์โหลดและติดตั้งจาก official website ได้เลย ตรวจสอบว่าติดตั้ง Docker แล้วโดยรันคำสั่งด้านล่างใน terminal หากติดตั้งแล้ว จะเห็น version number และ build เหมือนด้านล่าง:

$ docker --version 

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน ยืนยันการติดตั้ง Docker

การตั้งค่า AWS Account

หากคุณยังไม่มี AWS account จะต้องสร้าง Amazon มี free-tier plan ซึ่งจะครอบคลุมการสร้างและทดสอบ Rails app ใน Lambda รวมถึง guide ว่าจะสร้างและ activate AWS account อย่างไร ตาม guide เพื่อตั้งค่า account

การตั้งค่า AWS Programmatic Access

ตอนนี้คุณมี AWS account แล้ว คุณต้องตั้งค่า programmatic access โดยใช้ AWS Access Key ID และ AWS Secret Access Key ของ account หากยังไม่มี สร้างได้โดยทำดังนี้

  • Login เข้า AWS account
  • ใน AWS Management Console คลิก "Services" ใน toolbar
  • ค้นหาและเลือก "IAM"
  • คลิก "Users" จาก navigation ด้านซ้าย
  • หาก "IAM" user มีอยู่แล้ว ให้เลือก username ของคุณ
    • คลิกแท็บ "Security credentials"
    • คลิกปุ่ม "Create access key"
    • Copy key id และ secret ไปเก็บที่ปลอดภัย
  • หากยังไม่มี "IAM" user
    • คลิก "Add user"
    • เพิ่ม username และเลือกตัวเลือก "Programmatic access"
    • ทำตาม prompts เพื่อเสร็จสิ้น

มาใช้ Docker ตั้งค่า CLI programmatic access Copy โค้ดด้านล่างไปที่ terminal คุณจะถูก prompt ให้ AWS Access Key ID และ AWS Secret Access Key ใส่ keys จากขั้นตอนก่อนหน้า

$ docker run \ --interactive \ --tty \ --rm \ --volume "${HOME}/.aws:/root/.aws" \ "amazon/aws-cli" \ configure 

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

การสร้าง Rails Application ใหม่

เราจะใช้ SAM CLI เพื่อ bootstrap Rails project ของเรา AWS SAM CLI อนุญาตให้ initialize โปรเจกต์ใหม่จาก GitHub repository template ซึ่งเรียกกันว่า cookiecutter เพื่อเริ่ม SAM project ใหม่ เราจะใช้ Docker container รัน sam init ซึ่งใช้ Lamby Cookiecutter project template เพื่อเริ่มโฟลเดอร์โปรเจกต์ใหม่ให้คุณ คุณจะถูก prompt ให้ project name แต่ผมใช้ "rails_on_lambda"

$ docker run \ --rm \ --interactive \ --volume "${PWD}:/var/task:delegated" \ lambci/lambda:build-ruby2.7 \ sam init --location "gh:customink/lamby-cookiecutter" 

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

โฟลเดอร์ SAM project ใหม่ของคุณมีทุกอย่างที่ต้องการสำหรับ Rails on Lambda project ใหม่ จากมุมมองระดับสูง นี่คือสิ่งที่ถูกสร้างในโปรเจกต์ใหม่ของคุณ

  • Docker setup ด้วย Dockerfile และ docker-compose ทั้งคู่
  • Ruby project ที่ทำงานพร้อม lib directory, bundler และ tests
  • SAM template.yaml file

การตั้งค่าและ Deploy

ตอนนี้เราสร้าง Rails app ใหม่แล้ว ต้องตั้งค่าให้พร้อมสำหรับ Lambda deployment สองคำสั่งด้านล่างรัน scripts ที่ build Docker development image และ bundle gems คำสั่ง bootstrap เป็นกระบวนการครั้งเดียว ในขณะที่ setup จะรันทุกครั้งที่คุณเพิ่ม project dependency ใหม่

$ ./bin/bootstrap $ ./bin/setup 

เมื่อคำสั่งก่อนหน้ารันสำเร็จ โปรเจกต์ของคุณพร้อมสำหรับ deploy ผ่าน SAM Deployment ทำได้โดยใช้ Lamby script ที่ build, package และ deploy Rails application ของคุณ

./bin/deploy 

คำสั่ง deploy รัน Lamby build script ที่ duplicate โฟลเดอร์โปรเจกต์ปัจจุบันไปยัง local .lamby directory และรันสามคำสั่ง SAM ที่จำเป็นสำหรับ deploy application

  • sam build
  • sam package
  • sam deploy

หาก scripts รันตามคาด คุณควรเห็น output สำหรับ CloudFormation deployment tasks ของ SAM จบด้วยอย่างนี้:

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

คุณควรเห็น URL เป็นส่วนหนึ่งของ terminal output URL นี้คือ API Gateway HTTP API endpoint ที่ invoke Rails application ของคุณโดยใช้ Rack เปิดใน browser และคุณควรเห็นหน้าจอ "welcome to Rails" ที่คุ้นเคย:

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

การ Invoke Rails App จาก AWS Console

เราสามารถทดสอบแอพจาก Lambda dashboard ได้ เข้าสู่ AWS Management Console:

  • คลิก "Services" ใน toolbar
  • พิมพ์ "Lambda" ใน find services field, เลือก

จากหน้านี้ คุณจะเห็น "RailsOnLambda" project ที่เพิ่ง deploy

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

  • เปิด function "RailsOnLambda"
  • คลิกปุ่ม "Test" มุมขวาบน
  • ใช้ event template "Amazon API Gateway Proxy" (ใช้ JSON template ด้านล่างเพื่ออัปเดต fields ที่ตรงกัน)
  • ตั้งชื่อ "RailsOnLambdaTest"
  • คลิกปุ่ม "Create"
  • คลิกปุ่ม "Test" เพื่อ invoke Lambda
{ "body": "", "path": "/", "httpMethod": "GET", "queryStringParameters": {}, "multiValueQueryStringParameters": {}, "pathParameters": { "proxy": "/" }, "stageVariables": {}, "requestContext": { "path": "/", "httpMethod": "GET" } } 

สมมติว่าทุกอย่างราบรื่น คุณควรเห็น output เหมือนด้านล่าง

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

ยินดีด้วย! ตอนนี้คุณมี Rails on Lambda แม้ Rails application บน Lambda จะยังเป็นแค่ normal Rails application ความต่างคือ Lamby gem แปลง API Gateway HTTP API, API Gateway REST API และ application load balancer target events ให้เป็น Rack-compatible env objects และส่งให้ Rails Rails ส่งผลลัพธ์ของ event กลับไปที่ Lambda handler ที่กำหนดในโปรเจกต์ของคุณ

def handler(event:, context:) Lamby.handler $app, event, context end 

Rails on Lambda Perform ได้ดีแค่ไหน?

Rails on Lambda จะมี slow response time สำหรับ request แรกหลัง deploy ปรากฏการนี้เรียกว่า "cold start" อย่างไรก็ตาม หลัง request แรก performance ดีเยี่ยมและสามารถ meet หรือ beat EC2 ได้ หากไม่มี subsequent requests หลัง request แรก server resources ที่ serve Rails app จะถูก dynamically assigned ให้ Lambda functions อื่นๆ หลังประมาณ 5-7 นาที นี่จะทำให้ cold start สำหรับ requests ใหม่ มีหลายวิธีหลีกเลี่ยง cold start และเก็บ Rails app ให้ warm

CloudWatch Timer

คุณสามารถตั้ง timer ping Rails on Lambda function ทุกนาทีเพื่อให้มัน warm เปิด AWS console ค้นหา CloudWatch จากนั้นไปที่ Events และคลิก Create rule ตั้ง event type เป็น Schedule และเราจะรัน event นี้ทุก 1 นาที

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน

Provisioned Concurrency

Provisioned concurrency เป็นฟีเจอร์ของ AWS ที่ให้คุณ toggle และยอมจ่ายมากกว่าเพื่อให้ AWS เก็บ unused container ไว้รันตลอดเวลา เพื่อตั้งค่า provisioned concurrency สำหรับ Rails app เปิด AWS console และเปิด Lambda service page

  • เลือก function (rails-on-lambda)
  • เลือก Configuration แล้วเลือก Concurrency
  • Under Provisioned concurrency configurations คลิก Add configuration
  • เลือก alias หรือ version
  • ใส่จำนวน provisioned concurrency (เช่น 500) ที่จะ allocate
  • Save changes Provisioned concurrency สามารถตั้งค่าผ่าน AWS CLI ด้วยคำสั่ง:
aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100 

ค่าใช้จ่ายของ Lambda บน AWS คือเท่าไหร่?

กับ AWS Lambda คุณจ่ายแค่สิ่งที่ใช้ ค่าใช้จ่ายเป็นการรวมของจำนวน requests และระยะเวลาการ execute code ราคาระยะเวลาขึ้นกับหน่วยความจำที่ allocate ให้ function ขนาดหน่วยความจำตั้งแต่ 128 MB ถึง 10,240 MB คุณสามารถ allocate หน่วยความจำในปริมาณใดก็ได้ตามความต้องการ ด้านล่างคือ chart แสดงค่าใช้จ่ายในการรัน 100,000 invocations ของ Lambda function ตลอดเวลาต่างๆ

การ Deploy Ruby on Rails ไป AWS Lambda: คู่มือทีละขั้นตอน Lambda cost

เมื่อไหร่ที่คุณไม่ควร Run Rails on Lambda

เราเห็นว่าเราสามารถรัน Rails app บน AWS Lambda ได้ แตทุก Rails application ควร run on Lambda ไหม? Rails สมมติว่า application รันบน traditional server ไม่ใช่ serverless การดำเนินการบางอย่างที่ทำงานง่ายบน traditional Rails server app อาจไม่ทำงานบน serverless ตัวอย่าง การ upload ไฟล์หรือรูปภาพจะไม่ทำงานใน Rails on Lambda app เพราะ app ไม่มี access ไปยัง persistent filesystem นอกจากนี้ WebSocket communication จะไม่ทำงานบน Lambda เพราะ server ไม่อยู่เมื่อไม่มี requests

สรุป

เราเพิ่งแสดงวิธี deploy basic Rails application แตกระบวนการเดียวกันใช้ได้กับ large applications โปรดเพิ่ม controllers และ routes และทดสอบจาก console หรือผ่าน Postman และ HTTP clients อื่นๆ