Computer >> Máy Tính >  >> Lập trình >> Ruby

Viết các hàm AWS Lambda trong Ruby

AWS Lambda cho phép chúng tôi thiết lập các chức năng có thể mở rộng trong khi giảm thiểu chi phí. Thay vì viết, lưu trữ và duy trì toàn bộ ứng dụng Ruby on Rails, chúng ta có thể sử dụng các hàm Lambda để phản hồi các sự kiện riêng lẻ một cách độc lập. Bài viết này sẽ đưa bạn từ một người mới sử dụng AWS sang cách viết Ruby trong các hàm Lambda của riêng bạn.

Lambda cho phép bạn chạy mã để đáp ứng các sự kiện mà không cần quản lý máy chủ. Kiến trúc hướng sự kiện này đảm bảo rằng bạn chỉ trả tiền cho mã của mình trong khi mã đang hoạt động cho bạn, không phải khi nó chạy không tải. Mặc dù Lambda được sử dụng phổ biến nhất để phản hồi các sự kiện trong hệ sinh thái AWS, chẳng hạn như xóa tệp trong Nhóm S3, nó cũng có thể được định cấu hình để hoạt động như một API kết hợp với Cổng API AWS.

Người ta có thể sử dụng Lambda để tự động hóa các nhiệm vụ dựa trên thời gian, chẳng hạn như Cron Jobs, hoặc để đáp ứng các sự kiện. Điều này có thể mở rộng sang xử lý dữ liệu, thường là với các dịch vụ AWS khác, chẳng hạn như DynamoDB hoặc thậm chí thành một API có thể mở rộng. Ví dụ:sơ đồ sau đây từ tài liệu của Amazon cho thấy một kiến ​​trúc đơn giản trong đó ứng dụng khách di động thực hiện một yêu cầu HTTP, có lẽ để thực hiện một số hành động CRUD trên cơ sở dữ liệu. API Gateway định tuyến yêu cầu đến hàm Lambda tương ứng (giống như Rails định tuyến các yêu cầu HTTP đến bộ điều khiển) và nó thực hiện logic nghiệp vụ và giao tiếp với AWS DynamoDB để thực hiện yêu cầu.

Viết các hàm AWS Lambda trong Ruby

Bởi vì mã của chúng tôi được chạy trong một vùng chứa, cơ sở hạ tầng của Amazon tự động đặt chức năng ở chế độ ngủ khi nó không được sử dụng. Khi có yêu cầu mới, vùng chứa phải bắt đầu từ trạng thái nguội, điều này có thể tăng thời gian thực hiện lên đến 2000ms. Điều này không chỉ có thể làm giảm chất lượng dịch vụ của bạn về thời gian đáp ứng mà còn khiến bạn tốn kém tiền bạc. Vì lý do này, việc sử dụng Lambda cho một nhiệm vụ nhạy cảm về thời gian, chẳng hạn như gửi email người dùng hoặc phản hồi các sự kiện giao diện người dùng, có thể tạo ra một nút thắt cổ chai. Bạn có thể giảm thiểu vấn đề này bằng cách lên lịch cho AWS CloudWatch thực hiện các yêu cầu định kỳ để giữ cho chức năng 'ấm', nhưng điều này sẽ làm tăng chi phí lưu trữ.

Tại sao sử dụng AWS Lambda

Amazon Web Services (AWS) là dịch vụ điện toán đám mây phổ biến nhất trên thế giới. Nó đủ đơn giản để các nhà phát triển độc lập sử dụng nó nhưng đủ mạnh và đủ khả năng mở rộng để làm cơ sở hạ tầng cho một số công ty lớn nhất thế giới.

AWS Lambda là một trong những dịch vụ như vậy từ Amazon, phục vụ như một 'dịch vụ máy tính không máy chủ', cho phép chúng tôi chỉ chạy mã khi phản hồi các sự kiện. Điều này làm giảm chi phí và cho phép chúng tôi phản ứng theo chương trình với một thứ gì đó, chẳng hạn như lệnh gọi API, mà không cần lưu trữ toàn bộ máy chủ hoặc xây dựng toàn bộ ứng dụng.

Đối với trường hợp sử dụng phù hợp, kiến ​​trúc không máy chủ này có thể tiết kiệm rất nhiều chi phí. Định giá được tính với chi phí cho mỗi yêu cầu và chi phí cho mỗi khoảng thời gian tính toán. Sau một triệu yêu cầu đầu tiên trong một tháng nhất định, giá là 0,20 đô la cho một triệu yêu cầu cộng thêm 0,0000166667 đô la cho mỗi GB-giây thời gian tính toán mà hàm sử dụng. Như bạn có thể tưởng tượng, việc định giá dựa trên tỷ lệ này làm cho việc chạy một dịch vụ nhỏ trên Lambda trở nên rẻ đáng kể trong khi vẫn duy trì tùy chọn mở rộng quy mô vô hạn với cùng một tỷ lệ.

Các nhà phát triển Ruby có thể hưởng lợi từ dịch vụ đám mây này bằng cách sử dụng nó như một cách không trạng thái để phản ứng với các lệnh gọi API hoặc thậm chí các sự kiện AWS khác.

Thiết lập Tài khoản AWS Dùng thử

AWS cung cấp một cấp miễn phí khá hào phóng bao gồm một triệu yêu cầu miễn phí và thời gian tính toán lên đến 3,2 triệu giây mỗi tháng với AWS Lambda! Nếu bạn đã có tài khoản, bạn có thể bỏ qua bước này, nhưng việc thiết lập một tài khoản rất đơn giản.

Hãy đăng ký tại đây và điền thông tin của bạn để bắt đầu! Viết các hàm AWS Lambda trong Ruby

Bạn sẽ được nhắc điền thêm thông tin, bao gồm loại tài khoản và thông tin liên hệ, đồng thời bạn sẽ cần nhập thông tin thẻ tín dụng / thẻ ghi nợ để chi trả cho bất kỳ việc sử dụng nào bên ngoài cấp miễn phí. Cách sử dụng Lambda đơn giản của chúng tôi được bao gồm trong cấp miễn phí, nhưng nếu bạn lo lắng về mức trung bình ngẫu nhiên, bạn có thể thiết lập ngân sách để kiểm soát việc sử dụng của mình và ngăn việc thanh toán không mong muốn.

Tạo một hàm Lambda với Ruby

Sau khi bạn đã đăng ký, hãy di chuột qua sản phẩm , sau đó tính toán và chọn Lambda .

Viết các hàm AWS Lambda trong Ruby

Khi bạn đang ở trong Lambda Console (bạn có thể phải nhấn 'bắt đầu'), bạn sẽ thấy danh sách các chức năng trống với nút màu cam cho "Tạo chức năng". Như bạn có thể đoán, chúng tôi sẽ nhấn nút "Tạo chức năng" màu cam.

Viết các hàm AWS Lambda trong Ruby

Sau đó, chúng tôi sẽ chọn "Tác giả từ Scratch", vì chưa có hàm mẫu nào cho Ruby và làm việc từ đầu là cách tốt nhất để học.

Bạn nên đặt tên cho chức năng của mình một cách thích hợp và chọn phiên bản Ruby mà bạn muốn làm việc. Tôi đã gọi là FizzBuzz của mình, sau sự cố lập trình nổi tiếng.

Bạn có thể phải nhấp đúp vào lambda_function.rb tệp trong ngăn điều hướng để làm cho mã nguồn xuất hiện.

Hàm được viết trước và có tiêu đề là lambda_handler . Như hiện tại, khi nó được gọi, hàm sẽ trả về 200 phản hồi với dòng chữ "Hello From Lambda!", Như bạn có thể thấy bên dưới. Viết các hàm AWS Lambda trong Ruby

Sử dụng Trình kích hoạt Kiểm tra cho Hàm Lambda

Như đã thảo luận trong phần giới thiệu, các hàm Lambda có thể được kích hoạt theo nhiều cách khác nhau. Một trong những cách phổ biến nhất là thông qua lệnh gọi API. Tuy nhiên, điều này yêu cầu thiết lập AWS API Gateway, điều này nằm ngoài phạm vi của bài viết này. API Gateway hoạt động tuyệt vời với Lambda để tạo ra các API với rất ít cấu hình và khả năng mở rộng vô hạn.

May mắn thay cho chúng tôi, không quá khó để mô phỏng một lệnh gọi API thông qua bảng điều khiển chức năng và một sự kiện thử nghiệm đã được xếp hàng cho chúng tôi .

Bên dưới phần tổng quan về chức năng là một thanh công cụ hiện đã chọn "Mã". Như được hiển thị trong ảnh chụp màn hình cuối cùng, ngay bên cạnh "Mã" là một tab có tiêu đề " Kiểm tra ". Hãy tiếp tục và chọn" Kiểm tra ", và bạn sẽ thấy Bảng điều khiển kiểm tra xuất hiện ở vị trí của nguồn mã.

Viết các hàm AWS Lambda trong Ruby

Sự kiện kiểm tra được định cấu hình trước là một đối tượng JSON được gửi đến hàm Lambda dưới dạng sự kiện event đối tượng mà hàm nhận làm tham số. Nếu bạn đang gọi một điểm cuối thông qua API Gateway, đây sẽ là phần thân của yêu cầu.

Vì hàm Lambda trình giữ chỗ không đọc sự kiện, nên việc chúng tôi gửi dưới dạng phần thân là gì không quan trọng lắm. Do đó, chúng tôi có thể tiếp tục như đã viết bằng cách nhấn vào " Gọi " màu cam nút ".

Nếu bạn đã thiết lập chức năng đúng cách, bạn sẽ thấy hộp màu xanh lục có tiêu đề "Thực hiện thành công", bạn có thể mở rộng hộp này để xem phản hồi JSON từ chức năng của mình.

Viết FizzBuzz

Bây giờ chúng tôi đã xác nhận rằng hàm Lambda của chúng tôi đang hoạt động chính xác, chúng tôi có thể tùy chỉnh nó bằng mã Ruby tùy chỉnh của riêng chúng tôi. Trong ví dụ này, chúng tôi sẽ có hàm Lambda của chúng tôi phản hồi vấn đề FizzBuzz nổi tiếng. FizzBuzz là một cuộc phỏng vấn yêu thích và lời nhắc diễn ra như thế này

Viết chương trình in các số từ 1 đến 50, nhưng đối với bội số của ba, hãy in “Fizz” thay vì số sau đó, và đối với bội số của năm, hãy in “Buzz”. Các số là bội số của cả ba và năm là “FizzBuzz”.

Thay thế mã trong hàm Lambda của bạn bằng giải pháp FizzBuzz của tôi -

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

Đây là một chút xoay quanh FizzBuzz thông thường. Thay vì chỉ lặp đến 50, chúng tôi lặp qua số được gửi cùng với sự kiện. Đối tượng sự kiện được chuyển vào giống như một từ điển, vì vậy hãy yêu cầu event[max_val] trả về giá trị tại max_val Chìa khóa. Cuối cùng, thay vì in ra giải pháp FizzBuzz, chúng tôi chỉ thêm nó vào một Chuỗi mà chúng tôi trả về dưới dạng một đối tượng JSON.

Tiếp theo, hãy đảm bảo rằng bạn nhấn vào nút "Triển khai" màu cam để cập nhật chức năng Lambda của bạn với mã mới .

Sau khi bạn đã viết giải pháp và triển khai nó, hãy quay trở lại Bảng điều khiển thử nghiệm. Thay đổi sự kiện thử nghiệm của bạn để chỉ vượt qua một max_val cặp khóa / giá trị. Nó sẽ trông như thế này:

Viết các hàm AWS Lambda trong Ruby

JSON chỉ đơn giản là

{
  "max_val": 70
}

Cuối cùng, nhấn "Gọi" để chạy thử nghiệm của bạn! Bạn có thể mở rộng kết quả để cho thấy rằng hàm đọc đầu vào và trả về kết quả của sự cố FizzBuzz.

Phát triển dễ dàng hơn

Mặc dù làm việc trong bảng điều khiển web thuận tiện cho mục đích học tập, nhưng bị hạn chế trong nó sẽ là một cơn ác mộng. Một trong những cách phổ biến nhất để phát triển với AWS Lambda là sử dụng CLI, viết tắt của Command Line Interface.

Sau khi bạn tạo quyền phù hợp thông qua các vai trò IAM, hãy cài đặt CLI trên máy của bạn và định cấu hình nó bằng thông tin đăng nhập của bạn. Sau đó, bạn có thể sử dụng Lambda CLI để kiểm tra chức năng của mình khi bạn phát triển cục bộ (trong IDE bạn chọn) và triển khai các thay đổi của bạn thông qua dòng lệnh.

Một phương pháp phát triển phổ biến khác là thông qua các khuôn khổ, chẳng hạn như Serverless. Serverless xử lý nhiều cấu hình cồng kềnh mà AWS gặp phải, bao gồm cả việc thiết lập API Gateway nếu bạn cần nó cho chức năng của mình. Serverless cũng tăng cường ghi nhật ký, giúp quản lý Ruby Gem dễ dàng hơn và cho phép cấu hình CI / CD, vì vậy bạn có thể tự động triển khai từ kho lưu trữ của mình dựa trên đường ống.

Nếu không sử dụng Serverless hoặc một khung công tác tương tự, bao gồm cả Ruby Gems yêu cầu phải nhảy qua một số vòng. Bạn sẽ phải mở rộng chức năng của mình để liên quan đến một thư mục, sau đó tạo một .bundle/config tệp trong thư mục gốc của bạn có chứa mã khởi tạo sau để cho người quản lý gói biết vị trí đặt các viên ngọc bạn cài đặt:

---
BUNDLE_PATH: "vendor/bundle"

Sau đó, bạn có thể sử dụng CLI để bundle add đá quý bạn cần và require chúng trực tiếp trong mã của bạn.

Hạn chế của AWS Lambda

Xin chúc mừng, bạn vừa viết hàm AWS Lambda đầu tiên của mình trong Ruby! Trước đây, giải pháp khả thi duy nhất để chạy một API với Ruby thường là tạo toàn bộ ứng dụng Rails. Giờ đây, bạn có thể tạo các điểm cuối cùng một lúc, bỏ qua tất cả các lỗi đi kèm với một ứng dụng đầy đủ. Lambda tính tiền cho việc sử dụng tính bằng micro giây, vì vậy nó có thể rất rẻ cho các giải pháp nhanh chóng. Hơn nữa, việc tận dụng dịch vụ đám mây này cho phép chúng tôi hoạt động với chi phí thấp nhưng vẫn mở rộng quy mô cực kỳ nhanh chóng. AWS là lý do Netflix hoạt động trong giờ cao điểm mà không phải trả tiền cho băng thông máy chủ có dung lượng tối đa không đổi.

Bất chấp tất cả các chiến thắng, AWS Lambda không phải là một giải pháp toàn diện. Nó sẽ không tự hoạt động như một API và bị hạn chế về khả năng trạng thái của nó. Các chức năng của Lambda không thể mất hơn 15 phút để chạy và bộ nhớ bị giới hạn ở 6GB. Việc kiểm tra các chức năng Lambda cũng hơi khó khăn vì bạn thường phải sao chép toàn bộ cơ sở hạ tầng của mình trong một môi trường riêng biệt.

Nếu bạn có một ứng dụng hoặc tính năng không cần chạy 24/7, thì Lambda có thể là một sự phù hợp tốt. Nếu chức năng của bạn cần duy trì một số loại trạng thái hoặc thậm chí cập nhật dữ liệu bên ngoài hệ sinh thái AWS, thì Lambda không phù hợp. Lambda cũng mặc định có 1.000 kết nối đồng thời, do đó, một ứng dụng luôn được sử dụng nhiều hơn mức đó sẽ rất không đáng tin cậy trên Lambda. Về cơ bản, Lambda được sử dụng tốt nhất trong các tác vụ tự động hóa theo hướng sự kiện trong thời gian ngắn không yêu cầu trạng thái liên tục.

Các hàm Lambda có thể là một công cụ mạnh mẽ, đặc biệt là đối với một nhà phát triển Ruby như bạn.