背景
エンジニア新人~初心者の皆さんから「自分はどんなエンジニアの仕事に向いているかわからない。。。」という声をよく聞きます。
そこでエンジニア適性診断1DAYキットを作成しました。
ゼロの状態からアプリの公開までの仕事の中には、フロントエンドエンジニアの仕事もサーバサイドエンジニアの仕事もインフラエンジニアの仕事も含まれています。
そこで、一度ゼロの状態からアプリの公開までを体験してみるのが良いと考えました。
下記の流れに沿って体験し、最後の診断結果を目安にしていただければうれしい限りです!
全体の流れ
以下の順番ですすめていきます。
- AWSアカウントの作成
- Cloud9準備
- Cloud9で開発環境構築(ちなみに一瞬でカンタンです)
- いよいよ開発です
- 機能面でのカスタマイズ
- デザイン面でのカスタマイズ
- アプリケーション側での公開準備
- カギ作成
- Github登録
- Githubでのソースコードの公開
- LightsailでOS作成
- AmazonLinuxへのアクセス
- AmazonLinuxの最初の準備
- Rubyのインストール
- bundlerのインストール
- PostgreSQLのインストールと設定
- Nginxのインストールと設定
- GithubからAmazonLinuxにソースコードを入れる
- AmazonLinux上でアプリを起動させる
- では全世界に公開されたWEBサイトを見てみましょう
Cloud9で開発準備
みなさん開発エディタにSublimeTextとかAtomとかサクラエディタとか使っているかと思います。
ここではAWSのサービスの1つであるCloud9を使います。
Cloud9は開発環境構築が超カンタン、かつ、ブラウザ上で開発可能なスーパーエディタなのです。
AWSアカウントの作成
まずはCloud9を利用する前にAWSのアカウントを作成します。
https://aws.amazon.com/jp/
にアクセス(下記画面)
右上の無料サインアップ
か真ん中ちょい左の今すぐ無料サインアップ
をクリック
すると下記画面にいきます。
流れにそって下記情報を入力していきます。
- メールアドレス
- パスワード
- 個人情報(氏名、生年月日、住所など)
- クレジットカード情報
クレジットカードはビビりますがAWS無料枠の範囲内だと料金発生しませんので、その範囲内で進めていきますよ!
※2019/5/5時点で本Kitのレベルで1ヶ月以内のサービス利用であれば課金されないことを確認しています。
もちろん無料のベーシックプランを選択
すると下記画面が表示されます。
ほぼ同タイミングで登録したメールアドレス宛にこんなメールも来ます。
これでAWSアカウントの作成完了。
Cloud9準備
つぎにCloud9を使う準備をしていきます。
https://console.aws.amazon.com/console/home
にアクセス(下記画面)
さっき登録したアカウントでサインインすると下記のような画面にいきます。
左上のサービスを検索するの検索窓にcloud9
と入力してクリック
すると若干いかつめなこんなページに行きます。
真ん中ちょい右のオレンジのCreate environmentをクリックするとこんな画面に行きます。
Name→開発環境の名前(なんでもOK)
Description→その開発環境の説明(なんでもOK)
を入力してNext step
するとこんな画面に行きます。
このあたりは「どのAWSサービスを使いますか?」とか「どんなOSを使いますか?」的なセッティングですが全部デフォルトのまま進めます。
すると下記のような確認画面がでてくるのでCreate environment
これでCloud9準備完了です!
また下記のようにそれぞれの部分を呼ぶことにします。
- 赤の部分→ファイルツリー
- 緑の部分→ファイルビューワー
- 青の部分→コンソール
Cloud9で開発環境構築(ちなみに一瞬でカンタンです)
じつはすでにほぼ完了しています。
Git, Docker, Node.js, Python, PHP, Ruby on Railsといった流行りのツールが事前インストール済みなのです。
今回はRuby on Rails
とPostgreSQL
をつかって開発していきます。
cloud9のデフォルトではPostgreSQL
の準備が整ってないので、これを準備していきます。
cloud9のコンソール部分で下記のように入力してEnterしてみましょう。
sudo yum -y install postgresql postgresql-server postgresql-devel postgresql-contrib
下記のようにComplete!
と表示されればPostgreSQLのインストール成功です。
またec2-user:~/environment $
のようなほにゃらら $
という表示がされていれば、処理(成功でも失敗でも)完了を意味します。つまりほにゃらら $
が表示されるまでは待ちましょう。
※処理によって長く待たないといけないものもたくさんあります。
次にPostgreSQLを初期化、起動させます。
下記コマンドを打ち込みましょう。
sudo service postgresql initdb && sudo service postgresql start
つぎにec2-user
という名前でのPostgreSQLのデータベースを自由にコントロールできるユーザ(SUPERUSER)を作成します。
今後、データベースはRuby on Railsを経由して作成し、今回のRuby on Rails開発環境上のユーザの名前はec2-user
であるためです。
現段階ではあまり理解しなくて大丈夫です。
下記コマンドを打ち込みましょう。
sudo -u postgres psql
するとpostgres=#と表示され、その後ろに下記コマンドを打ち込みます。
CREATE USER "ec2-user" SUPERUSER;
次に下記コマンドを打ち込みます。
\q
これで開発環境構築は完了しました。
いよいよ開発です
cloud9のコンソール部分で下記のように入力してEnterしてみましょう。
rails new testapp -d postgresql
これはRuby on Railsの必要ファイルを自動生成するコマンドなのです。
※testapp
の部分はアプリ名です。好きなの何でもOK。
そのおかげで左のファイルツリーにはtestappディレクトリ内にたくさんのファイルが自動作成されました!
次にコンソール部分で下記のように入力してEnterしてみましょう。
cd testapp
先ほど作成したtestappディレクトリに移動するためのコマンドです。
おかげで$
の前の部分がec2-user:~/environment
→ec2-user:~/environment/testapp
に変化しています。
$
の前の部分は今自分がどこにいるかを表しているのです。
続いてコンソール部分で下記のように入力してEnterしてみましょう。
# これは「~/environment/testapp」で実行するコマンドです。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails g scaffold Blog title:string content:text
ブログ(Blog)に関するデータベースの領域を作成して、その領域にはタイトル(title)とコンテンツ(content)を保管できるようにしたい。そしてタイトルの保管容量は255文字以内(string)、テキストの保管容量はそれ以上(text)にしたい。
これはそのために必要なファイル群を一気に自動生成するコマンドなのです。
※どんなアプリを作りたいか?でBlog title:string content:text
の部分をカスタマイズするのです!
そしてコマンドを打った後に出てくるcreate ほにゃらら
のほにゃらら
が新たにファイルツリーに生成されていることが分かります。
続いてコンソール部分で下記のように入力してEnterしてみましょう。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails db:create db:migrate
これは、先ほどrails g scaffold....
のコマンドで自動生成されたファイルをもとに、実際にPostgreSQL内にデータベース領域を作成するための処理なのです。
じつはこれで一連の開発が完了しました。
そうです。完了したのです。
ではサーバを起動して完成形を見てみましょう。
コンソールで下記(サーバ起動コマンド)を実行します。
※今回サーバとなる``
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails s
コマンド実行結果の1行目にBooting Puma
とあります。
このPumaはWEBサーバの1つで、これは最初に実行したrails new testapp -d postgresql
のときにインストールされているのです。
この状態で、下記のようにメニューバーのPreviewからRunning Application Previewをクリックします。
その後、新たにでてくる画面のURL欄からURLをコピペします。
※URLはhttps://ここは人によってことなる.vfs.cloud9.ここは人によってことなる.amazonaws.com/
みたいな感じです。
でこのコピペしたURLの後ろに/blogs
とつけてブラウザで表示させてみましょう。
※つまりhttps://ここは人によってことなる.vfs.cloud9.ここは人によってことなる.amazonaws.com/blogs
というURLで検索です。
自由に触ってみてください。
そうです。すでにブログアプリが出来上がっているのです。
アプリをカスタマイズする
ではどうせならすこしアプリをカスタマイズしてみましょう!
機能面でのカスタマイズ
たとえば、本日の日付を表示させたいとしましょう。
まずはファイルツリーから/testapp/app/views/blogs/index.html.erb
をダブルクリックします。
この/app/views/blogs/index.html.erb
は/blogs
の画面部分を表現しているファイルです。
このファイルをいじることでカスタマイズ可能です。
例えば下記のように編集してみましょう。
※<h1>Blogs</h1>
の下に追記しています
※ 追記後はCtrl+S
で上書き保存しましょう
<p id="notice"><%= notice %></p>
<h1>Blogs</h1>
<!-- ここから下を追記 -->
<%= Time.now %>
<!-- ここから上を追記 -->
<table>
<thead>
<tr>
<th>Title</th>
<th>Content</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @blogs.each do |blog| %>
<tr>
<td><%= blog.title %></td>
<td><%= blog.content %></td>
<td><%= link_to 'Show', blog %></td>
<td><%= link_to 'Edit', edit_blog_path(blog) %></td>
<td><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Blog', new_blog_path %>
追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、時間が表示されます!
さらに<%= Time.now %>
を<%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %>
に変更してみましょう。
<p id="notice"><%= notice %></p>
<h1>Blogs</h1>
<!-- ここから下を追記 -->
<%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %>
<!-- ここから上を追記 -->
<table>
<!-- 以下省略 -->
そして追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、日付表示がカスタマイズされています!
さらにいじってみてもOKです。
デザイン面でのカスタマイズ
さらにデザインを変更してみましょう。
<%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %>
を
<div style="background-color:red;"><%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %></div>
に変更します。
<!-- 「<h1>Blogs</h1>」の下に追記しています -->
<!-- 追記後は「Ctrl+S」で上書き保存しましょう -->
<p id="notice"><%= notice %></p>
<h1>Blogs</h1>
<!-- ここから下を追記 -->
<div style="background-color:red;"><%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %></div>
<!-- ここから上を追記 -->
<table>
<!-- 以下省略 -->
追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、時間の部分が赤くなります!
さらにいじってみてもOKです。
こんなふうにして、
- 機能的な部分をカスタマイズしていくのがサーバサイドエンジニアの仕事
- 見た目的な部分をカスタマイズしていくのがプロントエンジニアの仕事
なのです。
ではいったんキリがないので休憩のためサーバを停止しましょう。
コンソールでCtrl
とC
の同時押しでサーバSTOPします。
すると下記のような感じで、元のコマンドを実行できる状態に戻ります。
全世界に公開する
そうです。気になっていますよね。
このブログアプリをどうやって全世界に公開するのか。
それを今からやっていきます。
アプリケーション側での公開準備
全世界公開に関しては主にインフラエンジニアの仕事ですが、一部サーバサイドエンジニアが行う仕事もあります。
それをいまからやっていきます。
まず/testapp/Gemfile
をファイルツリーから開き、
ファイルビューワーでそっくりそのまま下記のように書き換えてください。
source 'https://rubygems.org'
gem 'rails', '~> 5.0.0'
gem 'pg', '~> 0.18'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'unicorn', '5.4.1'
group :development, :test do
gem 'byebug', platform: :mri
end
group :development do
gem 'web-console'
gem 'listen', '~> 3.0.5'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
これは公開に必要なツール(Unicornというアプリケーションサーバ)を新たに追記するという作業です。
次にコンソールで下記コマンドを実行してください。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
# もしなっていなければ「cd ~/environment/testapp」と入力します
bundle install
これはGemfileに追記したもの(Unicornというアプリケーションサーバ)を実際にインストールするコマンドです。
でこんな感じになれば成功です。
つぎにUnicornというアプリケーションサーバの設定を行います。
まずは設定するためのファイルを新規に作成します。
ファイルツリーで/testapp/configディレクトリ
を右クリックしてNew Fileをクリック
名前をunicorn.rb
にします。
そして下記のように入力して保存しましょう。
※※Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築を参考にさせていただきました!
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true
listen "/var/www/testapp/tmp/sockets/unicorn.sock"
pid "/var/www/testapp/tmp/pids/unicorn.pid"
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
これはUnicornの通信プロセスの制御方法だったり、Unicornのログの出力場所だったりを設定しています。
なんとなく雰囲気だけ理解してればOKです。
カギ作成
今回のリリースではCloud9とGithub(後ほど設定)とAWS Lightsail(後ほど設定)の3つの環境を連携させながら全世界に公開します。
そのために各環境を高セキュリティで接続させるためのカギを作成します。
カンタンです。
コンソールで下記コマンドを実行してください。
ssh-keygen -t rsa
コマンド後入力画面がでてくるが全てエンターを実行する。
こんな感じ。
コンソールで下記コマンドを実行してください。
cat /home/ec2-user/.ssh/id_rsa.pub
このコマンドによって、
ssh-rsaではじまり数字をハイフンでつないだやつで終わる超長い文字列が表示されます。
すぐあとのGithub登録で使うのでコピペしておきましょう。
Github登録
今回はcloud9からGithubというソース管理サービスを経由してAWS Lightsail(後ほど設定)というサーバにソースコードを転送することでアプリを公開します。
そこでGithubに登録します。
まずは下記にアクセスしましょう。
https://github.com/join
ここでは$0の方を選んでContinue!
アンケートなのでいい感じに選択してSubmit
すると下記のような「メール来てますよ」と教えてくれる画面に行きます。
登録したメールアカウントで受信メール見るをみるとこんな感じのメールが来ています。
Verify email addressをクリックすると登録完了して下記の画面に遷移します。
真ん中ちょい右のStart a projectをクリック
すると下記の画面にいきます。
Repository nameに「testapp」と入力してCreate repositoryをクリック
これがtestappというアプリケーションのソースコードを収めるべきスペースです。
まだ何も入っていない状態です。
つぎにCloud9とGithubを連携させるべく、先ほどCloud9上で作ったカギをGithubにセットします。
下記にアクセスしましょう。
https://github.com/settings/keys
こんな感じです。右上のNew SSH keyをクリックします。
titleに「aws_cloud9」
keyにcat /home/ubuntu/.ssh/id_rsa.pub
で確認したカギ(ssh-rsaではじまりIPアドレスで終わる超長い文字列)
を入力します。
そしてAdd SSH keyをクリック。
これでGithub登録とCloud9との連携完了です!
Githubでのソースコードの公開
cloud9コンソールで下記コマンドを順に実行してください。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git init
git add .
git commit -m "first commit"
下記のようになれば成功です。(全ファイルが登録されてるので全ファイル名が処理結果として出力されます)
これは、
- testappディレクトリ以下のファイル群をGitというツールで管理スタートし(git init)、
- testappディレクトリ以下のどのファイルを対象にするかを決めて(git add . ※ドットは全ファイルを意味する)、
- 状態を確定させる(git commit -m "なにかメッセージ")
ということをしています。
そのあと、cloud9コンソールで下記コマンドを実行してください。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git remote add origin git@github.com:kakiuchis2/testapp.git
こんな感じで特になにも表示されませんが、
先ほどのGithubのkakiuchis2/testappリポジトリの場所をcloud9上に認識させたということです。
そのあと、cloud9コンソールで下記コマンドを実行してください。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git push origin master
途中でyesかnoか聞かれたら、yesと入力しましょう。
こんな感じになれば成功です。
これは「cloud9のtestappディレクトリ以下のファイル群」を「Githubのkakiuchis2/testappリポジトリ」にコピーしているのです。
では本当にうまくいったか確認しましょう。
Githubのトップページにアクセスします。
https://github.com/
左のkakiuchis2/testappをクリック!
※kakiuchis2
の部分はユーザ名なので人それぞれ異なります。
Cloud9と同じファイル構成がGithub上でも完成しています。
これでGithubでのソースコードの公開は完了です!
おおよそここまでがサーバサイドエンジニアの仕事です。
ここからインフラエンジニアの仕事にはいっていきます。
全世界公開用のサーバ環境を準備する
フロントエンドエンジニアとサーバサイドエンジニアのつくったソースコードを預かって、
それを全世界に公開までもっていくのがインフラエンジニアの担当部分です。
では早速やっていきましょう。
LightsailでOS作成
通常だとレンタルサーバと契約して、OSのイメージみたいなのを入手して、インストールして。。。
みたいな感じですがLightsailは超カンタン!
さっそくやっていきましょう。
まずAWSコンソールにアクセス
https://console.aws.amazon.com/console/home
そしてサービスを検索するの検索窓にlightsailと入力してクリック。
こんな感じです。
プラットフォーム→Linux/Unix
設計図→「OSのみ」、Amazon Linux
を選択します。
つぎにインスタンスのプラン選択→最初の1カ月無料である$3.50ドルのやつ
を選択します。
そしてインスタンスの作成をクリックすると下記画面に行きます。
これでLightsailでAmazonLinux作成が完了です!
Amazon Linuxへのアクセス
Amazon_Linux-512MB...の部分をクリックすると下記画面に行きます。
真ん中らへんのSSHを使用して接続
をクリックすると下記画面に行きます。
これでAmazon Linuxへのアクセス完了です。
インフラエンジニアはこの黒い画面(便宜上Lightsailのコンソールと呼ぶことにします)で仕事をしていくのです。
じつはこの画面はAmazon社が作った場所は秘密にされているどこかのサーバにリモートでアクセスしているのです。
そのサーバの一部を借りて、全世界にアプリを公開できるサービスがLightsailなのです。
Amazon Linuxの最初の準備
Cloud9とちがって本番環境のAmazon Linuxはなにも準備されていません。
自分で準備していくのです。
これがインフラエンジニアの仕事です。
さっそくいきましょう。
Lightsailコンソールで下記コマンドを実行してください。
sudo su -
これは権限をMAXにする行為です。
本来の仕事では危険なのであまり行いませんが、今回の適性診断ははスピード重視のため全コマンドをMAX権限で実行します。
つぎにLightsailコンソールで下記コマンドを実行してください。
yum -y update
これは、yum(ヤム)といういろんなソフトをインストールしたりアンインストールしたりするツールがあり、それをyum管理されているソフトウェアを最新状態にするという処理です。
あまり気にせず先に進みましょう。
つぎにLightsailコンソールで下記コマンドを実行してください。
yum -y install git
これはyumでGitをインストールする処理です。
先ほど開発のところでも登場したGitですが、
インフラでもGitを通じて、世界中のいろんな人が作ったものをコピーすることができるのです。
Rubyのインストール
では次にRubyをインストールしましょう。
RubyをインストールしないとRuby on Railsが使えないのです。
では行きましょう。
Lightsailコンソールで下記コマンドを実行してください。
git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
これはRubyのインストールを便利にするためのツールrbenvがgithubで公開されており、そのソースをAmazonLinuxの/usr/local/rbenv
ディレクトリにコピーしているのです。
つぎにLightsailコンソールで下記コマンドを実行してください。
vi /etc/profile.d/rbenv.sh
最初はなにも入力できない状態です。
そこでi
をタイプします。
すると左下に-- INSERT --と表示され、入力できる状態になります。
下記内容をコピペして張り付けましょう。
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
ただこのLightsailコンソールは直接のコピペができず、右下のノートマークを経由してコピペします。
そして黒い画面の文字のコピーはドラッグ、
張り付けるときは右クリックです。
そのあとESC
とタイプすると左下の-- INSERT --が消えて、入力できない状態になります。
入力できない状態で:wq
とタイプすると上書き保存されます。
※:q!
で保存せずに終了です。
こんな感じ。
このviコマンドでのファイル編集方法は今後も頻発するのでよく覚えておきましょう。
-
i
とESC
で入力モードと入力できないモードの切り替え - 入力できないモード状態で、
:wq
で上書き保存、:q!
で保存せずに終了
です!
この一連の処理は、PCでいう環境変数の設定のようなもので、rbenvを用いたコマンドをどこからでも実行可能にする処理をコピペしたのです。
つぎにLightsailコンソールで下記コマンドを実行してください。
source /etc/profile.d/rbenv.sh
とくになにも起こりませんが、先ほど作成した/etc/profile.d/rbenv.sh
ファイルの読み込みをおこなったイメージです。
読み込みを行わないと設定が反映されないのです。
ではちゃんとrbenvがインストールされたか確認してみます。
Lightsailコンソールで下記コマンドを実行してください。
rbenv --version
つぎにLightsailコンソールで下記コマンドを実行してください。
git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build
これもruby-buildというRubyインストールに必要なツールをGithubからAmazonLinuxの/usr/local/rbenv/plugins/ruby-buildディレクトリ
にコピーする処理です。
では次にRubyのインストールに必要なその他ツールを一気にインストールしていきます。
Lightsailコンソールで下記コマンドを順に実行してください。
yum -y groupinstall "Development Tools"
yum -y install gcc72-c++.x86_64 glibc-headers openssl-devel readline libyaml-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel mysql-devel readline-devel
問題なければ最後にComplete!と表示されるはずです。
ではようやく本題のRubyのインストールに移ります。
Cloud9と同じバージョンのRubyをインストールするのが良いので、まずはそれを調べます。
cloud9コンソールで下記コマンドを実行してください。
ruby -v
ではAmazonLinuxでもRuby2.6.0をインストールします。
Lightsailコンソールで下記コマンドを実行してください。
rbenv install 2.6.0
つぎにLightsailコンソールで下記コマンドを順に実行してください。
rbenv global 2.6.0
rbenv rehash
ruby -v
これは使用するRubyのバージョンを変更し、その結果ちゃんとRuby2.6.0がセットされたか確認する処理です。
問題なく最後に2.6.0とでたら成功です。
こんな感じです。
これでRubyインストール完了です。
大変ですね。Cloud9の便利さがよくわかります。
本番環境だけでなく、自力で開発環境構築するには、この処理が必要になるのです。
bundlerのインストール
Ruby on Railsでの開発のとき、bundle install
って使いましたよね。
WEBサーバのPumaとか(その他本当にたくさん)インストールしてくれるコマンド。
このコマンドを使えるようにするためにbundlerをインストールする必要があります。
Lightsailコンソールで下記コマンドを実行してください。
gem install bundler
これでbundlerのインストール完了です。
PostgreSQLのインストールと設定
Cloud9でもインストールしましたね。
同じように本番環境でもインストールします!
Lightsailコンソールで下記コマンドを実行してください。
yum -y install postgresql94 postgresql94-server postgresql94-devel postgresql94-contrib postgresql94-docs
最後にComlplete!と表示されたらOKです。
これらはPostgreSQLで必要な各種ツールをインストールしています。
次にLightsailコンソールで下記コマンドを順に実行してください。
/etc/init.d/postgresql94 initdb
/etc/init.d/postgresql94 start
これはPostgreSQLの初期化と起動のイメージです。
次にviコマンドで/var/lib/pgsql94/data/postgresql.conf
を編集しましょう。
Lightsailコンソールで下記コマンドを実行してください。
vi /var/lib/pgsql94/data/postgresql.conf
そして/var/lib/pgsql94/data/postgresql.conf
を下記のように編集します。
大項目が次のように並んでいる巨大ファイルです。
- FILE LOCATIONS
- CONNECTIONS AND AUTHENTICATION
- RESOURCE USAGE (except WAL)
- WRITE AHEAD LOG
- REPLICATION
- QUERY TUNING
- ERROR REPORTING AND LOGGING
- RUNTIME STATISTICS
- AUTOVACUUM PARAMETERS
- CLIENT CONNECTION DEFAULTS
- LOCK MANAGEMENT
- VERSION/PLATFORM COMPATIBILITY
- ERROR HANDLING
- CONFIG FILE INCLUDES
- CUSTOMIZED OPTIONS
2つめのCONNECTIONS AND AUTHENTICATIONを編集します。
デフォルトは下記のようになっています。
# 以上省略
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
#port = 5432 # (change requires restart)
# 以上省略
これを以下のように編集します。
変更点は次の2点です。
-
#listen_addresses = 'localhost'
→listen_addresses = '*'
-
#port = 5432
→port = 5432
# 以上省略
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5432 # (change requires restart)
# 以上省略
これはPostgreSQLへのアクセスできる条件の緩和をおこない、またPostgreSQLの使用するポート番号というものを有効化させる変更にあたります。
あまり気にせず、つぎに進みましょう。
次にviコマンドで/var/lib/pgsql94/data/pg_hba.conf
を編集しましょう。
Lightsailコンソールで下記コマンドを実行してください。
vi /var/lib/pgsql94/data/pg_hba.conf
そして/var/lib/pgsql94/data/pg_hba.conf
を下記のように編集します。
※/var/lib/pgsql94/data/pg_hba.conf
の一番下のほうの部分です。
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
# local all all peer
# IPv4 local connections:
# host all all 127.0.0.1/32 ident
# IPv6 local connections:
# host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
# local replication postgrespeer
# host replication postgres127.0.0.1/32ident
# host replication postgres ::1/128 ident
local all all trust
host all all 0.0.0.0/0 md5
これはどの環境からそのデータベースにどのユーザがどの認証方式をつかってアクセスできるかを指定しています。
まあ、気にせず、次に進みましょう。
つぎにLightsailコンソールで下記コマンドを実行してください。
/etc/init.d/postgresql94 restart
これはPostgreSQLの再起動で、今まで編集したファイルを反映させる処理です。
つぎにec2-user
という名前でのPostgreSQLのデータベースを自由にコントロールできるユーザ(SUPERUSER)を作成します。
今後、データベースはRuby on Railsを経由して作成し、今回のRuby on Rails開発環境上のユーザの名前はec2-user
であるためです。
現段階ではあまり理解しなくて大丈夫です。
下記コマンドを打ち込みましょう。
つぎにLightsailコンソールで下記コマンドを実行してください。
psql -U postgres
するとpostgres=#と表示され、その後ろに下記コマンドを打ち込みます。
CREATE ROLE "root" WITH SUPERUSER LOGIN;
CREATE ROLE "testapp" WITH SUPERUSER LOGIN;
CREATE DATABASE "testapp_production";
\q
そしてLightsailコンソールで下記コマンドを実行してください。
/etc/init.d/postgresql94 restart
この処理は、rootとtestappという名前でのPostgreSQLのデータベースを自由にコントロールできるユーザ(SUPERUSER)を作成し、testapp_productionという名前のデータベースを作成しています。
これは今Lightsailで使用しているユーザ名や導入するRuby on Railsの仕様にそった処理となります。
そしてそのあとにPostgreSQLを再起動して追加したユーザやデータベースを読み込みます。
あまり気にせず、つぎに進みましょう。
Nginxのインストールと設定
つぎにNginxというWEBサーバをインストールします。
Cloud9環境ではPumaというWEBサーバを利用していましたが、AmazonLinux環境ではNginxというWEBサーバとUnicornというアプリケーションサーバを利用します。
※それぞれメリットデメリットがあるらしいですが、難しいので私は分かりません。公開するということが目的で、かつ参考になる記事数を鑑みて、AmazonLinux環境ではNginxとUnicornという構成を選択しました。
では細かいこと気にせず早速Nginxをインストールしていきましょう。
Lightsailコンソールで下記コマンドを実行してください。
yum -y install nginx
最後にComplete!と表示されればインストール成功です。
次にLightsailコンソールで下記コマンドを実行してください。
chkconfig nginx on
/etc/init.d/nginx start
これはNginxが自動で起動するよう設定とNginxの起動処理です。
ではLightsailのOS詳細画面(下記の画面)の下の方のパブリックIPの数字を確認し、ブラウザのURL欄に入力してみてください。
Nginxのインストールと起動が問題なければこのように表示されます。
次にviコマンドで/etc/nginx/conf.d/testapp.conf
を新規作成+カスタマイズしましょう。
※viコマンドはその後ろに存在しないファイルを指定すると新規作成+編集ができるのです。
Lightsailコンソールで下記コマンドを実行してください。
vi /etc/nginx/conf.d/testapp.conf
そして/etc/nginx/conf.d/testapp.conf
を下記のように作成します。
※ただし7行目のIPアドレスは各個人でことなります。
※先ほど調べたLightsailのOS詳細画面(下記の画面)の下の方のパブリックIPの数字を入力しましょう。
※Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築を参考にさせていただきました!
upstream unicorn {
server unix:/var/www/testapp/tmp/sockets/unicorn.sock;
}
server {
listen 80;
server_name 13.231.62.63;
access_log /var/log/nginx/testapp_access.log;
error_log /var/log/nginx/testapp_error.log;
root /var/www/testapp;
location ~ ^/assets/ {
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}
Nginxは/etc/nginx/conf.dconf.dディレクトリ
に●●●.conf
を作成すると、起動時に読み込んでくれます。
一般的にはアプリ名.conf
として作成するので今回はtestapp.conf
という名前のファイルを作成しました。
またその中で主に下記の設定を書いています。
- NginxがUnicornと連動する上で必要なプロセスやホストやポートの連携ファイルの設定
- Nginxのポート番号や使うサーバIPアドレスやトップページやエラーログ保管場所の設定
次にLightsailコンソールで下記コマンドを実行してください。
nginx -s reload
こんな感じでなにも起こりませんが、Nginxが再起動し、testapp.conf
の設定が読み込まれます。
全世界公開用のサーバでGithub公開ソースコードをもとに公開する
いよいよ終わりが見えてきました。
それではGithubで公開しているソースコードをAmazonLinuxに入れ込んで、アプリを起動して公開していきましょう。
GithubからAmazonLinuxにソースコードを入れる
まずはGithubからAmazonLinuxにソースコードを入れていきます。
Githubにアクセス
https://github.com/
この画面の右上の緑色のClone or Downloadをクリックすると、
https://github.com/xxxx/yyyy.git
というURLが出てきます。
※xxxxはGuthub登録ユーザ名でyyyyはリポジトリ名なので皆さん異なります。
そしてLightsailコンソールで下記コマンドを実行してください。
git clone https://github.com/xxxx/yyyy.git /var/www/testapp
これでGithubで公開しているソースコードがAmazonLinuxの/var/www/testappディレクトリ
にコピーされました。
※つまり公開されているコードは全世界の人たちに使ってもらえるのです!
ただし一部Githubの状態から変更しておきべき場所があります。
まずcloud9のコンソール部分で下記のように入力してEnterしてみましょう。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
bundle exec rake secret
この出てきた乱数をコピペしておきます。
つぎにLightsailコンソールで下記コマンドを実行してください。
vi /var/www/testapp/config/secrets.yml
で/var/www/testapp/config/secrets.yml
を下記のように編集します。
※<%= ENV["SECRET_KEY_BASE"] %>
の部分に先ほどの乱数をコピペします。
# 以上省略
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
この乱数はセキュリティレベルを上げるためのランダムな文字列です。
通常だとcloud9上で修正してAmazonLinuxにコピーしますが、そうするとGithubに公開されてしまうので、AmazonLinux内で直接編集しています。
AmazonLinux上でアプリを起動させる
最後の一押しです。
ソースコードが入ったので、あとは起動させましょう。
Lightsailコンソールで下記コマンドを実行して、ソースコードをいれたディレクトリに移動します。
cd /var/www/testapp
次にLightsailコンソールで下記コマンドを実行してください。
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
bundle install
もし下記のようなエラーが発生したら/var/www/testappディレクトリ
でgem install nokogiri -v '1.10.3'
を実行した後で再度bundle install
を実行してみてください。
もし下記のようなエラーが発生したら/var/www/testappディレクトリ
でgem install pg -v '0.21.0'
を実行した後で再度bundle install
を実行してみてください。
これはCloud9環境でも行った必要なRuby on Railsの起動に必要な各種パッケージをインストールする処理です。
次にLightsailコンソールで下記コマンドを実行してください。
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
rake db:migrate RAILS_ENV=production
これはCloud9環境でも行いましたが、Ruby on Railsの特定のファイルの情報に基づいてデータベースの状態をカスタマイズしている処理です。
次にLightsailコンソールで下記コマンドを実行してください。
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
こんな感じでなんも起こりませんがUnicornが起動開始した状態になります。
では全世界に公開されたWEBサイトを見てみましょう。
LightsailのOS詳細画面(下記の画面)の下の方のパブリックIPの数字を確認し、ブラウザのURL欄にxx.xx.xx.xx/blogs
と入力してみてください。
すべての処理がうまくいっていれば下記のような感じで全世界に公開されている状態になります。
終了です。お疲れ様でした!!!
診断
では診断を行います。
下記のなかでどの箇所が一番没入できましたか?もっとも没入したものを1つ選んでください。
没入とは、のめり込んで周りが見えなくなるくらい集中している状態です。
※楽しいとか面白いという感情とは異なります。
- AWSアカウントの作成
- Cloud9準備
- Cloud9で開発環境構築(ちなみに一瞬でカンタンです)
- いよいよ開発です
- 機能面でのカスタマイズ
- デザイン面でのカスタマイズ
- アプリケーション側での公開準備
- カギ作成
- Github登録
- Githubでのソースコードの公開
- LightsailでOS作成
- AmazonLinuxへのアクセス
- AmazonLinuxの最初の準備
- Rubyのインストール
- bundlerのインストール
- PostgreSQLのインストールと設定
- Nginxのインストールと設定
- GithubからAmazonLinuxにソースコードを入れる
- AmazonLinux上でアプリを起動させる
- では全世界に公開されたWEBサイトを見てみましょう
診断結果
転職、就職にかかわらず仕事選びで失敗しない要素の一つに没入できるかという要素があります。
没入できた部分がどのエンジニアポジションの仕事か?
以下で没入したひとはサーバサイドエンジニアを選択すると失敗する可能性が低いです。
- いよいよ開発です
- 機能面でのカスタマイズ
- アプリケーション側での公開準備
とくに機能面でのカスタマイズで勝手にカスタマイズし始めたり、ソースコードをいじって検証とか、このキットで記載していないファイルを眺めたりしている人はドンピシャです。
以下で没入したひとはサーバサイドエンジニアを選択すると失敗する可能性が低いです。
- Cloud9で開発環境構築(ちなみに一瞬でカンタンです)
- カギ作成
- AmazonLinuxへのアクセス
- AmazonLinuxの最初の準備
- Rubyのインストール
- bundlerのインストール
- PostgreSQLのインストールと設定
- Nginxのインストールと設定
- GithubからAmazonLinuxにソースコードを入れる
- AmazonLinux上でアプリを起動させる
以下で没入したひとはフロントエンドエンジニアを選択すると失敗する可能性が低いです。
- デザイン面でのカスタマイズ
とくにデザイン面でのカスタマイズでデザインをいじり続けてすごい時間が過ぎてしまったみたいな人はドンピシャです。
以下で没入したひとは、その他の可能性を秘めていると思います。今回は診断範囲から外れてしまいます。すみません!
- AWSアカウントの作成
- Cloud9準備
- Github登録
- Githubでのソースコードの公開
- LightsailでOS作成
- では全世界に公開されたWEBサイトを見てみましょう
最後の片づけ
今回の1DAYキットでの使用でレベルですと、
AWSのcloud9は1年後課金対象に、Lightsailは1カ月後課金対象になります。
※2019/5/5時点の情報
そのため、課金されたくない場合は下記手順にしたがってサービスを停止しましょう。
こちらにアクセスします。
https://lightsail.aws.amazon.com/ls/webapp/home/instances
削除したいOSの部分の右の方の縦3点の部分をクリックして削除します。
こんな感じです。
つぎはこちらにアクセスします。
https://us-east-2.console.aws.amazon.com/cloud9/home
削除したいCloud9開発環境をクリックして削除します。
こんな感じ。
これで大丈夫です。また作りましょう!
参考文献
とても参考になりました!ありがとうございます!!
CentOSにrbenv, Rubyをインストールする
unicornがエラーで起動しなくて困った
Rails + unicorn + nginx でWeb Serverを起動させるときにはまった話。
Amazon Linux上でRails新規プロジェクトを作成すると、bundle installで落ちる
Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築