自分はどのエンジニアに向いている？エンジニア適性診断１DAYキット

## 背景

エンジニア新人～初心者の皆さんから「自分はどんなエンジニアの仕事に向いているかわからない。。。」という声をよく聞きます。

**そこでエンジニア適性診断１DAYキットを作成しました。**

**ゼロの状態からアプリの公開まで**の仕事の中には、フロントエンドエンジニアの仕事もサーバサイドエンジニアの仕事もインフラエンジニアの仕事も含まれています。

そこで、一度**ゼロの状態からアプリの公開まで**を体験してみるのが良いと考えました。
下記の流れに沿って体験し、最後の**診断結果**を目安にしていただければうれしい限りです！




## 全体の流れ

以下の順番ですすめていきます。

1. AWSアカウントの作成
1. Cloud9準備
1. Cloud9で開発環境構築（ちなみに一瞬でカンタンです）
1. いよいよ開発です
1. 機能面でのカスタマイズ
1. デザイン面でのカスタマイズ
1. アプリケーション側での公開準備
1. カギ作成
1. Github登録
1. Githubでのソースコードの公開
1. LightsailでOS作成
1. AmazonLinuxへのアクセス
1. AmazonLinuxの最初の準備
1. Rubyのインストール
1. bundlerのインストール
1. PostgreSQLのインストールと設定
1. Nginxのインストールと設定
1. GithubからAmazonLinuxにソースコードを入れる
1. AmazonLinux上でアプリを起動させる
1. では全世界に公開されたWEBサイトを見てみましょう

## Cloud9で開発準備

みなさん開発エディタにSublimeTextとかAtomとかサクラエディタとか使っているかと思います。
ここではAWSのサービスの1つである**Cloud9**を使います。
**Cloud9**は開発環境構築が超カンタン、かつ、ブラウザ上で開発可能なスーパーエディタなのです。

### AWSアカウントの作成

まずは**Cloud9**を利用する前にAWSのアカウントを作成します。

https://aws.amazon.com/jp/
にアクセス（下記画面）
[![Image from Gyazo](https://i.gyazo.com/05e47713e09f2a117aeb1579c45754b1.png)](https://gyazo.com/05e47713e09f2a117aeb1579c45754b1)

右上の`無料サインアップ`か真ん中ちょい左の`今すぐ無料サインアップ`をクリック
すると下記画面にいきます。
[![Image from Gyazo](https://i.gyazo.com/2b3a9701d10b13fe58b1152ba2539eda.png)](https://gyazo.com/2b3a9701d10b13fe58b1152ba2539eda)

流れにそって下記情報を入力していきます。

- メールアドレス
- パスワード
- 個人情報（氏名、生年月日、住所など）
- クレジットカード情報

**クレジットカードはビビりますがAWS無料枠の範囲内だと料金発生しませんので、その範囲内で進めていきますよ！**
※2019/5/5時点で本Kitのレベルで1ヶ月以内のサービス利用であれば課金されないことを確認しています。

登録完了したら下記画面にたどり着きます。
[![Image from Gyazo](https://i.gyazo.com/852383f43925ae9c900ce4348ed64ca0.png)](https://gyazo.com/852383f43925ae9c900ce4348ed64ca0)

もちろん**無料**の**ベーシックプラン**を選択
すると下記画面が表示されます。
[![Image from Gyazo](https://i.gyazo.com/4c7da1b78c87d87598bf92640c8b1f36.png)](https://gyazo.com/4c7da1b78c87d87598bf92640c8b1f36)

ほぼ同タイミングで登録したメールアドレス宛にこんなメールも来ます。
[![Image from Gyazo](https://i.gyazo.com/e653578da84254f53a1a29c8a8792f40.png)](https://gyazo.com/e653578da84254f53a1a29c8a8792f40)

これでAWSアカウントの作成完了。

### Cloud9準備

つぎにCloud9を使う準備をしていきます。

https://console.aws.amazon.com/console/home
にアクセス（下記画面）
[![Image from Gyazo](https://i.gyazo.com/e72b5a544e056bf5fe4da8acc85000a5.png)](https://gyazo.com/e72b5a544e056bf5fe4da8acc85000a5)

さっき登録したアカウントでサインインすると下記のような画面にいきます。
[![Image from Gyazo](https://i.gyazo.com/075d5cec4bf38020f48096ffa4f59c09.png)](https://gyazo.com/075d5cec4bf38020f48096ffa4f59c09)

左上の**サービスを検索する**の検索窓に`cloud9`と入力してクリック
すると若干いかつめなこんなページに行きます。
[![Image from Gyazo](https://i.gyazo.com/60d768f78949009657e821c77cf669f9.png)](https://gyazo.com/60d768f78949009657e821c77cf669f9)

真ん中ちょい右のオレンジの**Create environment**をクリックするとこんな画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/f7410ede0509133519ccfc99405b121a.png)](https://gyazo.com/f7410ede0509133519ccfc99405b121a)

**Name**→開発環境の名前（なんでもOK）
**Description**→その開発環境の説明（なんでもOK）

を入力して**Next step**
するとこんな画面に行きます。

[![Image from Gyazo](https://i.gyazo.com/5ee5ad058bef38b751dab0c48b6f0af7.png)](https://gyazo.com/5ee5ad058bef38b751dab0c48b6f0af7)

このあたりは「どのAWSサービスを使いますか？」とか「どんなOSを使いますか？」的なセッティングですが全部デフォルトのまま進めます。

すると下記のような確認画面がでてくるので**Create environment**
[![Image from Gyazo](https://i.gyazo.com/e80d30edda90e881adb3bf3b99ac4328.png)](https://gyazo.com/e80d30edda90e881adb3bf3b99ac4328)

こんな画面になります
[![Image from Gyazo](https://i.gyazo.com/f87090fe9361495dc5f5aba78fe9924d.png)](https://gyazo.com/f87090fe9361495dc5f5aba78fe9924d)

これでCloud9準備完了です！
また下記のようにそれぞれの部分を呼ぶことにします。

- 赤の部分→ファイルツリー
- 緑の部分→ファイルビューワー
- 青の部分→コンソール

### Cloud9で開発環境構築（ちなみに一瞬でカンタンです）

じつはすでにほぼ完了しています。
Git, Docker, Node.js, Python, PHP, Ruby on Railsといった流行りのツールが事前インストール済みなのです。

今回は`Ruby on Rails`と`PostgreSQL`をつかって開発していきます。
cloud9のデフォルトでは`PostgreSQL`の準備が整ってないので、これを準備していきます。

cloud9のコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
sudo yum -y install postgresql postgresql-server postgresql-devel postgresql-contrib
```

こんな感じになります。
[![Image from Gyazo](https://i.gyazo.com/fb244c015e994f9aea01df7f20c2057e.png)](https://gyazo.com/fb244c015e994f9aea01df7f20c2057e)

下記のように`Complete!`と表示されればPostgreSQLのインストール成功です。
[![Image from Gyazo](https://i.gyazo.com/097f5042d9cff8e51a0a566c9ac881fc.png)](https://gyazo.com/097f5042d9cff8e51a0a566c9ac881fc)

また`ec2-user:~/environment $`のような`ほにゃらら $`という表示がされていれば、処理（成功でも失敗でも）完了を意味します。つまり`ほにゃらら $`が表示されるまでは待ちましょう。
※処理によって長く待たないといけないものもたくさんあります。

次にPostgreSQLを初期化、起動させます。
下記コマンドを打ち込みましょう。

```【cloud9コンソール】.
sudo service postgresql initdb && sudo service postgresql start
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/87405827e3b5e9c59850f1f108aa481a.png)](https://gyazo.com/87405827e3b5e9c59850f1f108aa481a)

つぎに`ec2-user`という名前でのPostgreSQLのデータベースを自由にコントロールできるユーザ（SUPERUSER）を作成します。
今後、データベースはRuby on Railsを経由して作成し、今回のRuby on Rails開発環境上のユーザの名前は`ec2-user`であるためです。
現段階ではあまり理解しなくて大丈夫です。
下記コマンドを打ち込みましょう。

```【cloud9コンソール】.
sudo -u postgres psql
```

すると**postgres=#**と表示され、その後ろに下記コマンドを打ち込みます。

```【cloud9コンソール】.
CREATE USER "ec2-user" SUPERUSER;
```

次に下記コマンドを打ち込みます。

```【cloud9コンソール】.
\q
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/4d55dc1387bef0df3e0acb3b5c876f1f.png)](https://gyazo.com/4d55dc1387bef0df3e0acb3b5c876f1f)

これで開発環境構築は完了しました。

## いよいよ開発です

cloud9のコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
rails new testapp -d postgresql
```

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/d998cc8578be9789ee057126bd61e6ed.png)](https://gyazo.com/d998cc8578be9789ee057126bd61e6ed)

処理をまって、こんな感じになれば成功です。
[![Image from Gyazo](https://i.gyazo.com/296557d6f10fe296d56d13e4a0c85bde.png)](https://gyazo.com/296557d6f10fe296d56d13e4a0c85bde)

これはRuby on Railsの必要ファイルを自動生成するコマンドなのです。
※`testapp`の部分はアプリ名です。好きなの何でもOK。

そのおかげで左のファイルツリーには**testappディレクトリ内**にたくさんのファイルが自動作成されました！
[![Image from Gyazo](https://i.gyazo.com/f8bbc5096dac1a04bf971b90b8909699.png)](https://gyazo.com/f8bbc5096dac1a04bf971b90b8909699)


次にコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
cd testapp
```

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/346350a53f846b26b688ce7ef564db16.png)](https://gyazo.com/346350a53f846b26b688ce7ef564db16)

先ほど作成したtestappディレクトリに移動するためのコマンドです。
おかげで`$`の前の部分が`ec2-user:~/environment`→`ec2-user:~/environment/testapp`に変化しています。
`$`の前の部分は今自分がどこにいるかを表しているのです。

続いてコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
# これは「~/environment/testapp」で実行するコマンドです。
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails g scaffold Blog title:string content:text
```

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/7cf169f3ef23d418ef32b773ec91edd8.png)](https://gyazo.com/7cf169f3ef23d418ef32b773ec91edd8)

ブログ（Blog）に関するデータベースの領域を作成して、その領域にはタイトル（title）とコンテンツ（content）を保管できるようにしたい。そしてタイトルの保管容量は255文字以内（string）、テキストの保管容量はそれ以上（text）にしたい。
これはそのために必要なファイル群を一気に自動生成するコマンドなのです。
※どんなアプリを作りたいか？で`Blog title:string content:text`の部分をカスタマイズするのです！

そしてコマンドを打った後に出てくる`create ほにゃらら`の`ほにゃらら`が新たにファイルツリーに生成されていることが分かります。

[![Image from Gyazo](https://i.gyazo.com/4093e01567211f4a6681eaeef71d95fd.png)](https://gyazo.com/4093e01567211f4a6681eaeef71d95fd)

続いてコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails db:create db:migrate
```

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/dbde1f8b0b0aaaa331c1237f2af68aac.png)](https://gyazo.com/dbde1f8b0b0aaaa331c1237f2af68aac)

これは、先ほど`rails g scaffold....`のコマンドで自動生成されたファイルをもとに、実際にPostgreSQL内にデータベース領域を作成するための処理なのです。

じつはこれで一連の開発が完了しました。
そうです。完了したのです。

ではサーバを起動して完成形を見てみましょう。
コンソールで下記（サーバ起動コマンド）を実行します。
※今回サーバとなる``

```【cloud9コンソール】.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
# もしなっていなければ「cd ~/environment/testapp」と入力します
rails s
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/965f9f74a238942d02d58af93a28b65a.png)](https://gyazo.com/965f9f74a238942d02d58af93a28b65a)

コマンド実行結果の1行目に`Booting Puma`とあります。
この**Puma**はWEBサーバの1つで、これは最初に実行した`rails new testapp -d postgresql`のときにインストールされているのです。

この状態で、下記のようにメニューバーのPreviewからRunning Application Previewをクリックします。
その後、新たにでてくる画面のURL欄からURLをコピペします。
※URLは`https://ここは人によってことなる.vfs.cloud9.ここは人によってことなる.amazonaws.com/`みたいな感じです。
[![Image from Gyazo](https://i.gyazo.com/3b0f64d71e0d389aa8a47a161003799a.gif)](https://gyazo.com/3b0f64d71e0d389aa8a47a161003799a)

でこのコピペしたURLの後ろに`/blogs`とつけてブラウザで表示させてみましょう。
※つまり`https://ここは人によってことなる.vfs.cloud9.ここは人によってことなる.amazonaws.com/blogs`というURLで検索です。

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/308b70a168b4caf9c06c5b8ebca6fcd6.png)](https://gyazo.com/308b70a168b4caf9c06c5b8ebca6fcd6)

自由に触ってみてください。
そうです。すでにブログアプリが出来上がっているのです。

## アプリをカスタマイズする

ではどうせならすこしアプリをカスタマイズしてみましょう！

### 機能面でのカスタマイズ

たとえば、本日の日付を表示させたいとしましょう。
まずはファイルツリーから`/testapp/app/views/blogs/index.html.erb`をダブルクリックします。

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/18441bf3b0d082a0acbaa7d5d85a5a89.gif)](https://gyazo.com/18441bf3b0d082a0acbaa7d5d85a5a89)

この`/app/views/blogs/index.html.erb`は`/blogs`の画面部分を表現しているファイルです。
このファイルをいじることでカスタマイズ可能です。

例えば下記のように編集してみましょう。
※`<h1>Blogs</h1>`の下に追記しています
※ 追記後は`Ctrl+S`で上書き保存しましょう

```/testapp/app/views/blogs/index.html.erb

<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 %>
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/3993ef296a010b6c8a2ee2560f70ccf0.png)](https://gyazo.com/3993ef296a010b6c8a2ee2560f70ccf0)

追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、時間が表示されます！
[![Image from Gyazo](https://i.gyazo.com/8738c10e210bd93177076764858f12a7.png)](https://gyazo.com/8738c10e210bd93177076764858f12a7)

さらに`<%= Time.now %>`を`<%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %>`に変更してみましょう。

```/testapp/app/views/blogs/index.html.erb
<p id="notice"><%= notice %></p>

<h1>Blogs</h1>

<!-- ここから下を追記 -->
<%= Time.now.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒") %>
<!-- ここから上を追記 -->

<table>
<!-- 以下省略 -->
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/9386ada565c5c304a8042db02ed8c444.png)](https://gyazo.com/9386ada565c5c304a8042db02ed8c444)

そして追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、日付表示がカスタマイズされています！
[![Image from Gyazo](https://i.gyazo.com/3f6f85bfbfcab32a9ed8f54823ca5e03.png)](https://gyazo.com/3f6f85bfbfcab32a9ed8f54823ca5e03)

さらにいじってみても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>`に変更します。

```/testapp/app/views/blogs/index.html.erb
<!-- 「<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>
<!-- 以下省略 -->
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/42334e07d48330268e051d143904035a.png)](https://gyazo.com/42334e07d48330268e051d143904035a)

追記上書きが完了したら、先ほどのアプリの画面で更新ボタンをおします。
すると下記みたく、時間の部分が赤くなります！
[![Image from Gyazo](https://i.gyazo.com/1ec736306e9908376ba3328716110854.png)](https://gyazo.com/1ec736306e9908376ba3328716110854)

さらにいじってみてもOKです。

こんなふうにして、

- 機能的な部分をカスタマイズしていくのがサーバサイドエンジニアの仕事
- 見た目的な部分をカスタマイズしていくのがプロントエンジニアの仕事

なのです。

ではいったんキリがないので休憩のためサーバを停止しましょう。
コンソールで`Ctrl`と`C`の同時押しでサーバSTOPします。

すると下記のような感じで、元のコマンドを実行できる状態に戻ります。
[![Image from Gyazo](https://i.gyazo.com/f4da5a637f4764b3ec8cd2e87cb42d8f.png)](https://gyazo.com/f4da5a637f4764b3ec8cd2e87cb42d8f)

## 全世界に公開する

そうです。気になっていますよね。
このブログアプリをどうやって全世界に公開するのか。
それを今からやっていきます。

### アプリケーション側での公開準備

全世界公開に関しては主にインフラエンジニアの仕事ですが、一部サーバサイドエンジニアが行う仕事もあります。
それをいまからやっていきます。

まず`/testapp/Gemfile`をファイルツリーから開き、
ファイルビューワーでそっくりそのまま下記のように書き換えてください。

```/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というアプリケーションサーバ）を新たに追記するという作業です。
次にコンソールで下記コマンドを実行してください。

```cloud9コンソール.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
# もしなっていなければ「cd ~/environment/testapp」と入力します
bundle install
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/4b98e6f8907435f6c623090284f69702.png)](https://gyazo.com/4b98e6f8907435f6c623090284f69702)

これはGemfileに追記したもの（Unicornというアプリケーションサーバ）を実際にインストールするコマンドです。
でこんな感じになれば成功です。
[![Image from Gyazo](https://i.gyazo.com/6db0b26218cdbdefb1c15a55fd351ec4.png)](https://gyazo.com/6db0b26218cdbdefb1c15a55fd351ec4)

つぎにUnicornというアプリケーションサーバの設定を行います。
まずは設定するためのファイルを新規に作成します。
ファイルツリーで`/testapp/configディレクトリ`を右クリックして**New File**をクリック
名前を`unicorn.rb`にします。

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/b7d51c7c3e0173d716fc1a6ebb561d1b.gif)](https://gyazo.com/b7d51c7c3e0173d716fc1a6ebb561d1b)

そして下記のように入力して保存しましょう。
※※[Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築](https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23)を参考にさせていただきました！

```/testapp/config/unicorn.rb
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つの環境を連携させながら全世界に公開します。
そのために各環境を高セキュリティで接続させるためのカギを作成します。
カンタンです。

コンソールで下記コマンドを実行してください。

```cloud9コンソール.
ssh-keygen -t rsa
```

コマンド後入力画面がでてくるが全てエンターを実行する。
こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/ced97f65d013eb76e35d9f7b61602432.png)](https://gyazo.com/ced97f65d013eb76e35d9f7b61602432)

コンソールで下記コマンドを実行してください。

```cloud9コンソール.
cat /home/ec2-user/.ssh/id_rsa.pub
```

このコマンドによって、
**ssh-rsaではじまり数字をハイフンでつないだやつで終わる**超長い文字列が表示されます。
すぐあとのGithub登録で使うのでコピペしておきましょう。

### Github登録

今回は**cloud9**から**Github**というソース管理サービスを経由して**AWS Lightsail（後ほど設定）**というサーバにソースコードを転送することでアプリを公開します。

そこで**Github**に登録します。
まずは下記にアクセスしましょう。
https://github.com/join

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/4f73afca0b300b404d50148bcf96fccd.png)](https://gyazo.com/4f73afca0b300b404d50148bcf96fccd)

各項目を入力して進みます。
[![Image from Gyazo](https://i.gyazo.com/cd917786445225c95c84bb1a5761d23a.png)](https://gyazo.com/cd917786445225c95c84bb1a5761d23a)

ここでは**$0**の方を選んでContinue！

[![Image from Gyazo](https://i.gyazo.com/52106636feb9ac25d3f5ca0c13466889.png)](https://gyazo.com/52106636feb9ac25d3f5ca0c13466889)

アンケートなのでいい感じに選択してSubmit
すると下記のような「メール来てますよ」と教えてくれる画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/febd6814618160dff72a3113f6e7595e.png)](https://gyazo.com/febd6814618160dff72a3113f6e7595e)

登録したメールアカウントで受信メール見るをみるとこんな感じのメールが来ています。
[![Image from Gyazo](https://i.gyazo.com/48117ea16b57de99a0ae039c8a1e1595.png)](https://gyazo.com/48117ea16b57de99a0ae039c8a1e1595)

Verify email addressをクリックすると登録完了して下記の画面に遷移します。
真ん中ちょい右の**Start a project**をクリック
[![Image from Gyazo](https://i.gyazo.com/99a50a0c470b7d78a09b4c722fbe81cc.png)](https://gyazo.com/99a50a0c470b7d78a09b4c722fbe81cc)

すると下記の画面にいきます。
**Repository name**に「testapp」と入力して**Create repository**をクリック
[![Image from Gyazo](https://i.gyazo.com/db99f0c561916e4679fa70ca41e0771c.png)](https://gyazo.com/db99f0c561916e4679fa70ca41e0771c)

すると下記画面にたどり着きます。
[![Image from Gyazo](https://i.gyazo.com/5a0c9f9ba10ded3aba64afccb79192d6.png)](https://gyazo.com/5a0c9f9ba10ded3aba64afccb79192d6)

これが**testapp**というアプリケーションのソースコードを収めるべきスペースです。
まだ何も入っていない状態です。

つぎに**Cloud9**と**Github**を連携させるべく、先ほどCloud9上で作ったカギをGithubにセットします。

下記にアクセスしましょう。
https://github.com/settings/keys

こんな感じです。右上の**New SSH key**をクリックします。
[![Image from Gyazo](https://i.gyazo.com/0cd99ba6d5331ecb75f21181d356cb21.png)](https://gyazo.com/0cd99ba6d5331ecb75f21181d356cb21)

下記のような画面に移ります。
[![Image from Gyazo](https://i.gyazo.com/043b5f2b6d168339177a93f0d3b1081c.png)](https://gyazo.com/043b5f2b6d168339177a93f0d3b1081c)

**title**に「aws_cloud9」
**key**に`cat /home/ubuntu/.ssh/id_rsa.pub`で確認したカギ（ssh-rsaではじまりIPアドレスで終わる超長い文字列）
を入力します。
そして**Add SSH key**をクリック。

これでGithub登録とCloud9との連携完了です！


### Githubでのソースコードの公開

cloud9コンソールで下記コマンドを順に実行してください。

```cloud9コンソール.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git init
git add .
git commit -m "first commit"
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/85155a64626f51fccb89c24cf15d8bb7.png)](https://gyazo.com/85155a64626f51fccb89c24cf15d8bb7)

下記のようになれば成功です。（全ファイルが登録されてるので全ファイル名が処理結果として出力されます）
[![Image from Gyazo](https://i.gyazo.com/4d50aa9f6898d674c05ee64ce13f95e4.png)](https://gyazo.com/4d50aa9f6898d674c05ee64ce13f95e4)

これは、

1. testappディレクトリ以下のファイル群をGitというツールで管理スタートし（git init）、
2. testappディレクトリ以下のどのファイルを対象にするかを決めて（git add . ※ドットは全ファイルを意味する）、
3. 状態を確定させる（git commit -m "なにかメッセージ"）

ということをしています。
そのあと、cloud9コンソールで下記コマンドを実行してください。

```cloud9コンソール.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git remote add origin git@github.com:kakiuchis2/testapp.git
```

こんな感じで特になにも表示されませんが、
先ほどのGithubの**kakiuchis2/testappリポジトリ**の場所をcloud9上に認識させたということです。
[![Image from Gyazo](https://i.gyazo.com/9036f5389ab9e3c5eb737ea95cd60bc5.png)](https://gyazo.com/9036f5389ab9e3c5eb737ea95cd60bc5)

そのあと、cloud9コンソールで下記コマンドを実行してください。

```cloud9コンソール.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう
git push origin master
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/3ffc98ba973cd4e8c849b5f53ebb43b1.png)](https://gyazo.com/3ffc98ba973cd4e8c849b5f53ebb43b1)

途中でyesかnoか聞かれたら、yesと入力しましょう。
こんな感じになれば成功です。
[![Image from Gyazo](https://i.gyazo.com/cd78e3f7c6badc37544c84219c7906bd.png)](https://gyazo.com/cd78e3f7c6badc37544c84219c7906bd)

これは「cloud9のtestappディレクトリ以下のファイル群」を「Githubの**kakiuchis2/testappリポジトリ**」にコピーしているのです。

では本当にうまくいったか確認しましょう。
Githubのトップページにアクセスします。
https://github.com/

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/f555975719dd4257ba651ae1a5b959f6.png)](https://gyazo.com/f555975719dd4257ba651ae1a5b959f6)

左の**kakiuchis2/testapp**をクリック！
※`kakiuchis2`の部分はユーザ名なので人それぞれ異なります。

すると下記画面にいきます。
[![Image from Gyazo](https://i.gyazo.com/39b91c055ebd1a57af15d1a410630e81.png)](https://gyazo.com/39b91c055ebd1a57af15d1a410630e81)

Cloud9と同じファイル構成がGithub上でも完成しています。
これでGithubでのソースコードの公開は完了です！

おおよそここまでがサーバサイドエンジニアの仕事です。
ここからインフラエンジニアの仕事にはいっていきます。

## 全世界公開用のサーバ環境を準備する

フロントエンドエンジニアとサーバサイドエンジニアのつくったソースコードを預かって、
それを全世界に公開までもっていくのがインフラエンジニアの担当部分です。
では早速やっていきましょう。

### LightsailでOS作成

通常だとレンタルサーバと契約して、OSのイメージみたいなのを入手して、インストールして。。。
みたいな感じですが**Lightsail**は超カンタン！
さっそくやっていきましょう。

まずAWSコンソールにアクセス
https://console.aws.amazon.com/console/home

そして**サービスを検索する**の検索窓にlightsailと入力してクリック。
こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/67a6f30cbc8978ac9161579a7cb4825b.png)](https://gyazo.com/67a6f30cbc8978ac9161579a7cb4825b)

**では、始めましょう**とでてくるので始めます。
[![Image from Gyazo](https://i.gyazo.com/f877e56de9652adca11336dcca7357ae.png)](https://gyazo.com/f877e56de9652adca11336dcca7357ae)

**プラットフォーム**→Linux/Unix
**設計図**→「OSのみ」、Amazon Linux
を選択します。
[![Image from Gyazo](https://i.gyazo.com/9dec3ecb6aea605c13a9e99499a8110e.png)](https://gyazo.com/9dec3ecb6aea605c13a9e99499a8110e)

つぎに**インスタンスのプラン選択**→最初の1カ月無料である$3.50ドルのやつ
を選択します。
[![Image from Gyazo](https://i.gyazo.com/aae4537cf5a38ae56d9c8d8c96904495.png)](https://gyazo.com/aae4537cf5a38ae56d9c8d8c96904495)

そして**インスタンスの作成**をクリックすると下記画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/fbd1eac06acd9f219fd38bdb2e8e2919.png)](https://gyazo.com/fbd1eac06acd9f219fd38bdb2e8e2919)

これでLightsailでAmazonLinux作成が完了です！

### Amazon Linuxへのアクセス

**Amazon_Linux-512MB...**の部分をクリックすると下記画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/8a88150ee43e9445158bd5072cade547.png)](https://gyazo.com/8a88150ee43e9445158bd5072cade547)

真ん中らへんの`SSHを使用して接続`をクリックすると下記画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/8d815661cfc252bef666a0b924c76b36.png)](https://gyazo.com/8d815661cfc252bef666a0b924c76b36)

これでAmazon Linuxへのアクセス完了です。
インフラエンジニアはこの黒い画面（便宜上Lightsailのコンソールと呼ぶことにします）で仕事をしていくのです。
じつはこの画面はAmazon社が作った場所は秘密にされているどこかのサーバにリモートでアクセスしているのです。
そのサーバの一部を借りて、全世界にアプリを公開できるサービスが**Lightsail**なのです。

### Amazon Linuxの最初の準備

Cloud9とちがって本番環境のAmazon Linuxはなにも準備されていません。
自分で準備していくのです。
これがインフラエンジニアの仕事です。

さっそくいきましょう。

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
sudo su -
```

こんな感じで`$`が`#`に変わります。
[![Image from Gyazo](https://i.gyazo.com/f556c2694381795bf835944eb9fd9986.png)](https://gyazo.com/f556c2694381795bf835944eb9fd9986)

これは権限をMAXにする行為です。
本来の仕事では危険なのであまり行いませんが、今回の適性診断ははスピード重視のため全コマンドをMAX権限で実行します。

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
yum -y update
```

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/65f6aa2693872ce2096bca8ae6c78027.png)](https://gyazo.com/65f6aa2693872ce2096bca8ae6c78027)

こんな感じで**Complete!**と表示されたら成功です！
[![Image from Gyazo](https://i.gyazo.com/dc25e7862defbef55f69f99d117edd2d.png)](https://gyazo.com/dc25e7862defbef55f69f99d117edd2d)

これは、**yum（ヤム）**といういろんなソフトをインストールしたりアンインストールしたりするツールがあり、それをyum管理されているソフトウェアを最新状態にするという処理です。
あまり気にせず先に進みましょう。

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
yum -y install git
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/d49e7b04f55c4ef4b26b07bc08b7dcc6.png)](https://gyazo.com/d49e7b04f55c4ef4b26b07bc08b7dcc6)

こんな感じで**Complete!**と表示されたら成功です！
[![Image from Gyazo](https://i.gyazo.com/b817aad5a20fdc519aae66123254fbd1.png)](https://gyazo.com/b817aad5a20fdc519aae66123254fbd1)

これはyumでGitをインストールする処理です。
先ほど開発のところでも登場したGitですが、
インフラでもGitを通じて、世界中のいろんな人が作ったものをコピーすることができるのです。

### Rubyのインストール

では次に**Ruby**をインストールしましょう。
**Ruby**をインストールしないと**Ruby on Rails**が使えないのです。
では行きましょう。

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/80041545be685f1e5ff16e5473ec64f0.png)](https://gyazo.com/80041545be685f1e5ff16e5473ec64f0)

これはRubyのインストールを便利にするためのツール**rbenv**がgithubで公開されており、そのソースをAmazonLinuxの`/usr/local/rbenv`ディレクトリにコピーしているのです。

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
vi /etc/profile.d/rbenv.sh
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/4a17d2122d6a6913dc6797ed7cb76de1.png)](https://gyazo.com/4a17d2122d6a6913dc6797ed7cb76de1)

するとこんな画面がでてきます。
[![Image from Gyazo](https://i.gyazo.com/675a80752ed65eab4bdf16fad72a5bb4.png)](https://gyazo.com/675a80752ed65eab4bdf16fad72a5bb4)

最初はなにも入力できない状態です。
そこで`i`をタイプします。
すると左下に**-- INSERT --**と表示され、入力できる状態になります。
[![Image from Gyazo](https://i.gyazo.com/e1439151e8afefb4c8f8e392a8bd234d.png)](https://gyazo.com/e1439151e8afefb4c8f8e392a8bd234d)

下記内容をコピペして張り付けましょう。

```/etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

ただこのLightsailコンソールは直接のコピペができず、右下のノートマークを経由してコピペします。
そして黒い画面の文字のコピーはドラッグ、
張り付けるときは右クリックです。

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/b66c4c58a2aac379b0d4484837271773.gif)](https://gyazo.com/b66c4c58a2aac379b0d4484837271773)

そのあと`ESC`とタイプすると左下の**-- INSERT --**が消えて、入力できない状態になります。
[![Image from Gyazo](https://i.gyazo.com/e373859f0c9c6a809a2077c60c8a8396.png)](https://gyazo.com/e373859f0c9c6a809a2077c60c8a8396)

入力できない状態で`:wq`とタイプすると上書き保存されます。
※`:q!`で保存せずに終了です。
こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/a2949d5c0bc169287409e50c3b5d2c23.png)](https://gyazo.com/a2949d5c0bc169287409e50c3b5d2c23)

するともとのLightsailコンソールに戻ります。
[![Image from Gyazo](https://i.gyazo.com/0b165e015f4b39ceee14a4386e9154db.png)](https://gyazo.com/0b165e015f4b39ceee14a4386e9154db)

このviコマンドでのファイル編集方法は今後も頻発するのでよく覚えておきましょう。

- `i`と`ESC`で入力モードと入力できないモードの切り替え
- 入力できないモード状態で、`:wq`で上書き保存、`:q!`で保存せずに終了

です！
この一連の処理は、PCでいう環境変数の設定のようなもので、rbenvを用いたコマンドをどこからでも実行可能にする処理をコピペしたのです。

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
source /etc/profile.d/rbenv.sh
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/1e818a5b7247f01e2e5cdc008680fcad.png)](https://gyazo.com/1e818a5b7247f01e2e5cdc008680fcad)

とくになにも起こりませんが、先ほど作成した`/etc/profile.d/rbenv.sh`ファイルの読み込みをおこなったイメージです。
読み込みを行わないと設定が反映されないのです。

ではちゃんと*rbenv*がインストールされたか確認してみます。

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
rbenv --version
```

このようにバージョンの数字が表示されたら成功しています。
[![Image from Gyazo](https://i.gyazo.com/0c4a57aa2b9114244c353f91eeadf2ae.png)](https://gyazo.com/0c4a57aa2b9114244c353f91eeadf2ae)

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/492cff603d6b99a83b1e916dac170825.png)](https://gyazo.com/492cff603d6b99a83b1e916dac170825)

これも**ruby-build**というRubyインストールに必要なツールをGithubからAmazonLinuxの`/usr/local/rbenv/plugins/ruby-buildディレクトリ`にコピーする処理です。

では次にRubyのインストールに必要なその他ツールを一気にインストールしていきます。
Lightsailコンソールで下記コマンドを順に実行してください。

```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コンソールで下記コマンドを実行してください。

```cloud9コンソール.
ruby -v
```

こんな感じで**Ruby2.6.0**であると分かります。
[![Image from Gyazo](https://i.gyazo.com/815ee1830ed33409c61bc90a8e2fc52d.png)](https://gyazo.com/815ee1830ed33409c61bc90a8e2fc52d)

ではAmazonLinuxでも**Ruby2.6.0**をインストールします。

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
rbenv install 2.6.0
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/afa252bf5c7d0d83d2cebafb2b8da2a2.png)](https://gyazo.com/afa252bf5c7d0d83d2cebafb2b8da2a2)

これは少々時間がかかって、下記のようになれば成功です。
[![Image from Gyazo](https://i.gyazo.com/57d703fe088f0e9e0cc3b559dfdd03a7.png)](https://gyazo.com/57d703fe088f0e9e0cc3b559dfdd03a7)

つぎにLightsailコンソールで下記コマンドを順に実行してください。

```Lightsailコンソール.
rbenv global 2.6.0
rbenv rehash
ruby -v
```

これは使用するRubyのバージョンを変更し、その結果ちゃんとRuby2.6.0がセットされたか確認する処理です。
問題なく最後に**2.6.0**とでたら成功です。
こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/829c19b3931471ca590d704fe858c40f.png)](https://gyazo.com/829c19b3931471ca590d704fe858c40f)

これでRubyインストール完了です。
大変ですね。Cloud9の便利さがよくわかります。
本番環境だけでなく、自力で開発環境構築するには、この処理が必要になるのです。

### bundlerのインストール

Ruby on Railsでの開発のとき、`bundle install`って使いましたよね。
WEBサーバのPumaとか（その他本当にたくさん）インストールしてくれるコマンド。
このコマンドを使えるようにするために**bundler**をインストールする必要があります。

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
gem install bundler
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/d5fc675318eeba3a0c07bb86def98e9a.png)](https://gyazo.com/d5fc675318eeba3a0c07bb86def98e9a)

これでbundlerのインストール完了です。

### PostgreSQLのインストールと設定

Cloud9でもインストールしましたね。
同じように本番環境でもインストールします！

Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
yum -y install postgresql94 postgresql94-server postgresql94-devel postgresql94-contrib postgresql94-docs
```

最後に**Comlplete!**と表示されたらOKです。
これらはPostgreSQLで必要な各種ツールをインストールしています。

次にLightsailコンソールで下記コマンドを順に実行してください。

```Lightsailコンソール.
/etc/init.d/postgresql94 initdb
/etc/init.d/postgresql94 start
```

こんな感じでそれぞれ**OK**と表示されたらOKです。
[![Image from Gyazo](https://i.gyazo.com/316f39f51a46c7901138c2e8a69ec0d5.png)](https://gyazo.com/316f39f51a46c7901138c2e8a69ec0d5)

これはPostgreSQLの初期化と起動のイメージです。

次にviコマンドで`/var/lib/pgsql94/data/postgresql.conf`を編集しましょう。
Lightsailコンソールで下記コマンドを実行してください。

```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**を編集します。
デフォルトは下記のようになっています。

```【編集前】/var/lib/pgsql94/data/postgresql.conf
# 以上省略

#------------------------------------------------------------------------------
# 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`

```【編集後】/var/lib/pgsql94/data/postgresql.conf
# 以上省略

#------------------------------------------------------------------------------
# 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コンソールで下記コマンドを実行してください。

```Lightsailコンソール.
vi /var/lib/pgsql94/data/pg_hba.conf
```

そして`/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コンソールで下記コマンドを実行してください。

```Lightsailコンソール.
/etc/init.d/postgresql94 restart
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/07b59b985facc50107b1dac31e212187.png)](https://gyazo.com/07b59b985facc50107b1dac31e212187)

これはPostgreSQLの再起動で、今まで編集したファイルを反映させる処理です。

つぎに`ec2-user`という名前でのPostgreSQLのデータベースを自由にコントロールできるユーザ（SUPERUSER）を作成します。
今後、データベースはRuby on Railsを経由して作成し、今回のRuby on Rails開発環境上のユーザの名前は`ec2-user`であるためです。
現段階ではあまり理解しなくて大丈夫です。
下記コマンドを打ち込みましょう。
つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
psql -U postgres
```

すると**postgres=#**と表示され、その後ろに下記コマンドを打ち込みます。

```Lightsailコンソール.
CREATE ROLE "root" WITH SUPERUSER LOGIN;
CREATE ROLE "testapp" WITH SUPERUSER LOGIN;
CREATE DATABASE "testapp_production";
\q
```

そしてLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
/etc/init.d/postgresql94 restart
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/291b2c40cf5afa4ad3fcb5ffd9a9ef9d.png)](https://gyazo.com/291b2c40cf5afa4ad3fcb5ffd9a9ef9d)

この処理は、**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コンソールで下記コマンドを実行してください。

```Lightsailコンソール.
yum -y install nginx
```

最後に**Complete!**と表示されればインストール成功です。

次にLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
chkconfig nginx on
/etc/init.d/nginx start
```

こんな感じで**OK**と表示されます。
[![Image from Gyazo](https://i.gyazo.com/69416c834cc1be08bd419fde526f7b47.png)](https://gyazo.com/69416c834cc1be08bd419fde526f7b47)

これはNginxが自動で起動するよう設定とNginxの起動処理です。

ではLightsailのOS詳細画面（下記の画面）の下の方のパブリックIPの数字を確認し、ブラウザのURL欄に入力してみてください。
[![Image from Gyazo](https://i.gyazo.com/65a5344716c58eab4a99bebde9ce7ca8.png)](https://gyazo.com/65a5344716c58eab4a99bebde9ce7ca8)

Nginxのインストールと起動が問題なければこのように表示されます。
[![Image from Gyazo](https://i.gyazo.com/2b91c3e12525c52d9ae4bcb0c3e560a6.png)](https://gyazo.com/2b91c3e12525c52d9ae4bcb0c3e560a6)

次にviコマンドで`/etc/nginx/conf.d/testapp.conf`を新規作成＋カスタマイズしましょう。
※viコマンドはその後ろに存在しないファイルを指定すると新規作成＋編集ができるのです。
Lightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
vi /etc/nginx/conf.d/testapp.conf
```

そして`/etc/nginx/conf.d/testapp.conf`を下記のように作成します。
※ただし7行目のIPアドレスは各個人でことなります。
※先ほど調べたLightsailのOS詳細画面（下記の画面）の下の方のパブリックIPの数字を入力しましょう。
※[Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築](https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23)を参考にさせていただきました！

```/etc/nginx/conf.d/testapp.conf
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コンソールで下記コマンドを実行してください。

```Lightsailコンソール.
nginx -s reload
```

こんな感じでなにも起こりませんが、Nginxが再起動し、`testapp.conf`の設定が読み込まれます。
[![Image from Gyazo](https://i.gyazo.com/4254f7cad773d60c16ebd32d0dff91b6.png)](https://gyazo.com/4254f7cad773d60c16ebd32d0dff91b6)

## 全世界公開用のサーバでGithub公開ソースコードをもとに公開する

いよいよ終わりが見えてきました。
それではGithubで公開しているソースコードをAmazonLinuxに入れ込んで、アプリを起動して公開していきましょう。

### GithubからAmazonLinuxにソースコードを入れる

まずはGithubからAmazonLinuxにソースコードを入れていきます。

Githubにアクセス
https://github.com/
[![Image from Gyazo](https://i.gyazo.com/abf8008144679c465248fa2f750ca416.png)](https://gyazo.com/abf8008144679c465248fa2f750ca416)

左の該当するリポジトリをクリックして下記画面に行きます。
[![Image from Gyazo](https://i.gyazo.com/307a719465e0e72c31554be96bec6578.png)](https://gyazo.com/307a719465e0e72c31554be96bec6578)

この画面の右上の緑色の**Clone or Download**をクリックすると、
`https://github.com/xxxx/yyyy.git`というURLが出てきます。
※xxxxはGuthub登録ユーザ名でyyyyはリポジトリ名なので皆さん異なります。

そしてLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
git clone https://github.com/xxxx/yyyy.git /var/www/testapp
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/0e900b402b558b1e8c3ea0c5c90d3ef8.png)](https://gyazo.com/0e900b402b558b1e8c3ea0c5c90d3ef8)

これでGithubで公開しているソースコードがAmazonLinuxの`/var/www/testappディレクトリ`にコピーされました。
※つまり公開されているコードは全世界の人たちに使ってもらえるのです！

ただし一部Githubの状態から変更しておきべき場所があります。
まずcloud9のコンソール部分で下記のように入力してEnterしてみましょう。

```【cloud9コンソール】.
# 「$」の前の部分が「ec2-user:~/environment/testapp」となっていることをコマンド実行前に確認しましょう。
bundle exec rake secret
```

こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/c8cb7831cbec19694a7b3f08ae3bf5d4.png)](https://gyazo.com/c8cb7831cbec19694a7b3f08ae3bf5d4)

この出てきた乱数をコピペしておきます。

つぎにLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
vi /var/www/testapp/config/secrets.yml
```

で`/var/www/testapp/config/secrets.yml`を下記のように編集します。
※`<%= ENV["SECRET_KEY_BASE"] %>`の部分に先ほどの乱数をコピペします。

```/var/www/testapp/config/secrets.yml
# 以上省略
# 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コンソールで下記コマンドを実行して、ソースコードをいれたディレクトリに移動します。

```Lightsailコンソール.
cd /var/www/testapp
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/1e654d33d7101fbf995b2b2586babc43.png)](https://gyazo.com/1e654d33d7101fbf995b2b2586babc43)

次にLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
bundle install
```

うまくいくとこんな感じになります。
[![Image from Gyazo](https://i.gyazo.com/e7a06183e1fe19d086ab92dba2be0a41.png)](https://gyazo.com/e7a06183e1fe19d086ab92dba2be0a41)

もし下記のようなエラーが発生したら`/var/www/testappディレクトリ`で`gem install nokogiri -v '1.10.3'`を実行した後で再度`bundle install`を実行してみてください。
[![Image from Gyazo](https://i.gyazo.com/7f2a37be952aa1dc06b07a2a5213040f.png)](https://gyazo.com/7f2a37be952aa1dc06b07a2a5213040f)

もし下記のようなエラーが発生したら`/var/www/testappディレクトリ`で`gem install pg -v '0.21.0'`を実行した後で再度`bundle install`を実行してみてください。
[![Image from Gyazo](https://i.gyazo.com/b8e63930b5fcdcaa2dcf3a9dd461b2ec.png)](https://gyazo.com/b8e63930b5fcdcaa2dcf3a9dd461b2ec)

これはCloud9環境でも行った必要なRuby on Railsの起動に必要な各種パッケージをインストールする処理です。

次にLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
rake db:migrate RAILS_ENV=production
```

こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/3cc952806b20f775d44f9c4a4353d3c7.png)](https://gyazo.com/3cc952806b20f775d44f9c4a4353d3c7)

これはCloud9環境でも行いましたが、Ruby on Railsの特定のファイルの情報に基づいてデータベースの状態をカスタマイズしている処理です。

次にLightsailコンソールで下記コマンドを実行してください。

```Lightsailコンソール.
# 「#」の前の部分が「root@ip-xx-xx-xx-xx testapp」となっていることをコマンド実行前に確認しましょう。
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

こんな感じでなんも起こりませんがUnicornが起動開始した状態になります。
[![Image from Gyazo](https://i.gyazo.com/137d7618632aa493835b94baf6205c13.png)](https://gyazo.com/137d7618632aa493835b94baf6205c13)

### では全世界に公開されたWEBサイトを見てみましょう。

LightsailのOS詳細画面（下記の画面）の下の方のパブリックIPの数字を確認し、ブラウザのURL欄に`xx.xx.xx.xx/blogs`と入力してみてください。
[![Image from Gyazo](https://i.gyazo.com/65a5344716c58eab4a99bebde9ce7ca8.png)](https://gyazo.com/65a5344716c58eab4a99bebde9ce7ca8)

すべての処理がうまくいっていれば下記のような感じで全世界に公開されている状態になります。
[![Image from Gyazo](https://i.gyazo.com/1c2646811e37a660a69b26651470436f.png)](https://gyazo.com/1c2646811e37a660a69b26651470436f)

終了です。お疲れ様でした！！！

## 診断

では診断を行います。
下記のなかでどの箇所が一番没入できましたか？もっとも没入したものを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点の部分をクリックして削除します。
こんな感じです。
[![Image from Gyazo](https://i.gyazo.com/e04a7c6cabbdc09a0947f7e9754759f7.gif)](https://gyazo.com/e04a7c6cabbdc09a0947f7e9754759f7)

つぎはこちらにアクセスします。
https://us-east-2.console.aws.amazon.com/cloud9/home

削除したいCloud9開発環境をクリックして削除します。
こんな感じ。
[![Image from Gyazo](https://i.gyazo.com/2c2f6196397779378f9f04bc11e73b58.gif)](https://gyazo.com/2c2f6196397779378f9f04bc11e73b58)

これで大丈夫です。また作りましょう！

## 参考文献
とても参考になりました！ありがとうございます！！

[CentOSにrbenv, Rubyをインストールする](https://qiita.com/NaokiIshimura/items/ff04b6eaa40b33c4bea8)
[unicornがエラーで起動しなくて困った](https://qiita.com/kuzugr/items/b2584ac4c842943d8242)
[Rails + unicorn + nginx でWeb Serverを起動させるときにはまった話。](https://qiita.com/emahiro/items/b2762a26bca35bbb0cf9)
[Amazon Linux上でRails新規プロジェクトを作成すると、bundle installで落ちる](https://qiita.com/csakurah/items/7d3b73b0b245ad6e29c1)
[Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築](https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23)