【4章】EC2

Amazon EC2 とは Amazon Elastic Compute Cloud の略称で,コンピューティング性能をクラウド内で提供するサービスです。サーバーに必要なものをクラウド内で借りることができます。

Railsのアプリをこの EC2 にデプロイし,ブラウザからアクセスできるように準備を行います。

EC2 も運用に料金がかかりますので,不要になったインスタンスなどは削除するようにしましょう。

4.1 インスタンスの作成

  • 画面左上の「サービス」を開き、検索欄に「EC2」と入力し、「EC2」を選択

  • 画面左のメニューバーの「インスタンス」を選択し,「インスタンスを起動」ボタンをクリック

ステップ 1: Amazon マシンイメージ (AMI)

「無料利用枠の対象」タグの付いた「Amazon Linux 2 AMI (HVM), SSD Volume Type」「64ビット (x86)」の「選択」ボタンをクリック

インスタンス

ステップ 2: インスタンスタイプの選択

  • 「無料利用枠の対象」タグの付いた「t2.micro」が選択されていることを確認した上で,「次のステップ」ボタンをクリック
    • 「確認と作成」ボタンをクリックしないこと。クリックした場合は,「戻る」ボタンをクリックしてステップ3まで移動しましょう

インスタンスタイプ選択

ステップ 3: インスタンスの詳細の設定

キー
ネットワーク アプリ名_vpc
サブネット アプリ名_public_1a_subnet

他はデフォルト設定のまま「次のステップ」ボタンをクリック

インスタンスタイプ詳細

ステップ 4: ストレージの追加

「次のステップ」ボタンをクリック

ステップ 5: タグの追加

「タグの追加」ボタンをクリック

キー
Name 「アプリ名_instance」を選択

インスタンスタグの追加

「次のステップ」ボタンをクリック

ステップ 6: セキュリティグループの設定

「既存のセキュリティグループを選択する」にチェック

「アプリ名_ec2_security_group」にチェック

インスタンスセキュリティグループの設定

「確認と作成」ボタンをクリック

ステップ 7: インスタンス作成の確認

  • セキュリティグループの「名前」が「アプリ名_ec2_security_group」になっていることを確認した上で,「起動」ボタンをクリック

既存のキーペアを選択するか、新しいキーペアを作成します。

  • 「新しいキーペアの作成」を選択

  • 「キーペア名」は「アプリ名」を入力

    • メモ しているアプリ名と全く同じにして下さい(ハイフン - を使用せず,アンダースコア _ を使用)
  • 「キーペアのダウンロード」を選択

    • アプリ名.pem をダウンロードできます。後に EC2 のログインで利用します

インスタンスキーペア

「インスタンスの作成」ボタンをクリック

作成ステータス

「インスタンスの表示」ボタンをクリック

4.2 Elastic IPの作成、紐付け

インターネットに接続するには グローバルIPアドレス が必須です。

現状ではこの グローバルIPアドレス は固定化されておらず EC2インスタンス を再起動した際に変更されてしまいます。(URLが変化してしまう!)

Elastic IP 設定することで,グローバルIPアドレス を固定化することができます。

Elastic IP はこれから行う EC2インスタンス との関連付けを行っている状態では無料ですが,関連付けた EC2インスタンス を削除したり停止させると料金が発生するようになります。

EC2インスタンス を削除する際は Elastic IP の開放を忘れないように注意しましょう。

Elastic IPの作成

  • 画面左のメニューバーの「Elastic IP」を選択

  • 「Elastic IP アドレスの割り当て」ボタンをクリック

  • 「割り当て」ボタンをクリック

Elastic IPの紐付け

  • 先ほど割り当てた Elastic IP を選択した状態で、「アクション」ドロップダウンを選択し、「Elastic IP アドレスの関連付け」をクリック

ElasticIP関連付け1

ここで,表示されている Elastic IP は必ずメモしておいて下さい。

キー
インスタンス アプリ名_instance
プライベート IP アドレス ※クリックして表示されるIPを選択
再関連付け チェックを入れる

ElasticIP関連付け2

  • 「関連付ける」ボタンをクリック

4.3 EC2へのログイン

アプリ名を定義(ローカル環境)

作業ミスを減らすため,ターミナルで頻出する アプリ名 を一時的にグローバル変数として定義しておきましょう。

アプリ名 の箇所は,各自がメモしているものに置き換えて実行して下さい。

ターミナル
APP_NAME=アプリ名
echo $APP_NAME
(例)
APP_NAME=aws_sample_app
echo $APP_NAME

最後のコマンドで,「アプリ名」が正しく表示されていることを確認した上で,以下を実行して下さい。

【補足】間違った場合は再度上記を実行し直してから進めて下さい。また,コマンドは原則コピペして下さい。1文字間違っただけで大きく時間をロスする可能性があります。

ターミナル
# zsh の場合
echo "export APP_NAME=$APP_NAME" >> ~/.zshrc
source ~/.zshrc

# bash の場合
echo "export APP_NAME=$APP_NAME" >> ~/.bash_profile
source ~/.bash_profile

【備考】 使用しているシェルスクリプトが zshbash か分からない場合は echo $SHELL を実行して確認して下さい

アプリ名登録

キーペアの移動・アクセス権の付与

【参考】 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html

4.1 でダウンロードしたキーペア アプリ名.pem.ssh ディレクトリに移動し,利用できる状態にしておきましょう。

ターミナル
cd
mkdir .ssh
mv Downloads/$APP_NAME.pem .ssh
chmod 400 .ssh/$APP_NAME.pem
ls -l .ssh/$APP_NAME.pem

最後のコマンドで -r-------- (略) .ssh/アプリ名.pem が表示されていればOKです。

【補足】mv コマンド実行時に No such file or directory が表示された場合は,Google Chrome の下に現れている アプリ名.pem のドロップダウンメニューから,キーペアの場所を確認して,直接,ホームディレクトリの .ssh ディレクトリに移動させて下さい。キーペアのファイル名が アプリ名.pem になっているかどうかも確認しましょう。

EC2 インスタンスの状態を確認

  • EC2 の画面左のメニューバーの「インスタンス」をクリックし,作成した EC2インスタンスの「インスタンスの状態」が 実行中 となっているか確認して下さい
    • 実行中 になっていない場合はしばらく待ってからブラウザをリロードして下さい

【補足】4.2で Elastic IP をメモし忘れた人は,作成した EC2インスタンス を選択し, Elastic IP をメモして下さい

EC2インスタンス状態確認

ssh接続の設定ファイルを作成

EC2インタスタンス にログインするには,「ホスト名」「ユーザー名」「AWSからダウンロードしたキーペア(秘密鍵)」が必要になります。

これらをログインの度に毎回記述するのは面倒なので,設定ファイルに記載し,使える状態にしましょう。

ローカル環境のターミナル
vi ~/.ssh/config

Vim エディタでファイルが開かれますので,以下を記述して下さい。(デフォルトで ec2-user という名前のユーザーが用意されています)

ローカル環境のターミナル(~/.ssh/config)
Host アプリ名
  Hostname ElasticIPを記入
  User ec2-user
  IdentityFile ~/.ssh/アプリ名.pem

【参考】 「アプリ名」が aws_sample_app, 「Elastic IP」が 172.217.161.46 の場合は,次の形式となります。

(例)
Host aws_sample_app
  Hostname 172.217.161.46
  User ec2-user
  IdentityFile ~/.ssh/aws_sample_app.pem

【補足】 Vimの基本

一般のテキストエディタは,ファイルを開いてすぐに文字が入力できます。 Vimインサートモード に変更しなければキー入力ができません。

ここは初学者が非常に混乱しやすいところですので,くれぐれもご注意下さい。

以下は最低限覚えておきましょう。

  • Vim の起動時は「ノーマルモード」
  • 文字をキー入力したいときは i を入力し,「インサートモード」に変更する必要がある
    • 「かな」入力モードでは i を入力しても効果が出ないので,「英数」入力モードに切り替えてから行うこと
  • 「ノーマルモード」への移行は,esc
  • 保存終了は「ノーマルモード」にしてから :wq
  • (保存せずに)強制終了は「ノーマルモード」にしてから :q!

EC2にログイン

それでは, EC2インタスタンス にログインしてみましょう。

ターミナル
ssh アプリ名

Are you sure you want to continue connecting (yes/no/[fingerprint]) と表示されたら,yes と入力してEnterキーを押しましょう。

これで, EC2インタスタンス にログインできます。


【備考】ここでSSH接続できない場合は,以下の可能性があります。

  • 先ほど作成した ~/.ssh/config にミスがある

  • 4.3で,キーペアが指定箇所に移動できていない or パーミッションを適切に変更できていない(ls -l ~/.ssh/$APP_NAME.pem で確認)

  • Elastic IP をメモし間違えている

  • 2.5で作成した「EC2 用のセキュリティグループ(アプリ名_ec2_security_group)」の設定を間違えている

    • SSHのソースが マイIP の場合は,IPアドレスが変わっていないかも確認しましょう(不明な場合は 任意の場所 に変更)
  • 4.1で設定したEC2 用のセキュリティグループが「アプリ名_ec2_security_group」になっていない

  • 2.4で作成したルートテーブルの「サブネットの関連付け」を間違えている


4.4 EC2の初期設定

(参考)Amazon Linux インスタンスでユーザーアカウントを管理する


要注意

今後,EC2にログインした状態の サーバー環境のターミナル と,通常の ローカル環境のターミナル のどちらで操作するかを「必ず」確認して下さい。1度でも間違えると,エラー解決に大きく時間を取られる可能性があります。

なお,一定時間が経過しますと,EC2からログアウトしますので,その点にも注意しましょう。


新規ユーザーアカウントの作成

今後 EC2 での作業や Capistrano で利用するユーザーを作成しましょう。作業を楽にするため,しばらくパスワード無しで sudo コマンドを使える状態にしておきます。

EC2にログインした状態の サーバー環境のターミナル で以下を実行しましょう。

「ユーザー名」の箇所は自由に決め, メモ しておいて下さい。

サーバー環境のターミナル
APP_USER=ユーザー名
echo $APP_USER

最後のコマンドで,「ユーザー名」が正しく表示されていることを確認した上で,以下を実行して下さい。

サーバー環境のターミナル
sudo adduser $APP_USER
echo "$APP_USER ALL=(ALL) NOPASSWD: ALL" | sudo EDITOR='tee -a' visudo > /dev/null
sudo su - $APP_USER
sudo ls

最初の表示が ec2-user から「自分の決めたユーザー名」に変更され,最後のコマンドでパスワードを求められなければOKです。

【補足】2番目の操作は sudo visudo 実行後,一番最後の行に ユーザー名 ALL=(ALL) NOPASSWD: ALL を追加する操作です

アプリ名を定義(サーバー環境)

作業ミスを減らすため,サーバー環境でも「アプリ名」をグローバル変数として定義しておきましょう。

サーバー環境のターミナル
APP_NAME=アプリ名
echo $APP_NAME

最後のコマンドで,「アプリ名」が正しく表示されていることを確認した上で,以下を実行して下さい。

(間違っている場合は再度上記を実行し直してから進めて下さい)

サーバー環境のターミナル
echo "export APP_NAME=$APP_NAME" >> ~/.bash_profile
source ~/.bash_profile

新規ユーザーでssh接続するための設定

新規ユーザーでssh接続できるようにするには,アプリ名.pem (秘密鍵)に対応する 公開鍵EC2~/.ssh/authorized_keys に配置し,適切な権限を与えておく必要があります。

サーバー環境のターミナル
mkdir .ssh -m 700
vi .ssh/authorized_keys

サーバー側でVimエディタが開かれます。

ここで,新しく ローカル 環境のターミナルを用意して下さい。( command + n もしくは command + t

そして, ローカル 環境のターミナルで 秘密鍵(アプリ名.pem) から 公開鍵 をコピーして下さい。

ローカル環境のターミナル
ssh-keygen -y -f ~/.ssh/$APP_NAME.pem | pbcopy

(コマンドを実行するだけでコピーされますので,command + c は不要です。もし pbcopy: command not found が表示される場合は | pbcopy を削って実行し,直接コピーして下さい)

その後,サーバー環境のターミナルに戻って以下の操作を行ってください。

サーバー環境のターミナル
# 公開鍵(ssh-rsa *****)を貼り付け,保存終了
chmod 600 .ssh/authorized_keys
exit
exit

これで,新しく作成したユーザーでもログインができるようになりました。

ログイン時のユーザー名を変更しましょう。

ローカル環境のターミナル
vi ~/.ssh/config
  • 「ユーザー名」を ec2-user から メモしたユーザー名 に変更しましょう。
ローカル環境のターミナル(~/.ssh/config)
Host アプリ名
  Hostname ElasticIP
  User ユーザー名 ★ここを変更★
  IdentityFile ~/.ssh/アプリ名.pem
(ユーザー名がtakeの場合)
Host aws_sample_app
  Hostname 172.217.161.46
  User take
  IdentityFile ~/.ssh/aws_sample_app.pem

4.5 今後のEC2のログイン方法

再度,以下のコマンドで EC2インスタンス にログインしてみましょう。

ローカル環境のターミナル
ssh アプリ名

ec2-user ではなく各自が決めたユーザー名でログインできるはずです。

デフォルトユーザーは必要なくなりましたので,削除しておきましょう。

サーバー環境のターミナル
sudo userdel -r ec2-user