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

Triển khai Rails tới AWS Lambda

Điện toán không máy chủ giúp giảm tải công việc quản lý và cung cấp máy chủ cho một nhà cung cấp đám mây và đang nhanh chóng trở thành một điều đối với hầu hết các nhóm công nghệ. AWS Lambda là một loại công nghệ không máy chủ được nhiều nhóm công nghệ sử dụng. AWS Lambda hỗ trợ hầu hết các ngôn ngữ lập trình cốt lõi, bao gồm NodeJS, Java, Python và Ruby. Mặc dù các ngôn ngữ lập trình cốt lõi được hỗ trợ, nhưng có thể đôi khi bạn muốn chạy các chức năng không cần máy chủ phụ thuộc vào các tính năng là một phần của các khuôn khổ được xây dựng bằng các ngôn ngữ này. Trong bài đăng này, chúng ta sẽ khám phá cách chạy ứng dụng Rails trong AWS Lambda. Bài đăng này giả định rằng bạn thông thạo với máy tính không máy chủ và AWS Lambda và bạn muốn tìm ra cách chạy Rails trên AWS Lambda. Một công cụ có tên Lamby giúp chạy Rails trong AWS Lambda gần như dễ dàng và chúng tôi sẽ giới thiệu cách sử dụng Lamby để xây dựng và triển khai Rails tới Lambda. Tôi sẽ gọi nó là "Đường ray trên Lambda".

Lamby là gì?

Lambda cho phép bạn triển khai mã của mình và chạy nó ở bất kỳ quy mô nào mà không cần phải bảo trì các máy chủ của bạn. Bạn chỉ cần tải mã của mình lên AWS. Nó sẽ được chạy bất cứ khi nào nó được kích hoạt bởi một sự kiện, chẳng hạn như người dùng yêu cầu một trang web một công việc đang được xếp hàng đợi.

Lambda hy vọng mã của bạn được cấu trúc theo một cách nhất định. Do đó, nếu bạn muốn sử dụng nó để lưu trữ thứ gì đó như ứng dụng Rails, bạn sẽ cần sử dụng bộ điều hợp như Lamby.

Lamby là một bộ chuyển đổi Rack đơn giản. Nó nằm giữa ứng dụng Rails của bạn và AWS Lambda và chuyển đổi các sự kiện gọi Lambda từ các nguồn AWS khác nhau, chẳng hạn như cổng API hoặc bộ cân bằng tải ứng dụng, thành các sự kiện Rack mà ứng dụng Rails của bạn có thể lắng nghe.

Triển khai Rails tới AWS Lambda Nguồn kiến ​​trúc Rails Lambda:Lamby Docs

Lamby tận dụng Docker &AWS SAM để xây dựng, đóng gói và triển khai ứng dụng Rails cho Lambda.

AWS Serverless Application Model (AWS SAM) là một khuôn khổ nguồn mở mà bạn có thể sử dụng để xây dựng các ứng dụng không máy chủ trên AWS.Một ứng dụng không máy chủ là sự kết hợp của các chức năng Lambda, nguồn sự kiện và các tài nguyên khác hoạt động cùng nhau để thực hiện các tác vụ. Lưu ý rằng ứng dụng không máy chủ không chỉ là một hàm Lambda — nó có thể bao gồm các tài nguyên bổ sung, chẳng hạn như API, cơ sở dữ liệu và ánh xạ nguồn sự kiện. - Tài liệu AWS SAM

Để bắt đầu với Lamby, chúng tôi cần cài đặt Docker, tạo tài khoản AWS và định cấu hình quyền truy cập có lập trình vào tài khoản AWS của bạn.

Cài đặt Docker

AWS SAM sử dụng Docker để mô phỏng môi trường Lambda Runtime. Docker cũng làm giảm độ phức tạp của việc cài đặt AWS CLI và SAM CLI, cả hai đều phụ thuộc vào Python. Nếu bạn chưa cài đặt Docker, việc cài đặt Docker rất dễ dàng, vì bạn có thể tải xuống và cài đặt nó nếu từ trang web chính thức. Để kiểm tra xem Docker đã được cài đặt hay chưa, hãy chạy lệnh bên dưới trong thiết bị đầu cuối của bạn. Nếu Docker được cài đặt, bạn sẽ thấy số phiên bản và bản dựng tương tự như bản được hiển thị bên dưới:

$ docker --version

Triển khai Rails tới AWS Lambda Xác nhận cài đặt Docker

Thiết lập Tài khoản AWS

Nếu chưa có tài khoản AWS, bạn cần thiết lập một tài khoản. Amazon có một gói miễn phí, bao gồm việc tạo và thử nghiệm ứng dụng Rails ở Lambda, cũng như hướng dẫn về cách tạo và kích hoạt tài khoản AWS. Làm theo hướng dẫn để thiết lập tài khoản của bạn.

Đặt Quyền truy cập có lập trình AWS

Bây giờ bạn đã có tài khoản AWS, bạn sẽ cần phải định cấu hình quyền truy cập có lập trình bằng ID khóa truy cập AWS và Khóa truy cập bí mật AWS của tài khoản của bạn. Nếu bạn chưa có những thứ này, bạn có thể tạo chúng bằng cách làm như sau.

  • Đăng nhập vào tài khoản AWS của bạn.
  • Trong Bảng điều khiển quản lý AWS của bạn, hãy nhấp vào "Dịch vụ" trên thanh công cụ.
  • Tìm kiếm và chọn "IAM".
  • Nhấp vào "Người dùng" từ điều hướng bên trái.
  • Nếu "IAM" đã tồn tại, hãy chọn tên người dùng của bạn.
    • Nhấp vào tab "Thông tin đăng nhập bảo mật".
    • Nhấp vào nút "Tạo khóa truy cập".
    • Sao chép mã khóa và bí mật của bạn vào một nơi an toàn.
  • Nếu không có người dùng "IAM" nào tồn tại,
    • Nhấp vào "Thêm người dùng".
    • Thêm tên người dùng và chọn tùy chọn "Truy cập có lập trình".
    • Làm theo lời nhắc để hoàn tất quy trình.

Hãy sử dụng Docker để định cấu hình quyền truy cập có lập trình CLI. Sao chép mã bên dưới vào thiết bị đầu cuối của bạn. Bạn sẽ được nhắc nhập ID khóa truy cập AWS và Khóa truy cập bí mật AWS; nhập các khóa từ bước trước.

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

Triển khai Rails tới AWS Lambda

Tạo một ứng dụng Rails mới

Chúng tôi sẽ sử dụng SAM CLI để khởi động dự án Rails của chúng tôi. AWS SAM CLI cho phép bạn khởi tạo một dự án mới từ mẫu kho lưu trữ GitHub, thường được gọi là cookiecutter. Để bắt đầu một dự án SAM mới, chúng tôi sẽ sử dụng vùng chứa Docker để chạy sam init , sử dụng mẫu dự án Lamby Cookiecutter để khởi động một thư mục dự án mới cho bạn. Bạn sẽ được nhắc cung cấp tên dự án, nhưng tôi đã sử dụng "rails_on_lambda".

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

Triển khai Rails tới AWS Lambda

Thư mục dự án SAM mới của bạn có mọi thứ bạn cần cho dự án Rails on Lambda mới của mình. Từ cấp cao hơn, đây là những gì đã được tạo trong dự án mới của bạn.

  • Thiết lập Docker bằng cả Dockerfile và docker-compile.
  • Một dự án Ruby đang hoạt động với thư mục lib, trình gói và các thử nghiệm.
  • Một SAM template.yaml tệp.

Thiết lập và Triển khai

Bây giờ chúng ta đã tạo một ứng dụng Rails mới, chúng ta cần thiết lập nó để triển khai Lambda. Hai lệnh bên dưới chạy các tập lệnh xây dựng hình ảnh phát triển Docker và đóng gói các viên ngọc. bootstrap lệnh là quy trình một lần, trong khi setup lệnh sẽ được chạy mỗi khi bạn thêm phụ thuộc dự án mới.

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

Sau khi thực hiện thành công các lệnh trước đó, dự án của bạn đã sẵn sàng để triển khai qua SAM. Việc triển khai được thực hiện bằng cách sử dụng tập lệnh Lamby để xây dựng, đóng gói và triển khai ứng dụng Rails của bạn.

./bin/deploy

deploy lệnh chạy một tập lệnh xây dựng Lamby sao chép thư mục dự án hiện tại của bạn thành một .lamby cục bộ và chạy ba lệnh SAM cần thiết để triển khai ứng dụng của bạn.

  • thiết kế sam sung
  • gói sam
  • triển khai sam sung

Nếu các tập lệnh chạy như mong đợi, bạn sẽ thấy đầu ra cho các tác vụ triển khai CloudFormation của SAM kết thúc bằng một cái gì đó như sau:

Triển khai Rails tới AWS Lambda

Bạn cũng sẽ thấy URL như một phần của đầu ra đầu cuối. URL là một điểm cuối API API Gateway HTTP gọi ứng dụng Rails của bạn bằng cách sử dụng Rack. Mở nó trong trình duyệt của bạn và bạn sẽ thấy màn hình "chào mừng đến với Rails" quen thuộc:

Triển khai Rails tới AWS Lambda

Gọi ứng dụng Rails của bạn từ Bảng điều khiển AWS

Chúng tôi cũng có thể kiểm tra ứng dụng của mình từ bảng điều khiển Lambda. Đăng nhập vào Bảng điều khiển quản lý AWS:

  • Nhấp vào "Dịch vụ" trên thanh công cụ.
  • Nhập "Lambda" vào trường tìm dịch vụ, chọn.

Từ trang này, bạn sẽ thấy dự án "RailsOnLambda" mới được triển khai của mình.

Triển khai Rails tới AWS Lambda

  • Mở hàm "RailsOnLambda".
  • Nhấp vào nút "Kiểm tra" ở phía trên bên phải.
  • Sử dụng mẫu sự kiện "Amazon API Gateway Proxy" (sử dụng mẫu JSON bên dưới để cập nhật các trường tương ứng).
  • Đặt tên cho nó là "RailsOnLambdaTest".
  • Nhấp vào nút "Tạo".
  • Nhấp vào nút "Kiểm tra" để gọi Lambda của bạn.
{
  "body": "",
  "path": "/",
  "httpMethod": "GET",
  "queryStringParameters": {},
  "multiValueQueryStringParameters": {},
  "pathParameters": {
    "proxy": "/"
  },
  "stageVariables": {},
  "requestContext": {
    "path": "/",
    "httpMethod": "GET"
  }
}

Giả sử rằng mọi thứ diễn ra suôn sẻ, bạn sẽ thấy kết quả tương tự như bên dưới.

Triển khai Rails tới AWS Lambda

Xin chúc mừng! Bây giờ bạn có Rails trên Lambda, mặc dù một ứng dụng Rails trên Lambda vẫn chỉ là một ứng dụng Rails bình thường. Điểm khác biệt duy nhất là Lamby gem chuyển đổi API Gateway HTTP API, API Gateway REST API và các sự kiện mục tiêu của trình cân bằng tải ứng dụng thành env tương thích với Rack các đối tượng và gửi chúng đến Rails. Sau đó, Rails chuyển lại kết quả của sự kiện cho trình xử lý Lambda được xác định trong dự án của bạn.

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

Rails trên Lambda hoạt động tốt như thế nào?

Rails trên Lambda sẽ gặp phải thời gian phản hồi chậm đối với yêu cầu đầu tiên sau khi triển khai. Hiện tượng này được gọi là "khởi động nguội". Tuy nhiên, sau lần yêu cầu đầu tiên, hiệu suất là tuyệt vời và có thể đáp ứng hoặc đánh bại EC2. Nếu không có yêu cầu nào tiếp theo sau yêu cầu đầu tiên, tài nguyên máy chủ phục vụ ứng dụng Rails sẽ được gán động cho các chức năng Lambda khác sau khoảng 5-7 phút. Điều này sẽ tạo ra một khởi đầu lạnh cho các yêu cầu mới. Có một số cách để tránh khởi đầu lạnh và giữ cho ứng dụng Rails luôn ấm.

Bộ hẹn giờ CloudWatch

Bạn có thể thiết lập thời gian để ping hàm Rails on Lambda mỗi phút để giữ cho nó luôn ấm. Mở bảng điều khiển AWS và tìm kiếm CloudWatch. Từ đó, chuyển đến Sự kiện và nhấp vào Tạo quy tắc. Đặt loại sự kiện thành Lên lịch và chúng tôi sẽ chạy sự kiện này sau mỗi 1 phút.

Triển khai Rails tới AWS Lambda

Đồng thời được cấp phép

Đồng thời được cung cấp là một tính năng AWS cho phép bạn chuyển đổi và đồng ý trả thêm tiền để AWS giữ cho một vùng chứa không sử dụng luôn hoạt động. Để định cấu hình đơn vị tiền tệ được cấp phép cho ứng dụng Rails, hãy mở bảng điều khiển AWS của bạn và mở trang dịch vụ Lambda.

  • Chọn một chức năng (rails-on-lambda).
  • Chọn Cấu hình rồi chọn Đồng thời.
  • Trong Cấu hình đồng thời được cấp phép, hãy nhấp vào Thêm cấu hình.
  • Chọn bí danh hoặc phiên bản.
  • Nhập số lượng tiền tệ đồng thời được cung cấp (ví dụ:500) để phân bổ.
  • Lưu các thay đổi của bạn. Đơn vị tiền tệ được cấp phép cũng có thể được định cấu hình qua AWS CLI bằng lệnh sau:
aws lambda put-provisioned-concurrency-config --function-name my-function \
--qualifier BLUE --provisioned-concurrent-executions 100

Chi phí của Lambda trên AWS là gì?

Với AWS Lambda, bạn chỉ phải trả tiền cho những gì bạn sử dụng. Chi phí là sự kết hợp giữa số lượng yêu cầu và thời gian thực thi mã. Giá thời lượng phụ thuộc vào dung lượng bộ nhớ bạn phân bổ cho chức năng của mình. Kích thước bộ nhớ nằm trong khoảng từ 128 MB đến 10,240 MB và bạn có thể phân bổ bất kỳ dung lượng bộ nhớ nào cho chức năng của mình tùy theo nhu cầu của bạn. Dưới đây là biểu đồ cho thấy chi phí chạy 100.000 lệnh gọi của một hàm Lambda trong những thời gian khác nhau.

Triển khai Rails tới AWS Lambda Chi phí lambda

Khi nào bạn không nên chạy đường ray trên Lambda

Chúng tôi đã thấy rằng chúng tôi có thể chạy ứng dụng Rails trên AWS Lambda, nhưng mọi ứng dụng Rails có nên chạy trên Lambda không? Rails giả định rằng ứng dụng của bạn đang chạy trên một máy chủ truyền thống chứ không phải máy chủ. Một số hoạt động hoạt động dễ dàng trong ứng dụng máy chủ Rails truyền thống có thể không hoạt động không có máy chủ. Ví dụ:tải lên tệp hoặc hình ảnh sẽ không hoạt động trong ứng dụng Rails trên Lambda vì ứng dụng không có quyền truy cập vào hệ thống tệp liên tục. Ngoài ra, giao tiếp WebSocket sẽ không hoạt động trên Lambda vì máy chủ của bạn không tồn tại khi không có yêu cầu.

Kết luận

Chúng tôi chỉ trình bày cách triển khai một ứng dụng Rails cơ bản, nhưng quy trình tương tự cũng được thực hiện đối với các ứng dụng lớn. Vui lòng thêm bộ điều khiển và các tuyến đường và kiểm tra từ bảng điều khiển hoặc qua Postman và bất kỳ ứng dụng HTTP nào khác.