Help us understand the problem. What is going on with this article?

(デプロイ編①)世界一丁寧な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のコンソール上から扱うためのもの)

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

ターミナルから

$brew install python
$brew 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とは主にコンソールから文字列を扱うviというテキストエディタを拡張したものです。
Amazon Linuxにおいてはviコマンドを使用するとvimを使用するようにエイリアス設定がされています。

参考
*[ ~ ] $: which vi
alias vi='vim'
        /usr/bin/vim

sudo(superuser(=root権限)do の略。 つまりは管理者権限のこと)に続けてvisudoと入力すると、sudoコマンドの設定ファイルの中身をVimを通じてターミナルから確認&編集することができます。
また、vi ファイル名 または vim ファイル名 と打ち込むと指定したファイルをVimから編集できる(※)ので、覚えておきましょう。
※Amazon Linuxではデフォルトでエイリアスが貼られているためviコマンドでもvimを使用しますが、明示的にvimを使用する場合はvimコマンドを使用しましょう。

編集の手順としては、

iを押して編集モードにする
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]$ vim 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]$ vim 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インスタンス内に配置していきます。

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

[naoki|~]$ vim .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]$ 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
-----------------------------
[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
#bitbucketの場合
$ ssh -T git@bitbucket.org

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

  • 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] $: vim config/secrets.yml
(#secrets.ymlをvimから編集する)
-----------------------------
  production:
    secret_key_base: jr934ugr89vwredvu9iqfj394vj9edfjcvnxii90wefjc9weiodjsc9o i09fiodjvcijdsjcwejdsciojdsxcjdkkdsv 
(#ここに貼り付け)
-----------------------------

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

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

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

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

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

それではまた次回!

次章: デプロイ編②

naoki_mochizuki
Keeyls株式会社のエンジニアしてます。 無人の鍵受け渡しシステムKEYSTATION(https://key-stations.com/ )や、 シェアオフィスの管理システム( https://sharedoffice-keystations.com/ )など作ってます。
https://keeyls.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away