[Series AWS Product][ElasticBeanstalk] Triển khai nhanh dự án Rails lên AWS bằng ElasticBeanstalk

Triển khai một ứng dụng Rails có thể là một công việc khó khăn đối với các lập trình viên ít có kinh nghiệm về config server, hay cả đối với các nhà phát triển Rails dày dạn kinh nghiệm đôi lúc còn phải đau đầu vì những lỗi xảy ra trong quá trình config server. Nào là config Nginx, Unicorn, Redis đủ thứ phải làm, bắt đầu từ 1 VPS linux rỗng để xây dựng môi trường chạy Rails không phải là điều dễ dàng.

Nhưng với một product của Amazon có tên gọi là Elastic Beanstalk đã giúp chúng ta giải quyết vấn đề đó.

Vậy Elastic Beantalk là gì?

AWS Elastic Beanstalk là dịch vụ dễ sử dụng, dùng để triển khai và mở rộng các ứng dụng web và dịch vụ được phát triển trên các máy chủ quen thuộc như Apache, Nginx, Passenger với Java, .NET, PHP, Node.js, Python, Ruby, Go và Docker , và IIS. Bạn chỉ cần upload project của mình lên và Elastic Beanstalk tự động xử lý việc triển khai, từ việc cung cấp dung lượng, cân bằng tải, tự động mở rộng theo dõi tình trạng ứng dụng. Đồng thời, bạn vẫn giữ toàn quyền kiểm soát các tài nguyên AWS cung cấp cho ứng dụng của bạn và có thể truy cập các tài nguyên cơ bản bất cứ lúc nào.

Ok. Vậy các bạn có thể hình dung phần nào về công dụng và chức năng của Elastic Beanstalk, nó giống như Heroku vậy, nhưng cao cấp hơn.

Chuẩn bị: - 1 tài khoảng AWS - 1 máy tính chạy HDH linux hoặc MacOS. ( Riêng Window cũng có thể sử dụng được nhưng thường phát sinh rất nhiều lỗi )

Install EB CLI

EB CLI là một client command sử dụng để tạo, cấu hình và quản lý môi trường Elastic Beanstalk. EB CLI được phát triển bằng Python và yêu cầu Python phiên bản 2.7, phiên bản 3.4, hoặc mới hơn.

Install Python.

$ sudo apt-get update && sudo apt-get -y upgrade
$ sudo apt-get install python-pip

Install EB CLI

$ pip install awsebcli --upgrade --user

Muốn deploy project Rails thì trước hết phải có project đã nhá 😄

$ rails new YOUR_PROJECT
// Mình sẽ tạo project có tên là word-doc
$ git init
$ git remote add YOUR_REPO
$ git add .
$ git commit -m "first commit"

Create enviroment EB

$ cd word-doc
$ eb init

Sau đó các bạn chọn lần lượt các option

Select a default region
> 1) us-east-1 : US East (N. Virginia)

Select an application to use
> 1)[ Create new Application ]

Enter Application Name
> (default is "word-doc"):

Application rails5app has been created.
> It appears you are using Ruby. Is this correct?
> (y/n): y

Select a platform version.
> 1) Ruby 2.4 (Puma)

Do you want to set up SSH for your instances?
> (y/n): y
> Select a keypair.
> 1) [ Create new KeyPair ]
> (default is 1): 1

Nếu lần đầu các bạn chay eb init nó sẽ bắt các bạn nhập Access Key IDSecret Access Key, các bạn có thể lấy nó ở đây. https://console.aws.amazon.com/iam/home?#/security_credential , click vào Access keys (access key ID and secret access key)

Sau đó các bạn chạy lệnh

$ eb create word-doc
Creating application version archive "app-4117-180129_173006".
Uploading word-doc/app-4117-180129_173006.zip to S3. This may take a while.
Upload Complete.
Environment details for: word-doc
  Application name: word-doc
  Region: us-west-2
  Deployed Version: app-4117-180129_173006
  Environment ID: e-cbkaqhbppg
  Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Puma with Ruby 2.4 running on 64bit Amazon Linux/2.6.5
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2018-01-29 10:30:13.952000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-us-west-2-617788525353 as Amazon S3 storage bucket for environment data.
INFO: Created security group named: sg-a8aa53d7
INFO: Created load balancer named: awseb-e-c-AWSEBLoa-E91I3NXR0P23
INFO: Created security group named: awseb-e-cbkaqhbppg-stack-AWSEBSecurityGroup-1TT8IAQY4C814
INFO: Created Auto Scaling launch configuration named: awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingLaunchConfiguration-P4KVCW46PQS5
INFO: Created Auto Scaling group named: awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingGroup-YT0HU0XZ7DX
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-west-2:617788525353:scalingPolicy:3957c5c9-68f2-44c7-9ba7-d7eae5736a34:autoScalingGroupName/awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingGroup-YT0HU0XZ7DX:policyName/awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingScaleDownPolicy-FD8YFW4EB618
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-west-2:617788525353:scalingPolicy:4f6f9f4a-c4bc-40b8-8a60-92af3b3336da:autoScalingGroupName/awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingGroup-YT0HU0XZ7DX:policyName/awseb-e-cbkaqhbppg-stack-AWSEBAutoScalingScaleUpPolicy-1AKTS4QFWTYCI
INFO: Created CloudWatch alarm named: awseb-e-cbkaqhbppg-stack-AWSEBCloudwatchAlarmLow-ZOSHA45K0MHY
INFO: Created CloudWatch alarm named: awseb-e-cbkaqhbppg-stack-AWSEBCloudwatchAlarmHigh-1060ZYCKYG0BO
INFO: Successfully launched environment: word-doc

Và đợi 1 lát. Ngay bây giờ Elastic Beanstalk đang thiết lập tất cả mọi thứ cho bạn, nhóm bảo mật, máy chủ EC2...

Các bạn có thể xem thông tin enviroment

$ eb status
Environment details for: word-doc
  Application name: word-doc
  Region: us-west-2
  Deployed Version: app-4117-180129_173006
  Environment ID: e-cbkaqhbppg
  Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Puma with Ruby 2.4 running on 64bit Amazon Linux/2.6.5
  Tier: WebServer-Standard-1.0
  CNAME: word-doc.2sr2ipa8jr.us-west-2.elasticbeanstalk.com
  Updated: 2018-01-29 10:34:17.752000+00:00
  Status: Ready
  Health: Green

Các bạn chú ý dòng CNAME. Đó là link production của project: word-doc.2sr2ipa8jr.us-west-2.elasticbeanstalk.com

Add SECRET_BASE_KEY lên EB instance.

$ eb setenv SECRET_KEY_BASE=$(rails secret)

Tạo biến môi trường.

Lưu ý: Vì filepublic.html không chạy trên production nên bạn phải tạo 1 action làm root.

$ rails g controller home index

Config root routes

Rails.application.routes.draw do
  root 'home#index'

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

Vì hiện tại nhưng thay đổi chỉ ở dưới local.

$ git add .
$ git commit -m "Controller root app"
$ git push origin master
$ eb deploy

Lệnh$ eb deploy sẽ deploy những thay đổi lên Elastic Beanstalk. Sau này sau khi thay đổi gì các bạn chỉ cần chay $ eb deploy là ok. Đợi 1 lát.

Creating application version archive "app-c1f5-180129_173804".
Uploading word-doc/app-c1f5-180129_173804.zip to S3. This may take a while.
Upload Complete.
INFO: Environment update is starting.                               
INFO: Deploying new version to instance(s).                         
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

Ok bây giờ truy cập vào word-doc.2sr2ipa8jr.us-west-2.elasticbeanstalk.com và DONE.

Vậy là mình đã hướng dẫn các bạn deploy Rails app thông qua ElasticBeanstalk. Easy đúng k nào.

All Rights Reserved