Amazon EC2
とは Amazon Elastic Compute Cloud
の略称で,コンピューティング性能をクラウド内で提供するサービスです。サーバーに必要なものをクラウド内で借りることができます。
Railsのアプリをこの EC2
にデプロイし,ブラウザからアクセスできるように準備を行います。
EC2 も運用に料金がかかりますので,不要になったインスタンスなどは削除するようにしましょう。
画面左上の「サービス」を開き、検索欄に「EC2」と入力し、「EC2」を選択
画面左のメニューバーの「インスタンス」を選択し,「インスタンスを起動」ボタンをクリック
「無料利用枠の対象」タグの付いた「Amazon Linux 2 AMI (HVM), SSD Volume Type」「64ビット (x86)」の「選択」ボタンをクリック
キー | 値 |
---|---|
ネットワーク | アプリ名_vpc |
サブネット | アプリ名_public_1a_subnet |
他はデフォルト設定のまま「次のステップ」ボタンをクリック
「次のステップ」ボタンをクリック
「タグの追加」ボタンをクリック
キー | 値 |
---|---|
Name | 「アプリ名_instance」を選択 |
「次のステップ」ボタンをクリック
「既存のセキュリティグループを選択する」にチェック
「アプリ名_ec2_security_group」にチェック
「確認と作成」ボタンをクリック
「新しいキーペアの作成」を選択
「キーペア名」は「アプリ名」を入力
メモ
しているアプリ名と全く同じにして下さい(ハイフン -
を使用せず,アンダースコア _
を使用)「キーペアのダウンロード」を選択
アプリ名.pem
をダウンロードできます。後に EC2
のログインで利用します「インスタンスの作成」ボタンをクリック
「インスタンスの表示」ボタンをクリック
インターネットに接続するには グローバルIPアドレス
が必須です。
現状ではこの グローバルIPアドレス
は固定化されておらず EC2インスタンス
を再起動した際に変更されてしまいます。(URLが変化してしまう!)
Elastic IP
設定することで,グローバルIPアドレス
を固定化することができます。
Elastic IP
はこれから行う EC2インスタンス
との関連付けを行っている状態では無料ですが,関連付けた EC2インスタンス
を削除したり停止させると料金が発生するようになります。
EC2インスタンス
を削除する際は Elastic IP
の開放を忘れないように注意しましょう。
画面左のメニューバーの「Elastic IP」を選択
「Elastic IP アドレスの割り当て」ボタンをクリック
「割り当て」ボタンをクリック
Elastic IP
を選択した状態で、「アクション」ドロップダウンを選択し、「Elastic IP アドレスの関連付け」をクリックここで,表示されている Elastic IP
は必ずメモしておいて下さい。
キー | 値 |
---|---|
インスタンス | アプリ名_instance |
プライベート IP アドレス | ※クリックして表示されるIPを選択 |
再関連付け | チェックを入れる |
作業ミスを減らすため,ターミナルで頻出する アプリ名
を一時的にグローバル変数として定義しておきましょう。
アプリ名
の箇所は,各自がメモしているものに置き換えて実行して下さい。
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
【備考】 使用しているシェルスクリプトが zsh
か bash
か分からない場合は 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インスタンスの「インスタンスの状態」が 実行中
となっているか確認して下さい
実行中
になっていない場合はしばらく待ってからブラウザをリロードして下さい【補足】4.2で Elastic IP
をメモし忘れた人は,作成した EC2インスタンス を選択し, Elastic IP
をメモして下さい
EC2インタスタンス
にログインするには,「ホスト名」「ユーザー名」「AWSからダウンロードしたキーペア(秘密鍵)」が必要になります。
これらをログインの度に毎回記述するのは面倒なので,設定ファイルに記載し,使える状態にしましょう。
vi ~/.ssh/config
Vim
エディタでファイルが開かれますので,以下を記述して下さい。(デフォルトで ec2-user
という名前のユーザーが用意されています)
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
の起動時は「ノーマルモード」i
を入力し,「インサートモード」に変更する必要がある
i
を入力しても効果が出ないので,「英数」入力モードに切り替えてから行うことesc
:wq
:q!
それでは, 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)」の設定を間違えている
マイIP
の場合は,IPアドレスが変わっていないかも確認しましょう(不明な場合は 任意の場所
に変更)4.1で設定したEC2 用のセキュリティグループが「アプリ名_ec2_security_group」になっていない
2.4で作成したルートテーブルの「サブネットの関連付け」を間違えている
(参考)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接続できるようにするには,アプリ名.pem
(秘密鍵)に対応する 公開鍵
を EC2
の ~/.ssh/authorized_keys
に配置し,適切な権限を与えておく必要があります。
ここでは同じ鍵を利用する前提で、 ec2-user
のものをコピーしてしまうことにしましょう。
APP_USER=ユーザー名
echo $APP_USER
sudo rsync --archive --chown=$APP_USER:$APP_USER ~/.ssh /home/$APP_USER
これで,新しく作成したユーザーでもログインができるようになりました。
ログイン時のユーザー名を変更しましょう。
vi ~/.ssh/config
ec2-user
から メモしたユーザー名
に変更しましょう。Host アプリ名
Hostname ElasticIP
User ユーザー名 ★ここを変更★
IdentityFile ~/.ssh/アプリ名.pem
Host aws_sample_app
Hostname 172.217.161.46
User take
IdentityFile ~/.ssh/aws_sample_app.pem
再度,以下のコマンドで EC2インスタンス
にログインしてみましょう。
ssh アプリ名
ec2-user
ではなく各自が決めたユーザー名でログインできるはずです。
デフォルトユーザーは必要なくなりましたので,削除しておきましょう。
sudo userdel -r ec2-user