Khi hỗ trợ Ruby trên AWS Lambda được công bố vào ngày hôm qua, tôi đã rất phấn khích về nó và tôi phải thử nó ngay lập tức. Chúng tôi đã sử dụngLambda một thời gian tại Honeybadger và tôi đã khao khát có thể viết các hàm của chúng tôi trong Ruby. Sau khi chơi với hỗ trợ Ruby mới trong vài giờ, tôi cảm thấy tự tin rằng chúng ta sẽ dành ít thời gian hơn cho Node, Go và Python. :)
Ví dụ nhanh
Mặc dù bài đăng trên blog thông báo từ AWS có thể giúp bạn thiết lập và chạy nhanh chóng với Ruby on Lambda, nhưng tôi muốn chia sẻ một ví dụ về việc sử dụng khung công tác TheServerless để triển khai các chức năng Ruby Lambda của bạn. Tôi nhận thấy khung công tác này thực hiện một công việc tuyệt vời trong việc loại bỏ những phiền toái khi làm việc với các hàm Lambda. Mặc dù phiên bản hiện tại (1.34) của khung công tác chưa sẵn sàng tạo mẫu cho các dự án Ruby (PR đã được hợp nhất vài giờ trước khi tôi bắt đầu viết bài đăng này), nhưng nó đủ dễ dàng để bắt đầu mà không cần trình tạo. Đây là tệp cấu hình ví dụ mà tôi sẽ sử dụng cho hướng dẫn này, là một chức năng đơn giản sẽ điền vào bảng DynamoDB với siêu dữ liệu được liên kết với các đối tượng S3 khi chúng được tạo:
Phần tài nguyên của cấu hình dẫn đến việc tự động tạo một bảng DynamoDB mới và tên của bảng mới tạo được đặt trong một biến môi trường cho hàm, mà chúng tôi sẽ sử dụng trong mã. Chức năng được kích hoạt bởi các sự kiện SNS cho một chủ đề SNS đã được tạo trước đó. Chủ đề SNS đó nhận được thông báo cho PUTevents trên nhóm S3, cũng được tạo theo cách thủ công.
Đây là mã Ruby:
Mã không làm được nhiều việc - nó nhận các sự kiện SNS, lặp qua các bản ghi trong các thông báo SNS để lấy thông tin về từng đối tượng S3 đã được tạo, thực hiện yêu cầu HEAD trên đối tượng S3 để lấy siêu dữ liệu, sau đó đặt (tạo hoặc cập nhật) một mục trong bảngDynamoDB. Sự phụ thuộc duy nhất cho chức năng này là AWS SDK, được bao gồm trong môi trường thời gian chạy, vì vậy bạn thậm chí không cần phải tải về Gemfile. Tuy nhiên, nếu bạn có một số đá quý bổ sung mà bạn muốn mang đến bữa tiệc, điều đó rất dễ thực hiện. Hãy xem cách bao gồm các viên ngọc bổ sung khi chúng ta nói về việc triển khai.
Triển khai
Việc lấy mã này ở trạng thái hiện tại của nó tới Lambda rất dễ dàng, cảm ơn Serverless framework:
sls deploy
Một lệnh đó sẽ thực hiện tất cả những điều này cho bạn:
- Giải nén mã của bạn
- Đặt tệp zip lên S3
- Triển khai hàm trong Lambda (hoàn chỉnh với các biến môi trường và trình kích hoạt SNS)
- Tạo các chính sách IAM
- Tạo bảng DynamoDB
Khi quá trình triển khai hoàn tất, việc tạo các đối tượng trong nhóm sẽ dẫn đến việc thêm các hạng mục mới vào bảng DynamoDB.
Phụ thuộc
Dễ dàng nhận được các phụ thuộc đá quý bổ sung đi kèm với các chức năng đã triển khai của bạn - tất cả những gì bạn cần làm là tạo một tệp Gem, thêm đá quý mà bạn muốn gói và chạy bundle install --path vendor/bundle
. Thao tác này sẽ gộp các viên ngọc vào thư mục cục bộ và chúng sẽ được nén và thêm vào hàm cùng với phần còn lại của mã của bạn.
Tuy nhiên, một lưu ý đối với các phụ thuộc là các đá quý yêu cầu một số phần mở rộng của phân loại C để được biên dịch. Vì môi trường phát triển của bạn có nhiều khả năng khác với môi trường thời gian chạy Lambda, bạn cần phải thực hiện thêm một chút công việc để các tiện ích mở rộng đó được biên dịch để hoạt động trong AWS. , không khó để làm. Để nhóm các phần phụ thuộc của bạn và biên dịch chúng đúng cách, chỉ cần chạy hình ảnh docker của tôi, như sau:
docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5
Tất cả những gì nó làm là chạy dòng lệnh Bundler đã đề cập ở trên, vì vậy các gems sẽ được đặt trong vendor/bundle
, sẵn sàng được đưa vào filethat ZIP được tạo bởi deploy
lệnh.
Với điều đó, bạn sẽ tham gia các cuộc đua. Tôi hy vọng bạn sẽ thích chạy Ruby inLambda nhiều như tôi có. :)