AWS

【初心者向け】AWS(EC2)にRailsアプリを0からデプロイする方法③

デプロイ編(前編)

前回はVPCやEC2のネットワークの設定を行いました。
今回は前回作成したEC2へのログインとEC2インスタンスの環境構築を行います。

1.EC2へのログイン

①まずは左メニューの一覧から「インスタンス」を選択し、前回作成したインスタンス名「アプリ名-instance」の左側にチェックを入れて「インスタンスの状態」が「実行中」になっているか確認します。
②チェックしているインスタンスの詳細が下部に表示されるので、ここで「Elastic IP」をメモしておきます(後程使います)。

準備

ここからコンソール画面での作業もしていきます。
筆者はテラターム(Tera Term)での作業をしますが、特に指定はありません。
テラタームのインストールは別記事を参照してください。

EC2ログイン

EC2ログインのための設定をしていきます。
AWSではデフォルトで「ec2-user」という名前のユーザが用意されています。まずはこの「ec2-user」でログインするところから始めます。

以下の手順で進めていきます。
1.ec2-userでログイン
2.新たなユーザーの作成
3.作成したユーザーにec2-userと同様の権限を付与
4.新たなユーザーで再度ログイン

順番に手順を見ていきましょう。
①テラタームを起動し、TCP/IPのホストの入力欄に「Elastic IP」を入力します。

初めて接続するEC2インスタンスの場合はセキュリティ警告が表示されます。
これは指定したホストの裏側のサーバが、本当に正しいものなのか判別するためのものです。
※特に気にしなくても大丈夫です。「続行」を押下してください。

②SSH認証画面にて操作します。
②-①「ユーザー名」はデフォルトで用意されている「ec2-user」を入力します。
②-②「パスワード」はデフォルトのキーであれば空欄で大丈夫です。
②-③「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れ、「秘密鍵」を押下します。前回の記事でダウンロードしたキーペア「.pem」拡張子がついているファイルを選択します。
下記の画像の場面に切り替われば「ec2-user」としてログインできています☆

③新たなユーザーの作成を行います。下記コマンドを入力して作成します。ユーザー名とパスワードは各自自由に入力してください。

[ec2-user|~]$ sudo adduser yuu(ここはユーザー名)
(新規ユーザー名の登録)
[ec2-user|~]$ sudo passwd yuu(ここはユーザー名)
(新規ユーザー名のパスワード登録)

その後、下記コマンドにて作成したユーザーにマスター権限を付与します。

[ec2-user|~]$ sudo visudo

1.rootに関する権限の記述箇所
root    ALL=(ALL)       ALL  を探す。
2.その下に、作成したユーザーに権限を追加する記述(iを入力すれば入力モードに切り替わります)
ユーザ名   ALL=(ALL)       ALL  を追加する
3.escを押して入力モードを終了
4.Shift + zz で保存&編集完了

sudo(superuser(=root権限)do の略)に続けてvisudoと入力すると、sudoコマンドの設定ファイルの中身をVimを通じてターミナルから確認&編集することができます。基本的には「vim ファイル名」で指定したファイルを編集できます。
※escボタン …入力モード終了、i …入力モードに切り替え、:q …書込みを行わず終了

編集が完了したら下記コマンドでユーザーの切り替えをします。

[ec2-user|~]$ sudo su - yuu(ユーザー名)

テラタームでのこれまでのコマンドを実行すると、下記画像のように[ec2-user|]が[ユーザー名|]と変われば成功です。

SSH通信によるインスタンスへのログイン

次はSSH通信を使用してインスタンスにログインしていきます。
下記今回の手順です。

1:ローカルで鍵の生成
2:その鍵をどの通信の認証時に使用するか等を設定
3:サーバーとの認証処理を行う。
4:実際に新ユーザーでログイン

※ローカルでの作業になります。
①ローカルで公開鍵の作成。

[/] cd .ssh
[/.ssh] ssh-keygen -t rsa #公開鍵を作成
--------------------------------------------
下記メッセージとコマンド入力を求められます

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): portfolio_key_rsa
(#アプリ名_key_rsaと入力)
Enter passphrase (empty for no passphrase): 
(#何も入力せずにEnter)
Enter same passphrase again:
(#何も入力せずにEnter)
--------------------------------------------
[/.ssh]ls 
#「アプリ名_key_rsa」と「アプリ名_key_rsa.pub」が生成されたことを確認します。
「portfolio_key_rsa」 「portfolio_key_rsa.pub」
--------------------------------------------
[/.ssh]vim config
(#Vimを起動し、設定ファイルを編集します)
(vimなんてコマンドないよというエラーが出た場合は下記コマンドを入力して下さい)
[/.ssh]cd ..
[/]apt-get update
[/]apt-get install vim
-----------------------------
# 以下を追記
Host portfolio_key_rsa
  Hostname 前出のElastic IP (#自分の設定に合わせて)
  Port 22
  User yuu (#設定したユーザー名)
  IdentityFile ~/.ssh/portfolio_key_rsa (#秘密鍵の設定)
-----------------------------
[.ssh]cat portfolio_key_rsa.pub
(#鍵の中身をターミナル上に出力→ssh-rsa~~~~最後までコピーしておく)

※次はサーバー側での作業です。

[yuu|/]$ mkdir .ssh
[yuu|/]chmod 700 .ssh
[yuu|/]cd .ssh
[yuu|/.ssh]vim authorized_keys
-----------------------------
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTl9MIQ9OMKISWsphcJkVrY8ym3K7lIaBTfuiqpJHYuntKlEsXDPvRkpbUCxt4bzZGEoNVF8GlqZePaCg+AxNc1P6+UmBwFkAr3qTDJxY7TaWX1mjdYJwvounmY5jFNKZLlrWtQj6/ceMJuLi7Bm6KXBH7GgGGvBN7DCLFG2Hl1sJ4TTiKWRFic/47tHUEeuIlVH+GdGei3zq24S+6M7CWm9qXb/+FmMKGB8X7QBQbnkRSn4idP2ciIivFkpYjzvmLmOCNyAPhk8IWo/dMLuWwYDNt1MqemUaEhBkEx+VLFjtu6nwCmcQmeOxCaBgiubvMo78uX32LQPQt1+ZKWiqoIYB/r1KB7HLj87wGKEZ3JdbTBWhzqFhVfdy5thNw8ken1HTkOLKj0AAx9IOQ7W7NeKSYxYPEwME9p+0gC4BZh4mYFkQV+2VihO7OAEiqMPPGwLAZKrLWu+3g7Tl780BI7h4lhooL2m2CMmcp3WXj44m7lgBw3WxwSoN7U2HWoVk= yuu@yu-pc
(#先ほどコピーした鍵の中身を貼り付け)
-----------------------------
[yuu|/.ssh]chmod 600 authorized_keys

これで新ユーザーに権限を付与することができました。

EC2インスタンスの環境構築

続いて、EC2内でアプリケーションが動作するように、環境構築を行っていきます。

[yuu|~]sudo yum install git make gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel ImageMagick ImageMagick-devel epel-release
#各種パッケージのインストール
--------------------------------------------------------------------
[yuu|~]curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[yuu|~]sudo amazon-linux-extras install epel
[yuu|~]sudo yum install nodejs npm --enablerepo=epel
#Node.jsをインストール
--------------------------------------------------------------------
[yuu|~]git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
[yuu|~]echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
(#rbenvのインストール後パスを通します)
[yuu|~]echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[yuu|~]source .bash_profile
[yuu|~]git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
[yuu|~]rbenv rehash
(#ruby-buildのインストール)

色々なインストールするものがありますが、これは何となく理解できれば良いと思います。気になる方は詳しく調べていただければという感じで。

続いてrubyのインストールです。

[yuu|~]rbenv install -v 2.6.3
[yuu|~]rbenv global 2.6.3
[yuu|~]rbenv rehash
[yuu|~]ruby -v
#rubyのバージョンは各自で必要なバージョンを指定してください
#ruby -vでバージョンが表示されれば成功です

Githubと連携

作成したアプリをGithubからクローンする必要があるので、Githubとの連携を行っていきます。
vimコマンドでGithubに関する設定をします。

[yuu|/]$ cd ~
[yuu|~]$ vim .gitconfig
--------------------------------
#以下を記述
[user]
  name = your_name #gitに登録した自分の名前
  email = hoge@hoge.com #git登録時の自分のメアド

[color] #色付け
  ui = true

# githubの場合
[url "github:"] #pull、pushのための設定
    InsteadOf = https://github.com/
    InsteadOf = git@github.com:
# bitbucketの場合
[url "bitbucket:"]
    InsteadOf = https://ユーザ名@bitbucket.org/
    InsteadOf = git@bitbucket.org:
--------------------------------
:wq で保存&編集完了

次にアプリを配置するディレクトリを作成していきます。

[yuu|~]cd /
[yuu|/]sudo chown yuu var (#varフォルダの所有者をyuuにする)
[yuu|/]cd var
[yuu|var]sudo mkdir www
[yuu|var]sudo chown yuu www (#wwwフォルダの所有者をyuuにする)
[yuu|var]cd www
[yuu|www]sudo mkdir rails
[yuu|www]sudo chown yuu rails (#varフォルダの所有者をyuuにする)

次はgitとの接続を行っていきます。

[yuu|www]cd ~
[yuu|~]mkdir .ssh
 (#既に生成されている場合あり。)
[yuu|~]chmod 700 .ssh
[yuu|.ssh]cd .ssh
[yuu|.ssh]ssh-keygen -t rsa
-----------------------------
Enter file in which to save the key ():aws_git_rsa 
(#「aws_git_rsa」と入力して、Enter)
Enter passphrase (empty for no passphrase): 
(#何もせずそのままEnter)
Enter same passphrase again: 
(#何もせずそのままEnter)
-----------------------------
[yuu|.ssh]ls
(#「aws_git_rsa」と「aws_git_rsa.pub」が生成されたことを確認)
[yuu|.ssh]vim config
-----------------------------
# githubの場合以下を追記
Host github
  Hostname github.com
  User git
  IdentityFile ~/.ssh/aws_git_rsa (#秘密鍵の設定)
# bitbucketの場合以下を追記
Host bitbucket.org
  Hostname bitbucket.org
  User git
  Port 22
  IdentityFIle ~/.ssh/aws_git_rsa (#秘密鍵の設定)
  TCPKeepAlive yes
  IdentitiesOnly yes
-----------------------------
[yuu|.ssh]cat aws_git_rsa.pub
-----------------------------
ssh-rsa 以下長文コード
-----------------------------

「ssh-rsa 以下長文コード」の公開鍵をGithubにアップします。

①右上の「New SSh key」を選択。
②Title:「aws_git_rsa.pub」 #公開鍵名
③Key:「ssh-rsa~~~」 #catで確認した公開鍵の中身
④「Add SSH Key」を選択。

ターミナルに戻り下記コマンドを入力。

[yuu|.ssh]chmod 600 config
[yuu|.ssh]ssh -T github

ここで下記エラーが出る場合、

Warning: Permanently added 'github.com,13.114.40.48' (RSA) to the list of known hosts.
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell access.

以下の対処をすると解決できると思います(筆者の体験談)。

対処1
[yuu|.ssh]vi ~/.ssh/known_hosts
#github.com,~から始まる一行を削除

対処2
[yuu|.ssh]ssh-add -l
#秘密鍵のパスが返ってこなければ下記コマンド入力
[yuu|.ssh]ssh-add github_id_rsa(秘密鍵名)

対処1,2実施後
[yuu|.ssh]ssh -T github

これで先ほどのエラー文が表示されずに二行目のメッセージのみが表示されれば成功となります。

アプリのクローン

[yuu|.ssh]$ cd /var/www/rails
[yuu|rails]$ git clone git@github.com:~~

「git@github.com~~」の部分は下記画像のようにgithubのページから参照しましょう。

※「SSH」を選択してからコピーを選択してください。

[yuu|rails]ls

「ls」コマンドでアプリがクローン出来ているか確認してください。できていれば成功です。

次に必要なgem達をインストールします。
※エラーは筆者の体験談です。

[yuu|portfolio(アプリ名)]bundle install
#pgのエラーが出た場合
#バージョンは各自エラー文面を入力
[yuu|portfolio]sudo yum install postgresql-devel
[yuu|portfolio]gem install pg -v '0.2.0' --source 'https://rubygems.org/'
#sqliteのエラーが出た場合
#バージョンは各自エラー文面を入力
[yuu|portfolio]sudo yum install sqlite-devel
[yuu|portfolio]gem install sqlite3 -v '1.3.13' --source 'https://rubygems.org/'
[yuu|portfolio]bundle install

「bundle install」してエラーが出なければOKです。

最後にシークレットキーを本番環境に反映させます。
個々での詳細は割愛します。

[yuu|portfolio]rake secret
(#シークレットキーを生成)
-----------------------------
キーが表示されるのでコピーします
-----------------------------
[yuu|portfolio]vim config/secrets.yml
(#secrets.ymlをvimから編集する)
-----------------------------
  production:
    secret_key_base: #ここにキーを貼り付ける
-----------------------------

今回はこれで以上となります。
これで残すところはサーバー環境やDBの設定のみとなりました。
次回でデプロイまで終わらせて自分のドメインを取得するところまで進めたいと思います。
それではお疲れ様でした!(o*。_。)oペコッ