Slide 1

Slide 1 text

RAILS IN AWS

Slide 2

Slide 2 text

TEXT USE AWS THEY SAID IT WILL BE FUN THEY SAID

Slide 3

Slide 3 text

TEXT THEY LIED

Slide 4

Slide 4 text

EC2

Slide 5

Slide 5 text

TEXT EC2 ▸ Ubuntu Server 16.04 LTS (HVM), SSD Volume Type ▸ Security Group (Important!!!11!!) ▸ Firewall thingy ▸ Make sure in the same VPC as all other RDS, ElastiCache, etc ▸ Configure Security Group ▸ SSH: 22 ▸ HTTP: 80 ▸ Download and store .pem file. You can’t download it again if you lost it

Slide 6

Slide 6 text

TEXT RDS ▸ Make sure in the same VPC ▸ Open port 5432 in Security Group

Slide 7

Slide 7 text

TEXT ELASTICACHE (REDIS) ▸ Make sure in the same VPC ▸ Open port 6379 in Security Group

Slide 8

Slide 8 text

TEXT CONFIGURE EC2 ▸ ssh -i "carpit.pem" [email protected] ▸ sudo apt-get update && sudo apt-get -y upgrade ▸ sudo useradd -d /home/deploy -m deploy ▸ sudo passwd deploy ▸ visudo ▸ deploy ALL=(ALL:ALL) ALL ▸ su - deploy ▸ Should run all instructions after this as user deploy

Slide 9

Slide 9 text

TEXT RBENV ▸ git clone https://github.com/rbenv/rbenv.git ~/.rbenv ▸ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc ▸ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build ▸ rbenv install 2.3.1 ▸ # Time for coffee ▸ rbenv global 2.3.1 ▸ rbenv rehash

Slide 10

Slide 10 text

TEXT NODEJS ▸ curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - ▸ sudo apt-get install -y nodejs

Slide 11

Slide 11 text

TEXT NGINX ▸ sudo nano /etc/nginx/sites-available/default upstream app { # Path to Puma SOCK file, as defined previously server unix:///home/deploy/carpit/app/current/tmp/sockets/puma.sock fail_timeout=0; } server { listen 80; server_name localhost; root /home/deploy/carpit/app/current/public; try_files $uri/index.html $uri @app; location @app { proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; } error_page 500 502 503 504 /500.html; client_max_body_size 4G; keepalive_timeout 10; }

Slide 12

Slide 12 text

TEXT ENVIRONMENTS VARIABLES ▸ sudo nano /etc/environments

Slide 13

Slide 13 text

TEXT LOAD BALANCER

Slide 14

Slide 14 text

TEXT CLOUDWATCH LOGS ▸ Create a custom policy ▸ Create a new user (need to use API key, secret key) ▸ sudo apt-get update ▸ cd ~ ▸ curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/ awslogs-agent-setup.py -O ▸ sudo python ./awslogs-agent-setup.py --region ap-southeast-1 ▸ puma_log at /home/deploy/carpit/app/current/log/puma_access.log

Slide 15

Slide 15 text

TEXT CUSTOM POLICY { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }

Slide 16

Slide 16 text

CAPISTRANO

Slide 17

Slide 17 text

TEXT GEMFILE group :development do gem 'capistrano', '~> 3.6' gem 'capistrano-rails', '~> 1.2' gem 'capistrano-bundler' gem 'capistrano-rbenv' gem 'capistrano3-puma' gem 'capistrano-sidekiq' end

Slide 18

Slide 18 text

TEXT CAPFILE require 'capistrano/setup' # Include default deployment tasks require 'capistrano/deploy' # Others require 'capistrano/rbenv' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano/puma' require 'capistrano/sidekiq' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

Slide 19

Slide 19 text

TEXT PRODUCTION.RB ▸ lock '3.7.1' # config valid only for current version of Capistrano ▸ set :application, 'carpit' ▸ set :repo_url, '[email protected]:surialabs/carpit-backend.git' ▸ set :branch, ENV['BRANCH'] || 'master' ▸ set :deploy_to, '/home/deploy/carpit/app' ▸ set :rbenv_path, '/home/deploy/.rbenv' ▸ set :rbenv_ruby, '2.3.1' ▸ append :linked_files, 'config/database.yml' ▸ append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', ‘tmp/sockets', 'public/system', 'vendor/bundle' ▸ set :sidekiq_concurrency, 7 ▸ set :sidekiq_options_per_process, ["--queue default --queue quotes"]

Slide 20

Slide 20 text

TEXT NOTES ▸ Make sure the EC2 instance SSH keys are added in Github ▸ Add your own SSH keys in ~/.ssh/authorized_keys to SSH without .pem file ▸ If you want to skip CI (so other people can build their PR), add line —skip-ci in your current branch commit log