Edited at

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


世界一丁寧な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 \ #yumのインストール

git make gcc-c++ patch \ #cとc++のコンパイラ、gitの差分を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



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

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

それではまた次回!

次章: デプロイ編②