Khi viết một ứng dụng, một trong những vấn đề chính bạn phải nghĩ đến là làm thế nào để ứng dụng đó được chia sẻ với phần còn lại của thế giới.
Một cách tiếp cận phổ biến là khởi chạy trên Heroku. Thật dễ dàng để thiết lập và được quản lý hoàn toàn. Tuy nhiên, việc các đội bỏ Heroku sau này cũng là điều thường thấy. Khi lượng truy cập của họ tăng lên, Heroku trở nên quá đắt và không linh hoạt.
Điều gì sẽ xảy ra nếu bạn có thể triển khai một ứng dụng mới với tính năng dễ dàng giống như Heroku mà không từ bỏ tính linh hoạt và tiết kiệm chi phí mà bạn nhận được từ một nền tảng có mục đích chung hơn như AWS? Hoàn toàn có thể, bằng cách sử dụng Elastic Beanstalk - một dịch vụ từ AWS.
Trong bài viết này, tôi sẽ hướng dẫn bạn cách thiết lập ứng dụng Rails 6 và chạy nó trênAWS bằng cách sử dụng Elasticbeanstalk làm cơ sở tính toán và RDS (Dịch vụ cơ sở dữ liệu quan hệ) - cụ thể là dịch vụ Postgres - làm kho lưu trữ dữ liệu.
Vào cuối hướng dẫn này, bạn sẽ có thể thực hiện những việc sau:
- Thiết lập ứng dụng Rails 6 với một số tuyến đường và chạy nó cục bộ.
- Tạo tài khoản AWS.
- Thiết lập và triển khai ứng dụng cho Elasticbeanstalk bằng các tài nguyên cấp miễn phí.
Hãy đi sâu vào.
Elasticbeanstalk và RDS là gì?
Để hiểu rõ ràng Elasticbeanstalk là gì và vấn đề mà nó giải quyết, trước tiên, hãy nói về việc cung cấp EC2 của Amazon.
EC2 là viết tắt của Elastic Compute Cloud 2. Dịch vụ này cho phép bạn cung cấp VPC, về cơ bản chỉ là máy tính, chạy bất kỳ hệ điều hành nào bạn chọn (ví dụ:Ubuntu). Sau đó, ứng dụng của bạn sẽ nằm bên trong máy tính này và truy cập các tài nguyên của nó, chẳng hạn như hệ thống tệp và RAM, để thực hiện các tác vụ của nó. Cuối cùng, ứng dụng của bạn sẽ chạy tương tự như cách nó chạy trên máy cục bộ của bạn, chỉ trong máy do Amazon sở hữu và có thể truy cập qua internet bằng cơ sở hạ tầng của Amazon.
Bây giờ, hãy tưởng tượng một người dùng tên Alice, người đã cung cấp một phiên bản trên EC2. Alice sẽ cần thực hiện những việc sau:
- Thiết lập một nhóm bảo mật để cho phép các yêu cầu đối với ứng dụng của cô ấy.
- Thiết lập bộ cân bằng tải.
- SSH vào ví dụ, thiết lập ứng dụng và bí mật môi trường của cô ấy, v.v.
Mặc dù điều này cho phép bạn toàn quyền kiểm soát máy của mình cũng như những gì và cách nó chạy, nhưng đôi khi, bạn muốn tập trung vào ứng dụng chứ không phải cơ sở hạ tầng. Đây là lúc Elasticbeanstalk xuất hiện.
Elasticbeanstalk cung cấp một CLI giúp bạn thực hiện tất cả điều này dễ dàng hơn và sẽ tự động hóa hầu hết các công việc đó, chẳng hạn như tạo nhóm bảo mật và bộ cân bằng tải. Mặc dù cơ sở hạ tầng cơ bản vẫn là EC2, một lớp trừu tượng được thêm vào bên trên nó, với một bảng điều khiển trực quan cho phép bạn thiết lập các biến môi trường, cơ sở dữ liệu và tự động mở rộng quy mô, cũng như lấy nhật ký và thực hiện các chức năng khác, trong một cách rất đơn giản.
Rails là gì?
Nhiều công cụ có thể được sử dụng để thiết lập và chạy ứng dụng web. Thông thường, thư viện hoặc khuôn khổ mà bạn sử dụng chủ yếu được quyết định bởi ngôn ngữ mà nó được lập trình.
Nếu ngôn ngữ bạn chọn là Ruby, thì một khung công tác phổ biến mà bạn có thể chọn sử dụng là Rails (chính thức được gọi là Ruby on Rails). Rails được tạo ra tại Basecamp vào năm 2003 và trong những năm qua, nó đã phát triển thành một khuôn khổ hoàn thiện và đầy đủ tính năng bao gồm hầu hết mọi thứ bạn có thể nghĩ đến để xây dựng một ứng dụng web hiện đại.
Một số thứ bạn có thể xây dựng với đường ray bao gồm từ đơn giản như blog cá nhân đến phức tạp như Airbnb và Github. Tôi chắc rằng bạn đã quen thuộc với hai công ty này và vâng, chúng chạy trên Rails!
Mặc dù bài viết này sử dụng các ví dụ về việc triển khai ứng dụng Rails lên AWS, hầu hết các khái niệm chính vẫn giống nhau bất kể ngôn ngữ và khuôn khổ được sử dụng, chẳng hạn như Python / Django hoặc PHP / Laravel.
Thiết lập Rails
Lưu ý rằng các lệnh được mô tả sẽ hoạt động trên hệ thống dựa trên UNIX / Linux. Nếu bạn đang sử dụng Windows, hãy xem xét sử dụng Hệ thống con Windows dành cho Linux và / hoặc Microsoft Windows Terminal.
Để bắt đầu, hãy xác minh phiên bản Ruby của bạn:
ruby -v
Mọi thứ 2.5.0
và ở trên là tốt để đi. Nếu chưa, hãy vào đây để tải phiên bản mới nhất. Tôi đã cài đặt phiên bản 2.6.5.
Nếu mọi thứ đều ổn với cài đặt Ruby của bạn, hãy tiếp tục và cài đặt Rails.
gem install rails
Khi lệnh đó chạy, hãy xác nhận phiên bản Rails của bạn:
rails --version
Nếu bạn thấy bất kỳ điều gì trên 6.0.0, thì bạn nên xem phần còn lại của hướng dẫn này.
Thiết lập Postgres
Chúng tôi sẽ sử dụng Postgres DB làm kho lưu trữ dữ liệu của chúng tôi cho hướng dẫn này. Đây là một hướng dẫn tuyệt vời để cài đặt nó trên mọi nền tảng.
Thêm và Chạy Mã của Chúng tôi
Chúng tôi sẽ xây dựng một API đơn giản để lưu trữ dữ liệu phim, chẳng hạn như tên, năm phát hành và thể loại. API sẽ chỉ có 2 điểm cuối, GET &POST, cho mục đích trình diễn.
Tạo một ứng dụng API Rails mới bằng lệnh sau:
rails new movie-api --api --database=postgresql
Khi lệnh trên chạy thành công, hãy đảm bảo thay đổi thư mục thành thư mục dự án đã tạo trước khi chạy các lệnh tiếp theo.
Sau đó, chúng ta có thể chạy lệnh sau để tạo mô hình của mình:
rails generate model Movie name:string year:integer genre:string
Bây giờ, hãy thiết lập cơ sở dữ liệu và chạy quá trình di chuyển:
rails db:setup
rails db:migrate
Nếu hai lệnh này thành công, bạn sẽ có thể thấy một quá trình di chuyển mới trong db/migrate
thư mục có mã tương tự như sau:
class CreateMovies < ActiveRecord::Migration[6.0]
def change
create_table :movies do |t|
t.string :name
t.integer :year
t.string :genre
t.timestamps
end
end
end
Sau đó, chúng tôi sẽ tiếp tục và thêm mã logic bộ điều khiển cho các điểm cuối API của chúng tôi:
rails g controller api/Movies
Sau đó, thêm mã sau vào tệp app/controllers/movies_controller.rb
:
class Api::MoviesController < ApplicationController
# GET /movies
def show
@movies = Movie.all
render json: @movies
end
# POST /movies
def create
@movie = Movie.new(movie_params)
if @movie.save
render json: @movie
else
render error: {error: 'Failed to add movie record'}, status: 400
end
end
private
def movie_params
params.require(:movie).permit(:name, :year, :genre)
end
end
Hãy thiết lập các tuyến đường. Mã này đi vào config/routes.rb.
Rails.application.routes.draw do
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
namespace :api do
resource :movies
end
end
Tại thời điểm này, bạn có thể chạy kiểm tra độ tỉnh táo bằng cách sử dụng rails routes
lệnh để xác minh rằng mọi thứ đang hoạt động bình thường. Bạn sẽ thấy đầu ra chứa một cái gì đó tương tự như sau:
Trước khi chạy máy chủ của chúng tôi, hãy thêm một số dữ liệu hạt giống vào db/seeds.rb
:
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the Rails db:seed command (or created alongside the database with db:setup).
movies = Movie.create([
{ name: 'Star Wars', year: 1977, genre: 'SCI-FI'},
{ name: 'Lord of the Rings', year: 2001, genre: 'Fantasy' }
])
Chạy lệnh sau để thêm dữ liệu vào DB:
rails db:seed
Bây giờ bạn có thể chạy API bằng lệnh sau:
rails s
Nếu bạn điều hướng đến https://127.0.0.1:3000/api/movies,
bạn sẽ thấy dữ liệu hạt giống của chúng tôi:
[
{
"id": 1,
"name": "Star Wars",
"year": 1977,
"genre": "SCI-FI",
"created_at": "2020-01-01T10:04:56.100Z",
"updated_at": "2020-01-01T10:04:56.100Z"
},
{
"id": 2,
"name": "Lord of the Rings",
"year": 2001,
"genre": "Fantasy",
"created_at": "2020-01-01T10:04:56.108Z",
"updated_at": "2020-01-01T10:04:56.108Z"
}
]
Tạo tài khoản AWS của bạn
Để bắt đầu, hãy truy cập trang web này. Nếu bạn chưa có tài khoản hoặc bạn chưa đăng nhập vào một tài khoản từ trình duyệt của mình, bạn sẽ thấy một trang tương tự như sau:
Tiếp tục và nhấp vào Create an AWS Account
màu cam ở góc trên bên phải (hoặc nếu bạn có tài khoản, hãy đăng nhập vào bảng điều khiển của bạn). Khi bạn đã điền vào biểu mẫu đăng ký (hãy nhớ chọn Account Type
dưới dạng Personal
khi điền địa chỉ của bạn), bạn sẽ được đưa ngay vào bảng điều khiển. Đừng quên xác minh địa chỉ email của bạn!
Đừng lo lắng nếu mọi thứ trông choáng ngợp. Giao diện người dùng khá đơn giản để điều hướng khi bạn biết mình muốn đến đâu.
Thiết lập Người dùng IAM
Điều tiếp theo chúng ta cần làm là thiết lập người dùng IAM. Điều này sẽ cung cấp cho chúng tôi quyền truy cập vào các khóa API mà chúng tôi có thể sử dụng để SSH và truy cập tài nguyên của chúng tôi từ AWS bên ngoài.
Bạn cũng nên có một người dùng IAM riêng chỉ có quyền truy cập vào các tài nguyên mà người dùng cần thay vì sử dụng thông tin đăng nhập quản trị viên mặc định cho các mục đích bảo mật.
Trên trang chủ, tìm kiếm IAM và điều hướng đến trang chủ IAM.
Trên trang chủ IAM, trong IAM Resources,
nhấp vào Users: 0.
Sau đó, nhấp vào Add User.
Bạn có thể điền vào tên người dùng mà bạn chọn, sau đó chọn hộp kiểm cho Programmatic access.
Trên màn hình tiếp theo, hãy chọn Attach existing policies directly
và sau đó sử dụng hộp tìm kiếm để tìm kiếm AdministratorAccess.
Trên trang tiếp theo, hãy thêm thẻ tên để bạn có thể xác định người dùng của mình sau này từ danh sách thông tin xác thực IAM:
Cuối cùng, trên trang đánh giá, nhấp vào Create User.
Trên trang tiếp theo, tải xuống tệp CSV bằng thông tin đăng nhập của bạn. Chúng tôi sẽ cần chúng cho phần cuối cùng.
Sau khi bạn có tệp được gọi là credentials.csv,
bạn có thể mở nó trong bất kỳ ứng dụng hoặc trình chỉnh sửa bảng tính nào để xem các giá trị trong đó. Chúng tôi chủ yếu quan tâm đến Access key ID
và Secret accesss key.
Điều cuối cùng bạn cần làm là vào thư mục HOME và tạo một thư mục có tên là .aws
. Bên trong thư mục này, hãy đặt một tệp có tên là config.
Lưu ý rằng tên thư mục bắt đầu bằng .
và tệp không có phần mở rộng. Đường dẫn đầy đủ phải là một cái gì đó giống như /Users/your-user/.aws/config.
Nếu bạn không thể tạo
.aws
thư mục vàconfig
, bạn có thể bỏ qua nó ngay bây giờ. Điều quan trọng là có sẵn tệp CSV với thông tin đăng nhập của bạn để sử dụng sau này.
Đặt phần sau vào config
tệp:
[profile eb-cli]
region = us-east-1
aws_access_key_id = your-aws-access-key-id
aws_secret_access_key = your-aws-secret-access-key
Bạn có thể tìm thấy khu vực AWS của mình ở góc trên bên phải của trang tài khoản AWS khi bạn đăng nhập.
Tạo RDS DB
Bây giờ chúng tôi sẽ tiếp tục và tạo Postgres DB mà ứng dụng của chúng tôi sẽ giao tiếp. Tương tự như IAM, bạn có thể sử dụng hộp tìm kiếm trên trang chủ để tìm kiếm RDS và điều hướng đến nó.
Trên trang chủ của RDS, nhấp vào Create database.
Trên trang tiếp theo, chọn Standard Create
; sau đó, trong Engine Options,
chọn PostgreSQL.
Khi bạn tiếp tục cuộn, hãy chọn Free tier
trong Templates
và trong Settings,
hãy để DB instance identifier
là movie-api.
Bạn có thể để lại Master username
dưới dạng postgres,
nhưng hãy tiếp tục và thêm mật khẩu.
Bỏ qua các phần DB instance size,
Storage,
và Availability & durability.
Trong Connectivity,
chọn Additional connectivity configuration
và đặt Publicly accessible
thành Yes
và VPC Security group
thành Create new.
.
Tiếp tục và bỏ qua Database authentication.
Trong Additional configuration,
đảm bảo thêm Initial database name
; movie_api_db
sẽ làm. Sau khi đặt xong, bỏ qua mọi thao tác khác và nhấp vào Create Database
ở cuối trang.
Cuối cùng, trở lại bảng điều khiển RDS, nhấp vào nhóm mặc định trong VPC Security groups
trên cột bên phải:
Ở cuối trang tiếp theo, chọn Inbound
và chỉnh sửa các quy tắc để trông như sau:
Ngoài ra, hãy đảm bảo Outbound
các quy tắc trông giống như sau:
Tạo ứng dụng Elasticbeanstalk
Điều hướng đến trang chủ cây đậu đàn hồi và nhấp vào Create New Application.
Điền vào mẫu đơn đăng ký mới nếu cần.
Sau đó, bạn sẽ thấy một trang có thông báo No environments currently exist for this application. Create one now.
Nhấp vào Create one now.
Tiếp theo, chọn Web server environment.
Trong phần tiếp theo, thay đổi Environment name
thành production-env.
Rời khỏi Domain
trống. Sau đó, trong Base Configuration,
chọn Preconfigured platform
và chọn Ruby
từ trình đơn thả xuống. Bạn có thể để lại Application code
trên Sample application
; sau đó, hãy tiếp tục và nhấp vào Create environment.
Điều này sẽ mất một thời gian, vì vậy hãy kiên nhẫn.
Sau khi hoàn tất, bạn sẽ thấy một trang trông như thế này:
Tìm URL được cung cấp sau ID môi trường. Nhấp vào nó để kiểm tra ứng dụng Ruby mặc định trênasticbeanstalk. Rất nhanh, API của bạn sẽ chạy trên cùng một URL.
Làm cho ứng dụng của bạn sẵn sàng để triển khai
Để làm cho ứng dụng sẵn sàng triển khai, trước tiên chúng ta cần định cấu hình máy chủ web của mình.
Vì Rails đi kèm với Puma, một máy chủ web sẵn sàng sản xuất, làm máy chủ mặc định của nó, bạn có thể chỉnh sửa trực tiếp tệp cấu hình tại config/puma.rb.
Chỉnh sửa tệp của bạn để trông giống như sau:
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
#
port ENV.fetch("PORT") { 3000 }
# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch("RAILS_ENV") { "development" }
# Specifies the `pidfile` that Puma will use.
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked web server processes. If using threads and workers together,
# the concurrency of the application would be max `threads` * `workers.`
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
#
workers ENV.fetch("WEB_CONCURRENCY") { 2 } # <------ uncomment this line
# Use the `preload_app!` method when specifying a `workers` number.
# This directive tells Puma to first boot the application and load code
# before forking the application. This takes advantage of Copy On Write
# process behavior so workers use less memory.
#
preload_app! # <------ uncomment this line
# Allow Puma to be restarted by the `Rails restart` command.
plugin :tmp_restart
Ngoài ra, hãy chỉnh sửa phần cuối của config/database.yml
bằng cách bình luận về production
hiện có cấu hình và sử dụng cái này thay thế:
production:
url: <%= ENV['DATABASE_URL'] %>
Cuối cùng, truy cập bảng điều khiển Elasticbeanstalk của bạn trên AWS, chọn production-env
môi trường, sau đó đi tới Configuration.
Trên màn hình tổng quan về cấu hình, hãy nhấp vào Modify
cho Software
phần:
.
Tiếp theo, thêm DATABASE_URL
và RAILS_ENV
, và sau đó nhấp vào 'Áp dụng':
Lưu ý rằng URL DB của bạn được tạo bằng
Endpoint
bạn đã lưu ý trước đó từ bảng điều khiển RDS. Nó ở định dạngpostgresql://postgres:YOURPASSWORD@ENDPOINT:5432/movie_api_db
. Nếu bạn không nhớ mật khẩu mình đã chọn, bạn có thể thay đổi mật khẩu đó trongModify
của trang tổng quan RDS của DB của bạn.
Triển khai thủ công
Điều này đơn giản như tạo tệp zip của ứng dụng của bạn từ dòng lệnh và sau đó tải nó lên bảng điều khiển Elasticbeanstalk của bạn.
Trước hết, cd
vào thư mục dự án. Để tạo tệp zip, sau đó bạn có thể chạy lệnh sau:
zip -r deploy_1.zip .
deploy_1.zip
sẽ là tên của thư mục zip được tạo và nó sẽ xuất hiện trong thư mục dự án của bạn, cùng với các tệp khác. Xong? Xuất sắc. Chuyển sang AWS.
Từ Trang tổng quan của Elasticbeanstalk, nhấp vào Upload and Deploy
:
Bạn có thể thay đổi nhãn phiên bản thành nhãn nào đó có ý nghĩa hơn:
Sau khi Elasticbeanstalk cập nhật xong môi trường, bạn có thể truy cập URL môi trường của mình để xem API của mình đang chạy! Bạn có thể sử dụng một dịch vụ miễn phí, chẳng hạn như dịch vụ này, để gửi một số yêu cầu và điền DB của bạn trên AWS.
Triển khai với EB CLI
Elasticbeanstalk CLI làm cho hầu hết những gì bạn phải làm thủ công cho đến thời điểm này khá dễ dàng để thực hiện với một vài lệnh. Tôi sẽ chỉ cho bạn cách thiết lập và sử dụng nó trong dự án hiện tại của chúng tôi. Tất cả điều này phụ thuộc vào việc người dùng IAM của bạn được thiết lập đúng cách, vì vậy hãy đảm bảo rằng mọi thứ từ bước đó đều ổn hoặc bạn đã có sẵn CSV với thông tin đăng nhập của mình.
Đối với hầu hết các máy tính, bạn nên cài đặt Python. Do đó, việc cài đặt sẽ dễ dàng như sau:
pip install awsebcli --user
Trên MacOS, bạn cũng có thể sử dụng:
brew install awsebcli
Bạn có thể đọc thêm về cài đặt tại đây.
Sau khi cài đặt xong, cd
vào thư mục dự án của bạn và chạy eb init.
Làm theo lời nhắc tùy theo môi trường AWS của bạn. Chọn một khu vực bằng cách nhập lựa chọn số chính xác:
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
Đối với phần phiên bản Ruby, hãy chọn phiên bản có liên quan bằng Puma:
1) Ruby 2.6 (Passenger Standalone)
2) Ruby 2.6 (Puma)
3) Ruby 2.5 (Passenger Standalone)
4) Ruby 2.5 (Puma)
5) Ruby 2.4 (Passenger Standalone)
6) Ruby 2.4 (Puma)
7) Ruby 2.3 (Passenger Standalone)
8) Ruby 2.3 (Puma)
9) Ruby 2.2 (Passenger Standalone)
10) Ruby 2.2 (Puma)
11) Ruby 2.1 (Passenger Standalone)
12) Ruby 2.1 (Puma)
13) Ruby 2.0 (Passenger Standalone)
14) Ruby 2.0 (Puma)
15) Ruby 1.9.3
Tôi đã chọn 2.
Xem qua phần còn lại của lời nhắc và chọn 'không' để sử dụng CodeCommit
và 'không' để thiết lập SSH.
Nếu bạn chưa thiết lập cấu hình AWS, CLI sẽ nhắc bạn nhập các khóa AWS của mình. Thêm chúng theo yêu cầu.
Khi điều này được thực hiện, CLI sẽ thoát. Sau đó, bạn có thể chạy các lệnh, chẳng hạn như eb status,
để kiểm tra trạng thái của ứng dụng chúng tôi đã triển khai.
Environment details for: production-env
Application name: movie-api
Region: us-east-2
Deployed Version: Deploy 2-2
Environment ID: e-mab3kjy6pp
Platform: arn:aws:elasticbeanstalk:us-east-2::platform/Puma with Ruby 2.6 running on 64bit Amazon Linux/2.11.1
Tier: WebServer-Standard-1.0
CNAME: production-env.qnbznvpp2t.us-east-2.elasticbeanstalk.com
Updated: 2020-01-22 23:37:17.183000+00:00
Status: Ready
Health: Green
Để triển khai một phiên bản mới, chỉ cần chạy eb deploy.
Và, đó là nó! Bạn có thể đọc thêm về các lệnh CLI khác mà bạn có thể thử tại đây
Tóm tắt
Trong hướng dẫn này, chúng ta đã học cách thiết lập một API Rails đơn giản, cách thiết lập các tài nguyên AWS, chẳng hạn như Elasticbeanstalk và RDS, cũng như cách triển khai ứng dụng để sử dụng chúng.
Chúng tôi cũng đã đề cập đến cách sử dụng Elasticbeanstalk CLI để tự động triển khai ứng dụng đám mây của chúng tôi. Giờ đây, bạn đã học cách chuyển từ một ứng dụng đang hoạt động trên máy cục bộ của mình sang một ứng dụng đang hoạt động được chia sẻ với mọi người trên AWS.