#0015

AWSでWebサーバー構築!EC2を作成してSSH接続する(第3回)

2018-04-24 21:11 2019-02-22 14:39 "みやび"

みやびです(@miyabi_lab)。

連載『知識ゼロからAWS VPCネットワークを構築してセキュアな環境にEC2 Webサーバーを設置・運営する』の第3回です!

前回(第2回)の記事ではAWSにてWebサーバーを立てる際に必要な専門用語を解説し、VPCおよびサブネットを構築するところまでの手順を解説しました。

今回はその続きで、いよいよ本命のEC2インスタンスを作成します!

さらにセキュリティーグループによりEC2へのアクセスを保護し、SSHでの接続を確立させ、必要な初期設定を行うところまでの流れを詳しくご紹介していきます。

スポンサーリンク

前回(第2回)のおさらい

前回の「AWS専門用語の解説とVPC環境を構築する手順」では、Webサーバー構築に必要な専門用語を例を交えながら解説し、実際にAWSアカウントにてVPCおよびサブネットの構築まで達成する事ができました。

図で示すと以下の様な状態です。

この記事で目指す目標図

ここにEC2インスタンスを設置してインターネット経由でアクセスしてみたいと思います。

今回は、

  • 構築したVPCネットワークへのEC2インスタンスの作成
  • EBSとセキュリティーグループの作成
  • EC2インスタンスへのSSH接続および初期設定

の順番にご紹介していきます。この記事(第3回)の完成イメージは以下の通りになります。

第3回の記事で目指す目標図

なお、各用語については前回(第2回)の記事にすべてまとめてありますのでそちらをご覧ください。

EC2インスタンスを作成する

それではAWSコンソールから新しくEC2インスタンスを設置するための作業手順をみていきましょう。

ステップ0:EC2インスタンスの作成

AWSコンソールのサービス一覧からEC2の項目を選択し、以下の画面からインスタンスを作成ボタンをクリックします。

EC2インスタンス作成

ステップ1:AMIを選択する

最初のステップではAMI(Amazonマシンイメージ)を選択します。

AMI選択画面からAmazon Linux 2を選ぶ

EC2そのものはコンピューティングリソースのレンタルなので、AMIを用いて基盤となるソフトウェア構成を導入する作業が必須となります。

今回は最新の「Amazon Linux 2 LTS Candidate 2 AMI (HVM), SSD Volume Type」を選択して次に進みます。

ステップ2:インスタンスタイプを選択する

EC2インスタンスには、t2.nanoやm4.largeなどの様々なタイプがあり、一般的には数値が大きくなるほど、英単語のスケールが大きくなるほど、スペックが上がっていくと思ってください。

EC2のインスタンスタイプを選択する

今回は無料利用枠が提供されているので、せっかくなのでこれを使います。Webサイトを新規で作成する程度ならこれで十分でしょう。

また、運営するサービスのアクセスが急増するなどスペック変更したくなる場合が出てくるかと思いますが、AWSであれば後からインスタンスタイプを変更する事が可能です。

変更にあたってはいくつか条件があるので、詳しくはインスタンスのサイズ変更に関する公式ドキュメントをご覧ください。

それでは、t2.microを選択して次に進みます。

(※確認と作成ボタンではなく、次の手順をクリックしてください!)

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

ここは少し細かいですが、ひとつずつ理解した上で設定していきましょう。

EC2のインスタンスタイプを選択する

それぞれの項目について段落を分けて解説していきます。

インスタンスの数

そのままですね。現在は1つしか必要ではないので1を設定してください。

(※最終目標では踏み台サーバというものを作成するので後ほどもう1つ追加します)

ネットワークとサブネット

前回作成したVPCとサブネットを選択してください。

自動割り当てパブリックIP

有効化にしてください。無効にするとなぜか後から有効にすることができません

自動割り当てはインスタンスを再起動する度に新しく割り当てられるので、このIPアドレスをベースにした処理の構築はおすすめできません。

これは、後ほど解説するEIP(Elastic IP :固定パブリックIP)を取得することで解決できます。

ただし、最終的な目標は「メインのEC2はプライベートサブネットに隔離する」ことなので、現時点では有効にして使用しますが、将来的にこのインスタンスが自動で割り当てられたパプリックIPアドレスは使用しません。

IAMロール

AWSでは、各ユーザーアカウントをIAM(AWS Identity and Access Management:アイアムと読みます)というサービスで管理しており、グループやロール(役割)などを非常に細かいレベルで個々のユーザーに振り分けることができます。

この機能を用いることで、例えばAさんはEC2の起動や停止に関わる操作を実行できるが、Bさんはそれができない。一方でBさんが...といったように、管理者の属性やレベルに応じて役割を変更することが可能です。

ここでは、IAMサービスにてロールを新規作成し、(もし複数人でEC2を管理するのならば)あなたの仲間にロールを割り当ててあげることで、EC2の管理権限を付与したり、逆に外したりすることができます。

今回のケースでは個人でのAWS管理を想定しているので、 IAM項目は「なし」としておきます。

IAMに関する公式ドキュメントはこちら

シャットダウン操作

停止を選択してください。

削除保護の有効化

僕自身まだ恩恵を受けたことはありませんが、念のため有効にしておきます。後から変更することも可能です。

モニタリング

ここで出てくるCloudWatchは、AWSにおける監視ツールとしてのサービスです。

CPU使用率やトラフィックの監視、EBSボリュームの確認、ELB(ロードバランサー)のモニタリングなど、AWSにおける様々なサービスが正常に稼働しているかをチェックし、異常を検知したらアラートを出すといった機能が利用できます。

こちらは有料であるということと、現時点ではあまり必要性を感じないので無効のままでいきます。

CloudWatchに関する公式ドキュメントはこちら

テナンシー

AWSにおけるテナンシーの項目では、ハードウェアを物理的に占有するかどうかについて尋ねられています。

他のインスタンスからの影響を受けないという点がメリットですが、今はお金を払ってそんな贅沢なことをする必要は全くないので、こちらは共有にしておきます。

T2無制限

いわゆる限界突破です。通常時はt2.microタイプでお安く運用していく予定ですが、例えば、何かの拍子に記事がバズったり、テレビで関連する内容が放送されたりして、瞬間的に大量のアクセスがあったとします。

このとき、T2無制限を有効にしておけばCPUが100%で頭打ちになることなく、一時的にリソースを拡大して全てのアクセスを処理しようと試みます

ただし、一時的にCPUを大量に使用するため、超過分について別途料金を徴収されます。

アクセスに対する採算が取れる見込みがあれば有効にしても良さそうですが、今回は予期せぬ暴発や攻撃によるCPUオーバーフローを防ぐために無効としておきます。

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

インスタンスの詳細設定は完了しましたでしょうか?次はストレージの追加についてです。

これまでに何度か説明してきましたが、EC2はコンピューティングリソースですので、EBSなどのボリュームをアタッチする形でデータを保存できるようにします。

EC2にアタッチするストレージを設定する

今回は無料枠が30GiBあるので最大まで付与しました。

(※が、最終目標ではEC2インスタンス+EBSのペアを2つ作成するので、後ほど作成するEC2用に8GiBほど空けておいてもいいかもしれません)

合わせて削除のチェックは、もしEC2インスタンスを削除した時にEBSも同時に消すかどうかの判断ですが、こちらはお好みで構いません。

僕は他にRDSなどのデータストレージを利用していないので、念のため分離しています。

ステップ5:タグの追加

AWSではEC2以外にもタグを設定できます。

同じようなインスタンスが複数あるなど、ネットワークが複雑になってきた時に重宝します。

EC2インスタンスにタグを追加する

小規模なネットワークでは、インスタンスやセキュリティーグループは数える程しか利用しないので、タグをつけなくても名前で判断できると思います。

僕の場合、最初はつけていましたが、後々何の恩恵にも預かれなかったので、必要になったらつければいいと思います。

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

EC2はセキュリティーグループと呼ばれるファイアウォール構造で保護し、特定のポート(今回は:80と:22)のみを通過させるように設定します。

VPCネットワークを構築する上で、セキュリティーグループは非常に重要な役割を果たします。ここはしっかりと理解しておくようにしましょう。

EC2のセキュリティーグループを設定する

セキュリティーグループとは何か?

セキュリティーグループは以下の図において「黄色と黒の波線」で示される領域です。

第3回の記事で目指す目標図

この領域というのはあくまでも概念であり、実際には異なるサブネットやAZにも範囲を拡大することができます。

イメージとしては、1つのセキュリティーグループを作成し、それと同じ条件で内包したいものすべてに紐づける、といった感じです。

前回(第2回)の記事の用語解説にて、例えを交えた解説を掲載してありますので、詳しくはそちらをご覧ください。

ページが分かれていて閲覧が面倒かと思うので、念のため前回の記事の該当部分を引用しておきます。

セキュリティグループは一種のファイアウォールのような概念であり、インバウンド(入ってくる受動的な通信)とアウトバウンド(出て行く自発的な通信)それぞれのポートと場所を制御することができます。

例えば、『後述するEC2インスタンス(Webサーバー)へのインターネット経由のアクセスはHTTP(:80)とHTTPS(:443)とSSH(:22)だけに制限したい!』といった場合には、セキュリティーグループを作成し、上記のポートのみ許可する旨を記載し、そこにEC2インスタンスを内包します。

イメージとしては、EC2(=城)をセキュリティグループ(=石垣)で守り、特定のアクセス(=:80などの通行許可証を持ってる人)のみ出入りを許可する、という感じです。

インバウンドとアウトバンドにはポート以外にも、どこからのアクセスを許可するか(=インバウンド:自宅IPのみ?誰でもOK?など)や、どこへのアクセスを許可するか(=アウトバウンド:別のサブネットのみ?IGWを通じて外の世界へ?)といった場所についても別々に指定することができます。

設定項目について

まず、EC2インスタンスを立てる際にセキュリティーグループは必要不可欠です。

新規作成にチェックをつけて名前を決定します。今回は「plan-sg-web」としていますが、将来的にはプライベートサブネット内にEC2インスタンスを内包する予定なので、「plan-sg-private」と同義であると思ってください。

次に、タイプ等のルールを決めていきますが、ここで設定できるのはインバウンドのみになるので注意してください!アウトバウンドの設定が必要な場合は作成後に別途設定します。

今回は、

  • SSH(:22)を経由して自分のパソコンのIPアドレスからのアクセスのみを許可する
  • HTTP(:80)を経由して世界中のどこからでもアクセスできるようにする
  • HTTPS(:443)を経由して世界中のどこからでもアクセスできるようにする

の3種類のルールを設定しました。HTTPSについては後ほど設定するので、予めこの段階で入れておきます。

この時、ソース欄に「0.0.0.0/0, ::/0」と自動入力された場合、後半の「,::/0」は消してしまって構いません

カンマの前がIPv4、後ろがIPv6の設定ですが、前回の記事の「IPv6 CIDRブロックは必要か?」の見出し下で解説した理由からIPv4のみ利用します。

これにより、上述した3つのルール(に該当するアクセスを通すためのゲート)の設定が完了しました。これ以外のアクセスは遮断する、これがセキュリティーグループのファイアウォールとしての役割です。

ちなみに、一番右の説明欄に日本語を入力すると以下のように怒られるので注意!

説明に日本語を入れるとエラーになる

ステップ7:確認する

これでEC2インスタンス作成に関する一通りの設定が完了しました。

最後の確認画面で内容をチェックし、問題なければ作成ボタンを押してください。

設定を確認する

ここで、以下のようなキーペア作成ダイアログが表示されます。

キーペアとは、作成したEC2インスタンスに初めてSSH接続する際に必要な、公開鍵認証用の秘密鍵ファイル(*.pemファイル)のことです。

必ずダウンロードして紛失しないように保管しておきましょう。保存場所は(Macの場合)ユーザーのホームディレクトリ直下の.sshディレクトリ内に保存しておくと後々便利です(/Users/username/.ssh/***.pem)。

ダウンロードしたのち、インスタンスの成功すると以下のような画面に移ります。

請求書の予定請求額が設定した金額を超過した場合の「請求アラート」も任意で設定可能です。

成功した時の画面

インスタンスの作成には数分程度かかるので、終わるまでしばらく待ちます。

進捗はサイドメニューのインスタンスから確認でき、ステータスが緑色の「runnning」になれば使用できます。

コマンドラインからSSH接続する

それでは、作成したEC2インスタンスに、先ほどダウンロードした秘密鍵を用いて接続してみましょう。

Macの場合、まず画面右上の検索窓から「ターミナル.app」を探して起動します。

接続前にダウンロードした秘密鍵のパーミッション(権限)を変更しておきます(~:チルダは現在のユーザーのホームディレクトリを指します)。

$ chmod 600 ~/.ssh/***.pem

そこから以下のコマンドを打ってEC2インスタンスに接続を試みます。

$ ssh -i 【秘密鍵を保存した場所/***.pem】 ec2-user@【パブリックIPアドレス】

Amazon Linux 2のデフォルトユーザーはec2-userになります。

パブリックIPアドレスは、サイドメニューのインスタンスをクリックし、作成したものの行を右に見ていくと書いてあります。

例えばこんな感じです。

$ ssh -i ~/.ssh/*.pem ec2-user@100.100.100.100

SSH接続のデフォルトポートは22番なので、セキュリティーグループの方でこれを別の数値に設定した場合は、-p 22 のようにオプションと数値をつけてください。

ダイアログが表示されますが「許可」をクリックして接続します。

ログインに成功すると以下のようなロゴが現れます。

Last login: Tue Apr 24 00:00:00 2018 from -----

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 73 packages available
Run "sudo yum update" to apply all updates.

ここでログインに失敗する(いつまで待っても応答がない)場合、EC2インスタンスが正常に起動していないことや、セキュリティーグループのインバウンド・アウトバウンドのSSH設定が間違っているなどの原因が考えられます。

始めにご紹介した各種設定をもう一度確認し、ネットワークをイメージし、アクセスの経路がどこかで失われていないか確認してください。

EC2の初期設定

SSHでの接続を確認したら最低限の初期設定をしていきます。

yumをアップデートしておく

ログイン完了後のロゴの下、最後の2行に「yumをアップデートしてください」と出ているかと思いますので、このタイミングで忘れないうちにアップデートしておきましょう。

$ sudo yum -y update

yumはご存知の方も多いと思いますが、CentOSなどに代表されるLinuxのRedHat系ディストリビューションで利用されるパッケージ管理ツールで、Amazon Linux 2についても同様に利用していきます。

yオプションは、すべてのアップデート確認について「yes」と答えるものです。ここで失敗する事はまずないので、-yをつけて実行してOKです。

余談ですが、ここから頻繁に出てくる「sudo」についてですが、これはec2-userなどの一般ユーザーが、後に続くコマンドを一時的にrootユーザーとして実行できるコマンドです。簡単に言うと界王拳です。

yumなどの管理系ツールやアプリケーションの再起動、権限のないファイルの編集などは一般ユーザーでは許可されていないのでsudoをつけて実行します。

また、sudoが使えるユーザーはその旨を設定する必要がありますが、デフォルトのec2-userはsudo権限を持っています

ホスト名を恒久的に変更する

NewServerNameの部分をお好きなホスト名に変更してください。

# CentOS7 / Amazon Linux 2 で利用可能
$ sudo hostnamectl set-hostname NewServerName

# 確認
$ hostname

Timezoneに日本時間を設定する

以下のコマンドを順番に実行して日本時間を設定してください。

# 現在時間の確認(9時間ずれてるはず)
$ date

# ファイル編集:以下の2行を書き込んで「:wq」で保存して終了
$ vi /etc/sysconfig/clock

ZONE="Asia/Tokyo" 
UTC=false

# ファイルの上書き
$ cp /usr/share/zoneinfo/Japan /etc/localtime

# 再起動(一度ログアウトさせられます)
$ sudo reboot

# 再ログイン&再確認
# ※IPアドレスが変わってたら再度調べて書き換えてください
$ ssh -i ~ # (略)
$ date

新しいユーザーを追加する(sudo権限あり)

新規ユーザーの追加もコマンドから実行します。こうした最初の作業で早めにコマンド操作に慣れてしまいましょう

まずは追加するユーザー名を決めて、以下のコマンドを打ちます。ここでは「miyabi」としました

$ sudo useradd miyabi

ここでssh-keygenコマンドを用いて自分専用の秘密鍵を作ることも可能ですが、今回は割愛して、最初にダウンロードしたものを自分用として使います。

秘密鍵でログインしているので必要ないかもしれませんが、念のためパスワードの設定方法も書いておきます。

$ sudo passwd miyabi

これだけです。パスワードは打っても表示されないので、別で書いたものをコピペしましょう。

一般ユーザーにsudo権限を許可する場合はvisudoを以下のように編集します。

$ sudo visudo

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
miyabi  ALL=(ALL)       NOPASSWD: ALL

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

こんな感じでmiyabiから始まる行を追加し、%wheelの行を有効にしてください。

操作はviコマンドで、挿入したい部分から文字を打ち始め、キーボードのescで編集を抜け出し、「:wq」で保存&終了します。

また、新しく作成したユーザーをwheelグループに追加しておきましょう。

# ユーザー(miyabi)をwheelグループに追加
$ sudo usermod -aG wheel miyabi

# miyabiの所属グループを確認する
$ groups miyabi

以上で新規ユーザーの作成および設定は完了です!

sshディレクトリを一式コピーする

今後は上で作成したユーザーを主に活用していくはずなので、ec2-userのホームディレクトリにあった公開鍵をmiyabiホームディレクトリにコピーしておきます。

複数ファイルをcpコマンドで移そうとして失敗し痛い目を見たことがあるので、今度はrsyncコマンドを使います。

また、移動させたディレクトリ配下の権限を全てmiyabiに変更しておきましょう。これをやっておかないとpermission deniedでログインできません。

(※もしコピー先に.sshディレクトリが存在しなかったら、ディレクトリごと移して構いません)

# miyabi(作成したユーザー)のホームディレクトリに.sshディレクトリを移動
$ sudo rsync -avz ~/.ssh/authorized_keys /home/miyabi/.ssh/

# 【追記 2019.02.21】 sudoで移したので所有者がrootになっているので、これを対象ユーザーの所有物にする
$ sudo chown -R miyabi:miyabi /home/miyabi/.ssh

コピーしたファイルはlsコマンドで確認しましょう。aオプションをつけてドットで始まる隠しファイルも表示します。lオプションは詳細表示です。Rオプションは再帰的に(ディレクトリの隅々まで)検索します。

$ sudo ls -alR /home/miyabi

ちなみに、こんな面倒なことをしなくてもec2-userの名前を変更すれば終わるのですが、次回以降は上記の手順&キーペアの新規作成を伴うので、念のためこの方法でご紹介しました。

最後に、ec2-userをログアウトしてmiyabiにログインしましょう。

# ec2-userをログアウト
$ logout

# miyabiでログイン
$ ssh -i 【秘密鍵を保存した場所/***.pem】 miyabi@【パブリックIPアドレス】

無事にログインできましたか?ここからの作業はすべてmiyabi(に相当するユーザー)でログインして操作していきます。

sudoコマンドが通るか確認したのち、必要がなければec2-userは消してしまっても構いません

# ホームディレクトリごと削除
$ sudo userdel -r ec2-user

余談ですが、rootユーザーに昇格して操作を実行する場合は、以下のコマンドを利用します。

$ sudo su -

この場合、常にすべての権限を有することになるので、操作は慎重に行ってください。

なお、デフォルトでは最初からrootでログインすることを設定で禁止しています。変更可能です。

第3回のまとめ

お疲れ様でした!ここまでの作業で、前回作成したサブネット内にセキュリティーグループで保護されたEC2インスタンスを設置して、SSH接続でアクセスすることができました。

第3回の記事で目指す目標図

また、基本的な初期設定も完了したので次回(第4回)は、

  • Apache, MySQL, PHP7のインストールおよび各種設定
  • HTTP(:80)接続の確立

について作成していきましょう。

次回まで終わらせると、以下のようなネットワークが完成します。

第4回の記事で目指す目標図

次回の最後まで設定が完了すると、ようやくWebサーバーとして稼働することができます。

ここまでの流れで躓いてしまったり、よく理解できない部分などがありましたらお問い合わせフォームからご連絡ください。完成するまで責任を持ってしっかりサポートいたします!

引き続きどうぞよろしくお願いいたします!

連載(知識ゼロからAWS VPCネットワークを構築してセキュアな環境にEC2 Webサーバーを設置・運営する)の記事一覧

この記事を書いた人

Webエンジニア PHPエンジニア HTML CSS JS jQuery PHP Laravel Python SQL WordPress AWS Linux Apache

【名前】 "みやび"

【関連】 株式会社PLAN / MIYABI Lab / JAPAN MENSA /

【MIYABI Lab】平日オフィスを勉強用に解放中!みんなで楽しくプログラミングを学べる環境を作る!詳しくはコチラ(https://miyabi-lab.space)◆HTML, CSS, JS, PHP, Python, SQL, AWS◆生物学系修士→製薬会社→Webエンジニア(株式会社PLAN)・MENSA会員

Twitterやってます

最新の技術ブログはこちら