個人アプリ開発 AWSデプロイ

作業内容

既にTECH CAMPのカリキュラムでASWのアカウントを作成し、アプリのデプロイをしていました。
今回は復習も兼ねて、一つ一つの手順を自分なりにまとめながら、新たにアカウントを作成しデプロイを行いました。

1.AWSアカウント作成

新しいメールアドレスで新規アカウントを作成。

2.EC2 サーバのセットアップ

EC2:
時間単位で利用できるサーバ。設定によりターミナルを介して遠隔操作できる。

リージョンの設定

AWSの物理的なサーバの場所を指定する。
リージョンは世界各地に10箇所以上存在。
リージョン間でEC2の設定は独立していて、あるリージョンのEC2を他のリージョンへ移動することはできない為、EC2を立ち上げる際には、「どのリージョンの設定か」を意識するようにする。

EC2インスタンスの作成

EC2インスタンス
AWSで仮想的に一つのLinuxサーバを利用できる仕組み

AMIの選択

AMI:
Amazon Machine Image」の略語で、サーバのデータをまるごと保存したデータのこと。この中には、OSやWEBサーバなどが事前にインストールされているものもあり、自分でゼロからインストールする手間を削減することができる。
→今回は「 Amazon Linux AMI 」AWSが独自にカスタマイズしたAMIを利用。

Elastic IPの作成と紐付け

作成したEC2インスタンスには、作成時にIPアドレス(パブリックIP)が自動で割り振られている。
しかし、サーバーを再起動させるたびにこのパブリックIPが変わってしまうという欠点がある。

Elastic IP:
AWSから割り振られた固定のパブリックIPアドレス
これをEC2インスタンスに紐付けることで、インスタンスの起動、停止に関わらず常に同じIPアドレスで通信をすることが可能になる。

ポートを開く

立ち上げたばかりのEC2インスタンスSSHでアクセスすることはできるが、HTTPなどの他の接続は一切つながらないようになっている。そのため、WEBサーバとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要がある。

セキュリティグループの変更
セキュリティグループ:
EC2インスタンスが属するまとまりのようなもので、複数のEC2インスタンスのネットワーク設定を一括で行うためのもの。

アクセス制限(ルール)の追加
→タイプを「HTTP」、プロトコルを「TCP」、ポート範囲を「80」、送信元を「カスタム / 0.0.0.0/0, ::/0」に設定

EC2インスタンスへのログイン

ec2-userでログイン
ec2-user:
EC2インスタンスを作成時に生成され、一緒に生成されるSSH秘密鍵と対応したユーザー。本来はこのec2-userではなく、サービスを稼働させるためにより権限を小さくしたユーザーを作成して運用していくが、今回は簡易化の為こちらを使用し進めていきました。

$ cd ~

$ mkdir ~/.ssh
# .sshというディレクトリを作成
# File existsとエラーが表示された場合、.sshディレクトリは存在しているということ

$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。

$ cd .ssh/

$ ls
# pemファイルが存在するか確認

$ chmod 600 ダウンロードした鍵の名前.pem

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#(ダウンロードした鍵を用いて、ec2-userとしてログイン)

3.EC2のRuby/Rails環境構築

設定用のツールをインストール

yumコマンド:
Linuxにおけるソフトウェア管理の仕組み。MacOSにとってのhomebrewと同じ役割を果たす。

パッケージをアップデート

$ sudo yum -y update

その他環境構築に必要なパッケージを諸々インストール

$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl
  • yコマンド:

オプションで-yを設定する事で全ての問いにYesで自動的に答えるように設定してインストールするコマンド

Node.jsをインストール

Node.js;
サーバーサイドで動くJavaScriptのパッケージです。今後のデプロイに向けた作業の中で、CSSや画像を圧縮する際に活用される。

$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum -y install nodejs
rbenvとruby-buildをインストール

rbenvとruby-build:
Rubyのバージョンを管理する際に組み合わせて使うツール

#rbenvのインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
#パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
#rbenvを呼び出すための記述
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_profileの読み込み
$ source .bash_profile
#ruby-buildのインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#rehashを行う
$ rbenv rehash  
Rubyをインストール
$ rbenv install 2.5.1  #インストール
$ rbenv global 2.5.1  #バージョン指定
$ rbenv rehash  #rehashを行う
$ ruby -v  # バージョンを確認

アプリと同じRubyのバージョン(2.5.1)をインストール

4.MySQLの設定と動作確認

MySQL
Oracle社が開発・提供をしているRDBMS
扱いのシンプルさと処理の速度を考慮し使用しました。

MySQLをインストール
$ sudo yum -y install mysql56-server mysql56-devel mysql56

MySQLのバージョン5.6をインストール

MySQLを起動
$ sudo service mysqld start

service コマンド:
Amazon LinuxCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツール

mysqld:
「d」はLinuxの用語で「サーバ」を意味する「デーモン(daemon)」の頭文字

$ sudo service mysqld status

起動できたか確認

MySQLのrootパスワードの設定
sudo /usr/libexec/mysql56/mysqladmin -u root password 'ここを設定したいパスワードに変更してからコマンドを実行'

yum でインストールしたMySQLには、デフォルトで root というユーザーでアクセス出来るようになっているが、パスワードは設定されていない

MySQLへの接続確認
$ mysql -u root -p

5.EC2のサーバにChatSpaceのコードをクローンする準備

GithubSSH鍵を登録

1.EC2サーバのSSH鍵ペアを作成
2.Githubにアクセスして登録
3.SSH接続を確認

6.アプリケーションサーバの設定

Unicorn
アプリケーションサーバ。ローカル環境のpumaにあたる。

ローカルでGemfile を編集
[Gemfile]
group :production do
  gem 'unicorn', '5.4.1'
end
$ bundle install
config/unicorn.rbを作成・編集

→変更修正をコミットしてプッシュ(masterブランチ)

Githubからコードをクローン

1. /var/wwwディレクトリを作成し、権限をec2-userに変更

#mkdirコマンドで新たにディレクトリを作成
$ sudo mkdir /var/www/
#作成したwwwディレクトリの権限をec2-userに変更
$ sudo chown ec2-user /var/www/

2. Githubから「リポジトリURL」を取得

$ cd /var/www/
$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git

7.本番環境での設定

EC2の能力を拡張

現状動かしているEC2のインスタンスではコンピューターの能力が足りず、Gemのインストール時などにエラーが発生する可能性がある(コンピューターの処理能力に関係するメモリというものが足りない)。

#ホームディレクトリに移動
$ cd

$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512

$ sudo chmod 600 /swapfile1

$ sudo mkswap /swapfile1

$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

これで、Swap領域を確保することができました。

gemをインストール

クローンしたアプリケーションを起動するために必要なgemを以下のコマンドでインストール

1. クローンしたディレクトリに移動し、 rbenvでインストールされたRubyが使われているかチェック

2.本番環境でgemを管理するためのbundlerをインストールして、bundle installを実行
開発環境(ローカル)で開発してきたアプリで、どのバージョンのbundlerが使われていたのか確認
→同じバージョンのものをEC2サーバ側にも導入

環境変数の設定

環境変数
データベースのパスワードなどセキュリティのためにGithubにアップロードすることができない情報は、環境変数を利用して設定
Railsからは ENV['<環境変数名>'] という記述でその値を利用することができる

secret_key_base:
Cookieの暗号化に用いられる文字列。Railsアプリケーションを動作させる際は必ず用意する必要がある。また、外部に漏らしてはいけない値であるため、こちらも環境変数から参照する。

1. secret_key_baseを作成
2.環境変数を設定
3. 設定した環境変数を反映させるために、一度本番環境をログアウト
4. もう一度本番環境へログイン
5. 設定した環境変数が本当に適用されているか確認

ポートを解放

セキュリティグループのポートを設定
→起動したRailsにアクセスできるようになる

8.Railsを起動

1.database.ymlの本番環境の設定を編集
2.ローカルでの編集をコミットして、GitHubにプッシュ
3.データベースを作成しマイグレーションを実行し直す
4.Railsを起動

9.アセットファイルをコンパイル