Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Serverless computing giúp chuyển giao việc quản lý và cung cấp server cho nhà cung cấp cloud và đang nhanh chóng trở thành xu hướng cho hầu hết các team công nghệ. AWS Lambda là loại công nghệ serverless được nhiều team dùng. AWS Lambda hỗ trợ hầu hết ngôn ngữ cốt lõi, bao gồm NodeJS, Java, Python, và Ruby. Mặc dù ngôn ngữ cốt lõi được hỗ trợ, có thể có lúc bạn muốn chạy serverless functions phụ thuộc vào tính năng của các framework xây dựng bằng ngôn ngữ đó. Trong bài này, chúng ta sẽ khám phá cách chạy ứng dụng Rails trong AWS Lambda. Bài viết giả định bạn đã quen với serverless computing và AWS Lambda và muốn tìm hiểu cách chạy Rails trên AWS Lambda. Một công cụ tên Lamby làm cho việc chạy Rails trong AWS Lambda gần như không tốn công sức, và chúng ta sẽ xem Lamby có thể dùng để build và deploy Rails lên Lambda như thế nào. Tôi sẽ gọi nó là "Rails on Lambda".

Lamby Là Gì?

Lambda cho phép bạn deploy code và chạy nó ở bất kỳ quy mô nào mà không phải maintain server. Bạn chỉ cần upload code lên AWS. Nó sẽ chạy bất cứ khi nào bị trigger bởi event, như user request trang web hay job được hàng đợi.

Lambda mong đợi code của bạn được cấu trúc theo cách nhất định. Do đó, nếu bạn muốn dùng nó host thứ gì đó như Rails app, bạn sẽ cần adapter như Lamby.

Lamby là một Rack adapter đơn giản. Nó nằm giữa Rails app và AWS Lambda và chuyển đổi Lambda invocation events từ các nguồn AWS khác nhau, như API Gateway hoặc Application Load Balancers, thành Rack events mà Rails app có thể lắng nghe.

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi Kiến trúc Rails Lambda nguồn: Lamby Docs

Lamby tận dụng Docker & AWS SAM để build, package, và deploy Rails app lên Lambda.

AWS Serverless Application Model (AWS SAM) là framework open-source để build serverless applications trên AWS. Serverless application là sự kết hợp của Lambda functions, event sources, và các resource khác làm việc cùng nhau để thực hiện task. Lưu ý serverless application không chỉ là Lambda function—có thể bao gồm resource thêm như APIs, databases, event source mappings. -- AWS SAM documentation

Để bắt đầu với Lamby, cần cài Docker, tạo tài khoản AWS, và cấu hình programmatic access cho tài khoản AWS.

Cài Đặt Docker

AWS SAM dùng Docker để giả lập môi trường Lambda Runtime. Docker cũng giảm phức tạp cài AWS CLI và SAM CLI, cả hai đều phụ thuộc Python. Nếu chưa có Docker, cài đặt rất dễ, tải và cài từ trang chủ. Để kiểm tra Docker đã cài, chạy lệnh sau trong terminal. Nếu cài thành công, bạn sẽ thấy version và build tương tự:

$ docker --version

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi 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, cần tạo. Amazon có free-tier plan, đủ cover tạo và test Rails app trong Lambda, và hướng dẫn tạo/kích hoạt tài khoản. Làm theo hướng dẫn để setup tài khoản.

Cấu Hình AWS Programmatic Access

Bây giờ có tài khoản AWS, cần cấu hình programmatic access dùng AWS Access Key ID và AWS Secret Access Key. Nếu chưa có, tạo bằng cách:

  • Đăng nhập tài khoản AWS.
  • Trong AWS Management Console, click "Services" trên toolbar.
  • Tìm và chọn "IAM".
  • Click "Users" từ navigation bên trái.
  • Nếu "IAM" đã tồn tại, chọn username.
    • Click tab "Security credentials".
    • Click nút "Create access key".
    • Copy key id và secret vào nơi an toàn.
  • Nếu chưa có "IAM" user,
    • Click "Add user".
    • Thêm username và chọn "Programmatic access".
    • Làm theo prompt hoàn tất.

Hãy dùng Docker cấu hình CLI programmatic access. Copy code dưới vào terminal. Bạn sẽ được nhắc AWS Access Key ID và AWS Secret Access Key; nhập key từ bước trước.

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

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Tạo Ứng Dụng Rails Mới

Chúng ta sẽ dùng SAM CLI để bootstrap dự án Rails. AWS SAM CLI cho phép khởi tạo dự án mới từ GitHub repository template, thường gọi là cookiecutter. Để bắt đầu dự án SAM mới, dùng Docker container chạy sam init, tận dụng Lamby Cookiecutter project template để khởi tạo thư mục dự án mới. Bạn sẽ được nhắc cung cấp project name, tôi 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 Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Thư mục dự án SAM mới có mọi thứ cần cho dự án Rails on Lambda mới. Từ góc nhìn cao, đây là những gì được sinh ra:

  • Docker setup dùng cả Dockerfile và docker-compose.
  • Ruby project hoạt động với thư mục lib, bundler, và tests.
  • File SAM template.yaml.

Thiết Lập Và Deploy

Bây giờ đã tạo Rails app mới, cần thiết lập cho Lambda deployment. Hai lệnh dưới chạy script build Docker development image và bundle gems. Lệnh bootstrap là quá trình one-time, trong khi setup chạy mỗi khi thêm dependency mới.

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

Sau khi chạy thành công, dự án sẵn sàng deploy qua SAM. Deploy dùng script Lamby build, package, và deploy Rails app.

./bin/deploy

Lệnh deploy chạy Lamby build script duplicate thư mục dự án hiện tại vào thư mục local .lamby và chạy ba lệnh SAM cần thiết để deploy app.

  • sam build
  • sam package
  • sam deploy

Nếu script chạy như mong đợi, bạn sẽ thấy output cho CloudFormation deployment tasks của SAM kết thúc giống như:

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Bạn cũng sẽ thấy URL trong terminal output. URL là API Gateway HTTP API endpoint invoke Rails app dùng Rack. Mở trong browser, bạn sẽ thấy màn hình "welcome to Rails" quen thuộc:

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Gọi Rails App Từ AWS Console

Chúng ta cũng có thể test app từ Lambda dashboard. Đăng nhập AWS Management Console:

  • Click "Services" trên toolbar.
  • Nhập "Lambda" trong find services field, chọn.

Từ trang này, bạn sẽ thấy dự án "RailsOnLambda" mới deploy.

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

  • Mở function "RailsOnLambda".
  • Click nút "Test" góc trên phải.
  • Dùng event template "Amazon API Gateway Proxy" (dùng JSON template dưới để cập nhật fields tương ứng).
  • Đặt tên "RailsOnLambdaTest".
  • Click "Create".
  • Click "Test" để invoke Lambda.
{
  "body": "",
  "path": "/",
  "httpMethod": "GET",
  "queryStringParameters": {},
  "multiValueQueryStringParameters": {},
  "pathParameters": {
    "proxy": "/"
  },
  "stageVariables": {},
  "requestContext": {
    "path": "/",
    "httpMethod": "GET"
  }
}

Giả sử mọi thứ suôn sẻ, bạn sẽ thấy output tương tự:

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Chúc mừng! Bây giờ bạn có Rails on Lambda, dù Rails app trên Lambda vẫn chỉ là Rails app bình thường. Sự khác biệt duy nhất là gem Lamby chuyển đổi API Gateway HTTP API, API Gateway REST API, và application load balancer target events thành Rack-compatible env objects và gửi cho Rails. Rails trả kết quả event cho Lambda handler định nghĩa trong dự án.

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

Hiệu Năng Rails on Lambda Như Thế Nào?

Rails on Lambda sẽ trải qua response time chậm cho request đầu tiên sau deploy. Hiện tượng này gọi là "cold start". Tuy nhiên, sau request đầu, hiệu năng xuất sắc và có thể meet or beat EC2. Nếu không có request tiếp theo sau request đầu, resource server phục vụ Rails app sẽ được gán động cho Lambda functions khác sau khoảng 5-7 phút. Điều này gây cold start cho request mới. Có vài cách tránh cold start và giữ Rails app warm.

CloudWatch Timer

Bạn có thể setup timer ping Rails on Lambda function mỗi phút để giữ warm. Mở AWS console tìm CloudWatch. Từ đó, vào Events click Create rule. Đặt event type Schedule, chạy event mỗi 1 phút.

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi

Provisioned Concurrency

Provisioned concurrency là tính năng AWS cho phép toggle và đồng ý trả thêm để AWS giữ container unused chạy luôn. Để cấu hình cho Rails app, mở AWS console vào Lambda service page.

  • Chọn function (rails-on-lambda).
  • Chọn Configuration rồi Concurrency.
  • Dưới Provisioned concurrency configurations, click Add configuration.
  • Chọn alias hoặc version.
  • Nhập số provisioned concurrency (ví dụ: 500) để allocate.
  • Lưu thay đổi. Provisioned concurrency cũng cấu hình qua AWS CLI:
aws lambda put-provisioned-concurrency-config --function-name my-function \
  --qualifier BLUE --provisioned-concurrent-executions 100

Chi Phí Lambda Trên AWS Là Gì?

Với AWS Lambda, bạn chỉ trả cho thứ bạn dùng. Chi phí là kết hợp số request và duration thực thi code. Giá duration phụ thuộc memory allocate cho function. Memory size từ 128 MB đến 10,240 MB, bạn allocate bất kỳ lượng memory nào tùy nhu cầu. Dưới là biểu đồ chi phí chạy 100,000 invocations Lambda function theo thời gian khác nhau.

Triển Khai Ruby on Rails Lên AWS Lambda: Hướng Dẫn Bước Đi Chi phí Lambda

Khi Nào Không Nên Chạy Rails Trên Lambda

Chúng ta đã thấy có thể chạy Rails app trên AWS Lambda, nhưng có nên chạy mọi Rails app trên Lambda? Rails giả định app chạy trên server truyền thống chứ không serverless. Một số operation dễ dàng trên Rails server truyền thống có thể không chạy serverless. Ví dụ, upload file/hình ảnh không chạy trên Rails on Lambda vì app không có persistent filesystem. Cũng vậy, WebSocket communication không chạy trên Lambda vì server không tồn tại khi không có request.

Kết Luận

Chúng ta chỉ demo deploy Rails app cơ bản, nhưng quy trình giống nhau cho app lớn. Tự do thêm controllers, routes và test từ console hoặc Postman và HTTP clients khác.