(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで

More than 1 year has passed since last update.

世界一丁寧なAWS解説シリーズ 項目表

No. タイトル
1 下準備編
2 DB・サーバー構築編
3 〜〜デプロイ編①(今ここ)〜〜
4 デプロイ編②
5 Capistrano編

さぁ、長かった本作もいよいよ最終章となりました。
(と言っても、1枚にまとめるには長すぎたので、デプロイ編だけで2部構成となってしまったのですが...)
ここまで読み進めて頂いた方は、AWS周りのネットワーク知識がそれなりに付いてきたのではないかと思います。

今回はいよいよ最終章。デプロイ編です。
実際に作成されたアプリをAWS上にあげていきたいと思います。

それでは早速見ていきましょう!
まずは、作成したEC2インスタンスにログインするところからです。

(※コマンドは全てMacでの使用を想定しています。ご了承ください)

8.EC2へのログイン

まずは、作成したインスタンスが起動しているのを確認してください。
下記画像の欄が緑文字で「running」となっていればOKです。

running.png

この状態になっている上で、ログインを行います。

まずはパブリックDNSの確認です。
下記より、作成したインスタンスのパブリックDNSを確認してメモしておいてください。

publicDNS.png

パブリックDNSとは...
アクセスの受け付け窓口といったイメージです。

例えば、http://yahoo.co.jp と打ち込むと、Yahoo Japan!のページに飛びますよね?

ですが、http://118.151.235.191/と打ち込んでも、同様のページにアクセスできます。

これは何故かというと、
DNS(Domain Name System)というものが
118.151.~~~~~~というIPアドレスとyahoo.co.jpというドメインを紐付けているからなのです。
つまりは、一旦ドメインでのアクセスをDNSが受け付け、受け付けたドメインと対応するIPアドレスを探して表示させているのですね。

このDNSの場所が上記に記載されているといった形です。

さぁ、ここからはコンソール画面を使っていきますよ!
いよいよプログラマーっぽくなってきましたね。

console.jpg

まずは下準備。

・python
・pip(pythonのパッケージ管理システム)
・awscli(awsをPCのコンソール上から扱うためのもの)

これらをインストールしてきます。

ターミナルから

$sudo brew install python
$sudo easy_install pip
$sudo pip install awscli

これらのコマンドを実行してください。
これにて完了です。 簡単ですね!

インスタンスへのログイン設定

先ほど作成したインスタンスにログインをしていきます。

EC2インスタンスにログインできるユーザーとして、AWSでは、デフォルトでec2-userという名のユーザーが用意されています。

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

打ち込むコマンドは下記です。

*[ ~ ] $: mv Downloads/mumu.pem .ssh/
(#作成した公開鍵をsshフォルダに移動)
*[ ~ ] $: cd .ssh/
(#ディレクトリをsshに移動)
*[ .ssh ] $: chmod 600 mumu.pem
(#公開鍵に600番で定義されたアクセス権を付与する)
*[ .ssh ] $: ssh -i mumu.pem ec2-user@54.92.121.123
(#公開鍵を利用してec2-userとしてログイン)

※最後の@以降のURLは、作成したEC2インスタンスと紐付けたElastic IPを使用してください。

初回ログインの場合、上記コマンドを打ち込むと、

The authenticity of host '52.68.~~~~~~ (52.68.~~~~~~)' can't be established.
RSA key fingerprint is eb:7a:bd:e6:aa:da:~~~~~~~~~~~~~~~~~~~~~~~~.
Are you sure you want to continue connecting (yes/no)? 

と、「本当に接続を続けるの...?」と聞かれます。
こんな脅しに負けてはいけません。 「yes」と胸を張って言ってやりましょう。
そしてドヤ顔でEnterです。
これでAmazonは降伏します。

続いて新たなユーザーを作成し、作成したユーザーにマスター権限を与えていきます。

[ec2-user|~]$ sudo adduser naoki
(#新規ユーザー名の登録)
[ec2-user|~]$ sudo passwd naoki
(#新規ユーザー名のパスワード登録)
[ec2-user|~]$ sudo visudo
(#後述)

「passwd: すべての認証トークンが正しく更新できました。」と表示されればユーザー登録とパスワード変更が完了です。

そしてここでVIMというものが登場します。
VIMとは主にコンソールから文字列を扱うテキストエディタのことで、
sudo(superuser(=root権限)do の略。 つまりは管理者権限のこと)に続けてvisudoと入力すると、sudoコマンドの設定ファイルの中身をVIMを通じてターミナルから確認&編集することができます。
また、vi ファイル名 と打ち込むと指定したファイルをVIMから編集できるので、覚えておきましょう。

編集の手順としては、

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

となります。
(使用可能なコマンド一覧はこちら)

編集が完了したら、

[ec2-user|~]$ sudo su - naoki

こちらでユーザーの切り替えを行ってください。
無事に[ec2-user|がnaoki(作成したユーザー名)と切り替わればOKです。

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

続いては実際にSSHという通信方法を用いてインスタンスにログインしていきます。
流れとしては下記となります。

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

という流れを辿っていきます。
(SSH?? 鍵?? という方はこちらをどうぞ)

では早速、下記コマンドを入力していきましょう。
(※こちらはローカルの作業となりますのでご注意ください)

local
[~]$ cd .ssh
[.ssh]$ ssh-keygen -t rsa
(#公開鍵を作成)
-----------------------------
Enter file in which to save the key ():mumu_key_rsa 
(#ここでファイルの名前を記述して、エンター)
Enter passphrase (empty for no passphrase): 
(#何もせずそのままエンター)
Enter same passphrase again: 
(#何もせずそのままエンター)
-----------------------------

[.ssh]$ ls
#「mumu_key_rsa」と「mumu_key_rsa.pub」が生成されたことを確認
[.ssh]$ vi config
(#VIMを起動し、設定ファイルを編集する)
-----------------------------
# 以下を追記
Host mumu_key_rsa
  Hostname 前出のElastic IP (#自分の設定に合わせて)
  Port 22
  User naoki (#先ほどのユーザー名)
  IdentityFile ~/.ssh/mumu_key_rsa (#秘密鍵の設定)
-----------------------------
[.ssh]$ cat mumu_key_rsa.pub
(#鍵の中身をターミナル上に出力→ssh-rsa~~~~localまでをコピーしておく)

上記により、
1.ローカルで鍵の生成
2.その鍵をどの通信の認証時に使用するか等を設定
ここまでが完了しました。 続けて見ていきます。
(※ここからはサーバー側の作業です。)

server
[naoki|~]$ mkdir .ssh
[naoki|~]$ chmod 700 .ssh
[naoki|~]$ cd .ssh
[naoki|.ssh]$ vi authorized_keys
(#vimが開く)
-----------------------------
ssh-rsa sdfjerijgviodsjcIKJKJSDFJWIRJGIUVSDJFKCNZKXVNJSKDNVMJKNSFUIEJSDFNCJSKDNVJKDSNVJNVJKDSNVJKNXCMXCNMXNVMDSXCKLMKDLSMVKSDLMVKDSLMVKLCA shizuma@shizuma-no-MacBook-Air.local
(#先ほどコピーした鍵の中身を貼り付け)
-----------------------------
[naoki|.ssh]$ chmod 600 authorized_keys
[naoki|.ssh]$ exit
[ec2-user|~]$ exit

さぁ、これで新ユーザーに見事権限が付与されたはずです。
ローカルで下記コマンドを入力し、実際にログインできるか試してみましょう。

[~]$ ssh mumu_key_rsa

ログインできれば、無事ユーザー設定は終了です。

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

さてお次は、作成したEC2インスタンス内でrubyやその他の環境が動くよう設定していきます。
みなさんもご自身のPCで開発を始められた際、「環境構築」というものを行いましたよね?
その要領で、AWS内に新しく作成したパソコン(=EC2インスタンス)でも、同様に環境構築を行なっていくイメージです。

では順に見ていきましょう。
まずは、EC2インスタンスにrubyの実行環境を作成していきます。

[naoki] 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 \
mysql mysql-server mysql-devel \
ImageMagick ImageMagick-devel \
epel-release

まずはyumという設定用のファイルをインストールし、
その後必要となるものを諸々インストールしています。
ここはもう呪文だと思ってそのまま打ち込んでください。
注意書きみたいなものが出てきますが、気にせずパスワードを入力してEnterです

インストール途中「こんだけインストールしますけど大丈夫ですか?」みたいな確認画面が出てきます。

総ダウンロード容量: 120 M
Is this ok [y/d/N]: 

y = yes なので、「y」と打ち込んでEnterです
インストールが終わると、再び入力画面に戻ります。

お次はNode.jsのインストール。

[naoki|~]$ sudo yum install nodejs npm --enablerepo=epel  
(#node.jsのインストール)

これも確認が出てくるので、「y」→Enterをしてください。

そして、rbenvのインストール→パスを通して→ruby-buildのインストールです。

[naoki|~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
(#rbenvのインストール) 
[naoki|~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
(#パスを通す)
[naoki|~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[naoki|~]$ source .bash_profile  
(#.bash_profileの読み込み)
[naoki|~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
(#ruby-buildのインストール)
[naoki|~]$ rbenv rehash  
(#rehashを行う) 

rbenvとは、簡単にrubyのバージョンの切り替えを行うためのツールです。
まずはこれをgitからクローンしてきます。
git clone http://~~~~ の後に、** ~/.rbenv** とあるのは、
「クローンしてきたものはこのフォルダに入れてね」という意味合いとなり、
また、フォルダ名の前に「.」と付いているので、新しく隠しフォルダが生成されていることが分かります。

そしてsourceコマンドで.bash_profileを読み込んだ後、パスを通して(rbenvコマンドを使えるようにして)、ruby-build(rubyをインストールするためのrbenvプラグイン)をインストールしています。

また、最後のrehashはこれまたrbenv版のおまじないのようなものなので、この操作によってrubyやらgemでインストールしてきたファイルの実行環境が生成されています。

ここらへんは覚えるしかない & 使用するツールによって操作が様々なので、
都度リファレンスなどを見ながらインプットしていきましょう。

そしていよいよ、rubyのインストールです。

# ruby 2.1.3のインストール(versionは適宜変更)
[naoki|~]$ rbenv install -v 2.1.3
[naoki|~]$ rbenv global 2.1.3
[naoki|~]$ rbenv rehash
[naoki|~]$ ruby -v

ruby -vコマンドで、しっかりとrubyのバージョンが表示されれば成功です。

gitとの連携、アプリのクローン

さぁ、rubyの実行環境が整いました。
お次は、ご自身で作成されたアプリをgitからクローンし、EC2インスタンス内に配置していきます。

vi コマンドで.gitconfigというgitに関する設定ファイルを生成します。
viコマンドは、指定したファイルが存在すれば編集を、存在しなければ新規作成をしてくれるという優れものなのです。 
とっつきにくさにさえ打ち勝てば、非常に便利な味方となってくれますよ!

[naoki|~]$ vi .gitconfig

こちらのコマンドでgitconfigというファイルを新規作成し、
下記のように設定しましょう。

-----------------------------
[user]
  name = your_name (#gitに登録した自分の名前)
  email = hoge@hoge.com (#git登録時の自分のメアド)

[alias] (#これはお好きに)
  a = add
  b = branch
  ch = checkout
  st = status

[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:
-----------------------------

完了したらファイルを保存し、
アプリを配置するディレクトリを作成していきます。

[naoki|~]$ cd /
[naoki|/]$ sudo chown naoki var (#varフォルダの所有者をnaokiにする)
[naoki|/]$ cd var
[naoki|var]$ sudo mkdir www
[naoki|var]$ sudo chown naoki www 
[naoki|var]$ cd www
(#wwwと同じ処理)
[naoki|www]$ sudo mkdir rails
[naoki|www]$ sudo chown naoki rails

mkdirコマンドでフォルダを作成し、chownコマンドで作成したフォルダの所有者を変更しています。
ここら辺は大丈夫そうですね。 

さぁ、下準備が整ったら、いよいよgitとの接続です。
まずは、下記コマンドを打ち込んでください。

[naoki|www]$ cd ~
[naoki|~]$ mkdir .ssh (#既に生成されている場合もあります。)
[naoki|~]$ chmod 700 .ssh
[naoki|.ssh]$ cd .ssh
[naoki|.ssh]$ ssh-keygen -t rsa
-----------------------------
Enter file in which to save the key ():aws_git_rsa 
(#ここでファイルの名前を記述して、エンター)
Enter passphrase (empty for no passphrase): 
(#何もせずそのままエンター)
Enter same passphrase again: 
(#何もせずそのままエンター)
-----------------------------
[naoki|.ssh]$ ls
(#「aws_git_rsa」と「aws_git_rsa.pub」が生成されたことを確認)
[naoki|.ssh]$ vi config
-----------------------------
# githubの場合以下を追記
Host github
  Hostname github.com
  User git
  IdentityFile ~/.ssh/aws_git_rsa (#秘密鍵の設定)
# bitbucketの場合以下を追記
Host bitbucket
  Hostname bitbucket.org
  User git
  IdentityFIle ~/.ssh/aws_git_rsa (#秘密鍵の設定)
-----------------------------
[naoki|.ssh]$ cat aws_git_rsa.pub
-----------------------------
ssh-rsa sdfjerijgviodsjcIKJKJSDFJWIRJGIUVSDJFKCNZKXVNJSKDNVMJKNSFUIEJSDFNCJSKDNVJKDSNVJNVJKDSNVJKNXCMXCNMXNVMDSXCKLMKDLSMVKSDLMVKDSLMVKLCA naoki@ip-10-0-1-10
-----------------------------

一度インスタンスとの接続で行った鍵の作成の流れなので、ここも大丈夫かと思います。
そして、catで表示させた公開鍵を、githubにアクセスして登録していきます。
gitへの公開鍵登録に関しては下記サイトが参考になります。
・gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~

ちなみに、「Bad owner or permissions on~~~~」と言われてしまった場合は、configファイルの権限を変更する必要があります。

[naoki|.ssh]chmod 600 config

でファイルの権限を変更した後、再び、

$ ssh -T github

を実行してみてください。

  • githubの場合
Hi NaokiMochizuki! You've succwwwessfully authenticated, but GitHub does not provide shell access.
  • bitbucketの場合
logged in as naoki.

このようなメッセージが返って来れば接続成功です。

登録が済んだら、いよいよクローンです。

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

git cloneの後に続くURLは、githubの下記より取得してください。
ssh_url.png

これでめでたくクローンが出来た...かと思います!
確認のために、下記コマンドを実行してみてください。

[naoki|.ssh]$ cd /var/www/rails
[naoki|rails]$ ls

ご自身のアプリ名が記載されたフォルダが存在すれば、見事クローン成功です。

アプリのsecret_key_baseの設定

クローンが成功したら、railsファイルのconfig/secrets.ymlに記述されている、secrets_key_baseを変更していきましょう。
今回は本番にあげるアプリの設定を変更するので、productの欄のみ編集すれば大丈夫です。
以下はローカル環境で実行してください。

[naoki|rails] $: cd mumu
[naoki|mumu] $: rake secret
(#シークレットキーを生成)
-----------------------------
jr934ugr89vwredvu9iqfj394vj9edfjcvnxii90wefjc9weiodjsc9o i09fiodjvcijdsjcwejdsciojdsxcjdkkdsv
(#表示されるkeyをコピーする)
-----------------------------
[naoki|mumu] $: vi config/secrets.yml
(#secrets.ymlをvimから編集する)
-----------------------------
  production:
    secret_key_base: jr934ugr89vwredvu9iqfj394vj9edfjcvnxii90wefjc9weiodjsc9o i09fiodjvcijdsjcwejdsciojdsxcjdkkdsv 
(#ここに貼り付け)
-----------------------------

これで無事、生成されたシークレットキーをproduction環境に反映出来たことになります。(シークレットキーは諸々の認証時に参照されるキーです。深追いはしません。)

さぁ、これでやっとこさサーバーにアプリがあがるところまで漕ぎ着けましたね!
ただ実は、このままではアプリは動かないのです...
それはなぜか。 また、解決のためにはどのような追加設定を施せば良いのか。

次回の最終章で、謎は全て解けます。
kindaichi.jpg

いや、これからなのですが 笑

なので、めげずに最後までついてきてくださいね。

それではまた次回!

次章: デプロイ編②