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.