12/08/2018, 16:19

Cài đặt Rails app trên AWS với Elastic Beanstalk và PostgreSQL

Trong bài viết này, sẽ đề cập đến công cụ Elastic Beanstalk của Amazon trong việc cài đặt một app Rails sử dụng database PostgreSQL Amazon đã mô tả Elastic Beanstalk như sau: AWS Elastic Beanstalk makes it even easier for developers to quickly deploy and manage applications in the AWS cloud. ...

Trong bài viết này, sẽ đề cập đến công cụ Elastic Beanstalk của Amazon trong việc cài đặt một app Rails sử dụng database PostgreSQL

Amazon đã mô tả Elastic Beanstalk như sau:

AWS Elastic Beanstalk makes it even easier for developers to quickly deploy and manage applications in the AWS cloud. Developers simply upload their application, and Elastic Beanstalk automatically handles the deployment details of capacity provisioning, load balancing, auto-scaling, and application health monitoring.

đại ý là

AWS Elastic Beanstalk hỗ trợ nhà phát triển dễ dàng hơn nhiều trong quá trình deploy và quản lý app dựa vào AWS cloud. Dev chỉ cần upload ứng dụng của họ và Elastic Beanstalk sẽ tự động toàn bộ quá trình deploy và sắp xếp dung lượng, cân bằng tải, tự động mở rộng và theo dõi tình trạng sức khoẻ của hệ thống.

Cài đặt Elastic Beanstalk

Đăng ký một tài khoản AWS theo hướng dẫn ở AWS Console và tải công cụ Elastic Beanstalk Command Line thông qua Homebrew

$ brew update
$ brew install aws-elasticbeanstalk

Cài đặt Rails app đơn giản

Ta tạo một app đơn giản sau

$ gem install rails
$ rails new blog
$ cd blog
$ git init && git add -A && git commit -m "Add rails scaffold"

Cài đặt blog

$ rails generate scaffold post title:string body:text
$ bundle exec rake db:migrate
$ git add -A && git commit -am "Add post resource"

Khởi tạo Elastic Beanstalk

Ta chạy lệnh để khởi tạo Elastic Beanstalk

$ eb init

Và thực hiện một vài setting theo hướng dẫn

Select a default region
3) us-west-2 : US West (Oregon)
Select an application to use
[ Create new Application ]
Enter Application Name
blog
Application blog has been created.
It appears you are using Ruby. Is this correct?
(y/n): y
Select a platform version.
1) Ruby 2.2 (Puma)
Do you want to set up SSH for your instances?
(y/n): n

Tạo môi trường Elastic Beanstalk

Bạn có thể tạo nhiều môi trường cho mỗi app Elastic Beanstalk. Điều này rất hữu ích khi có cả môi trường dev và production cho cùng app

Để tạo môi trường mới, ta sử dụng

$ eb create blog-env:
  Creating application version archive "b303".
  Uploading blog/b303.zip to S3. This may take a while.
  Upload Complete.
  Environment details for: blog-env
    Application name: blog
    Region: us-west-2
    Deployed Version: b303
    Environment ID: e-g5mkeawrnz
    Platform: 64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2 (Puma)
    Tier: WebServer-Standard
    CNAME: UNKNOWN
    Updated: 2017-10-19 23:38:50.955000+00:00
  Printing Status:
  INFO: createEnvironment is starting.
  INFO: Using elasticbeanstalk-us-west-2-83376862866 as Amazon S3 storage bucket for environment data.
  INFO: Created load balancer named: awseb-e-g-AWSEBLoa-7R0CSEMQ6W2M
  INFO: Created security group named: awseb-e-g5mkeawrnz-stack-AWSEBSecurityGroup-56IUD2ZYQ5FR
  INFO: Created Auto Scaling launch configuration named: awseb-e-g5mkeawrnz-stack-AWSEBAutoScalingLaunchConfigurat...
  INFO: Created Auto Scaling group named: awseb-e-g5mkeawrnz-stack-AWSEBAutoScalingGroup-2URXDKL0NCIJ
  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:833768628226:scalingPolicy:02920f8b...
  INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-west-2:833768628666:scalingPolicy:b143cea1...
  INFO: Created CloudWatch alarm named: awseb-e-g5mkeawrnz-stack-AWSEBCloudwatchAlarmHigh-APCUnlMHNIS1
  INFO: Created CloudWatch alarm named: awseb-e-g5mkeawrnz-stack-AWSEBCloudwatchAlarmLow-1UL48B2CC2OM8
  INFO: Added EC2 instance 'i-7f4b6eb7' to Auto Scaling Group 'awseb-e-g7mkeawrnz-stack-AWSEBAutoScalingGroup-2URX...
  INFO: Application available at blog-env-zckzptpdgy.elasticbeanstalk.com.
  INFO: Successfully launched environment: blog-env

Để xem trạng thái của môi trường

$ eb status
  Environment details for: blog-env
    Application name: blog
    Region: us-west-2
    Deployed Version: b303
    Environment ID: e-g5mkeawrn
    Platform: 64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2
    Tier: WebServer-Standard
    CNAME: blog-env-zckzptpdg2.elasticbeanstalk.com
    Updated: 2017-10-19 23:51:59.259000+00:00
    Status: Ready
    Health: Green

Điều cuối cùng cần làm để chạy Rails là tạo biến môi trường SECRET_KEY_BASE

$ rake secret
  f655b5cfeb452e49d9182c6b5e6856704e6e1674082fa1e5f1a330782bad1833ba4cc30951e094f9250c87573dc0bbd3d46d37c5d79ff57...

Để thêm secret vào môi trường elastic beanstalk

$ eb setenv SECRET_KEY_BASE=f655b5cfeb452e49d9182c6b5e6856704e6e1674082fa1e5f1a330782bad1833ba4cc30951e094f9250...

Khi đó, ta có một trang blog đơn giản trên amazon

Sử dụng PostgreSQL với Rails

Thêm gem pg cho môi trường production

  group :production do
    # Use PostgreSQL as the database for Active Record
    gem 'pg', '~> 0.18.1'
  end

Cấu hình file database.yml

production:
    <<: *default
    adapter: postgresql
    encoding: unicode
    database: <%= ENV['RDS_DB_NAME'] %>
    username: <%= ENV['RDS_USERNAME'] %>
    password: <%= ENV['RDS_PASSWORD'] %>
    host: <%= ENV['RDS_HOSTNAME'] %>
    port: <%= ENV['RDS_PORT'] %>

Cài đặt pg gem hoạt động trên Elastic Beanstalk

Để thêm database vào môi trường , đầu tiên bạn vào Elastic Beanstalk trên AWS console.aws.amazon.com/elasticbeanstalk/?region=us-west-2

Chọn blog-env và đi đến cấu hình bên trái. Ở bên dưới ta thấy

Chọn create a new RDS database, và set DB Engine thành postgress rồi tạo Username master và password master

Chọn Save và bạn sẽ có một instance đầy đủ chức năng của PostgreSQL và các biến môi trường sẽ được tự động thêm vào môi trường Beanstalk

Bây giờ, cài đặt gem pg trên server của bạn , cái này cần sử dụng package postgresql93-devel yum. Cấu hình package trên instance Elastic Beanstalk chỉ đơn giản là thả một file .config định dạng YAML vào trên cùng của folder .ebextensions.

# .ebextensions/packages.config
  packages:
    yum:
      postgresql93-devel: []

Và bây giờ, ta sẽ có một trang blog đơn giản sử dụng Rails và Postgres database

Bài viết sau, tôi sẽ đề cập đến cách sử dụng Elastic Beanstalk để deploy một app trên github.

0