uycep2ed’s blog

IT関連のニュースで思ったこと感じたこと、プログラミングの勉強の備忘録を書いていきたいと思います。

AWSサーバーのデプロイのあれこれ

今回オリジナルアプリをAWSサーバーを使ってデプロイした時に、備忘録....

 

自動デプロ化の実装

Capistranoを使いました。

しよするためにまずはGemのインストール

group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end

※bundle installを忘れずに!

その後自分のアプリのディレクトリーで

bundle exec cap install

これで必要なファイルの作成ができました。

そのあとは、生成されたCapfileの編集

require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

デプロイに際して必要な動作がひととおり記述完了!

次にproduction.rbの編集

記述内容は、

サーバーホスト名(or IPアドレス)

AWSのサーバーへログインできるユーザー名

サーバーロール(後述)

sshの設定

その他サーバーに紐づく任意の設定

server '用意したElastic IP', user: 'ec2-user', roles: %w{app db web}

 次に、deploy.rbの編集

lock 'Capistranoのバージョン'

set :application, 'ご自身のアプリケーション名'

set :repo_url,  'git@github.com:Githubのユーザー名/レポジトリ名.git'

set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :rbenv_type, :user
set :rbenv_ruby, 'このアプリで使用しているrubyのバージョン' 

set :ssh_options, auth_methods: ['publickey'],
                                  keys: ['~/.ssh/ご自身のキーペア名.pem'] 

set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end

Capistranoのバージョン確認はGemfile.lockで確認可能

 

ここまで完了したらunicorn.rbの編集

app_path = File.expand_path('../../../', __FILE__) 

worker_processes 1

working_directory "#{app_path}/current" 

pid "#{app_path}/shared/tmp/pids/unicorn.pid"  

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

stderr_path "#{app_path}/shared/log/unicorn.stderr.log"

stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
(省略)

 

次にNginvファイルの編集

EC2(ターミナル)で

sudo vim /etc/nginx/conf.d/rails.con

/etc/nginx/conf.d/rails.conf

  server unix:/var/www/アプリケーション名/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name Elastic IP;

  client_max_body_size 2g;

  root /var/www/アプリケーション名/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root /var/www/アプリケーション名/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}

nginxを編集したら必ず再起動する。

$ sudo systemctl reload nginx
$ sudo systemctl restart nginx

ここまできたらあと少し!!!

$ sudo systemctl status mariadb 

でデータベースが起動しているか確認し、オッケーなら

Unicornのプロセスが起動しているので、

 ps aux | grep unicorn

でmainってやつの番号を確認、その後

kill プロセス番号

完了したらローカルで全てmasterにプッシュしているか確認して

ローカルのアプリケーションディレクトリーで

bundle exec cap production deploy

これで完了!

 

あとはローカルで修正したら場合は、その修正箇所によって少し違うが簡単にデプロイが可能になります。

 

ローカルで修正入れた場合

<状況自動デプロイ前にやること>

・ローカルでVSCodeを修正した場合変更点をリモートリポジトリにcommit→pushする

(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」


・ローカルでデータベース関連の内容を修正した場合本番環境で「rails db:drop RAILS_ENV=production」「rails db:create RAILS_ENV=production」を実行
(※実行する際、「DISABLE_DATABASE_ENVIRONMENT_CHECK=1」というオプションが必要)

(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」 

 

・Nginxを修正した場合「sudo systemctl restart nginx」を実行

 

うまくいかない時の確認場所

・ローカルでは問題なく動いているのか?
・ローカルからGiuHubへのpushのし忘れはないか(mergeできているか)
GitHubからEC2への反映(git pull origin master)のし忘れは?
・EC2サーバー側でエラーログの内容を確認し、原因を見つけたか?
・Nginxは正しく起動しているか?
・EC2サーバー側の環境変数は正しく設定できているか?
・EC2インスタンスの再起動を行ってみる

AWSのサービスであるS3を使って画像をサーバーに保存する

まずはAWSに登録からです。

ネットで調べればすぐに出てきます。

無料枠で十分扱う事ができるので、まずは無料枠から使うことをお勧めします。

 

 

語句説明

バケット

S3で実際にデータが格納される場所のことを「バケット」と呼びます。バケットの名前はアクセスするときのURLに使用されるため、英数字で、まだ誰も付けたことがない名前を使う必要があります。
バケットは、名前とリージョンを決めるだけで簡単に作成できます。

 

リージョン

バケットが実際に存在しているサーバーの在り処のことです。

 

・サービスからS3を選択し、バケットを作成をクリック

バケット名を自由に決めて、リージョンが東京になっていることを確認

・アクセス許可設定を全てをブロックを外し、下から二つをチェックボックスを選択

これで作成は完了!

 

次にパケットポリシーの設定をしていきます

今回はIAMユーザーからのみのアクセスを許可します。

・サービスから「IAM」を検索

・作成したユーザのARNをコピーしておく

・先ほど作成したバケットを開き、アクセス権限を選択

バケットポリシーを

 

{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "先ほどコピーしたユーザーARN"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::作成したバケット名"
       }
   ]
}

を記述し保存

 

次に必要なgemをインストールします

Gemfile
1
 gem "aws-sdk-s3", require: false

からの、ターミナルでbundle install

 

config/environments/development.rb

(省略)

     config.active_storage.service = :amazon (省略)
 
:localから:amazonに変更

config/storage.yml

test: service: Disk root: <%= Rails.root.join("tmp/storage") %> local: service: Disk root: <%= Rails.root.join("storage") %> amazon: service: S3 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> region: ap-northeast-1 bucket: ご自身のバケット (省略)
 
ここを上記のように付け加える

あとは、環境変数を使っているのでその設定を変更してします。

環境変数については違う記事で描こうと思います。

Rubyを深掘る

Rubyのライブラリについて学びました。

 

ライブラリには、二つあります。

 

 

標準ライブラリ

予めRubyで使えるライブラリーです。代表的なところでいうと日付を扱う事ができるDateクラスなどが当たります。また組み込みライブラリというのもあり、配列のArrayクラスや数字のIntegerクラスなど特によく使う物です。

 

外部ライブラリ

 

外部ライブラリーとは、gem(ジェム)のことです。世界のすごい人たちが作った物でGitHubで公開されてます。使うためにはインストールが必要。

 

しかも無料で使えるってのがほんとにすごい!

このGemを使うとほんとに実装が楽になります。

例えばユーザー管理機能で使えるのが、deviseというジェムです。

詳しくはこちらをご覧ください。

GitのURL

 

しかしgem1つだけではは動作しない場合もあるので使い方には注意が必要です!

 

便利な機能をもったgemがたくさんあるので自分が実装を楽にしてくれるgemに出会えると良いですね!!!