【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
2018-04-24 21:11 2019-02-22 23:39
みやびです(@miyabi_lab)。
連載『知識ゼロからAWS VPCネットワークを構築してセキュアな環境にEC2 Webサーバーを設置・運営する』の第3回です!
前回(第2回)の記事ではAWSにてWebサーバーを立てる際に必要な専門用語を解説し、VPCおよびサブネットを構築するところまでの手順を解説しました。
今回はその続きで、いよいよ本命のEC2インスタンスを作成します!
さらにセキュリティーグループによりEC2へのアクセスを保護し、SSHでの接続を確立させ、必要な初期設定を行うところまでの流れを詳しくご紹介していきます。
前回の「AWS専門用語の解説とVPC環境を構築する手順」では、Webサーバー構築に必要な専門用語を例を交えながら解説し、実際にAWSアカウントにてVPCおよびサブネットの構築まで達成する事ができました。
図で示すと以下の様な状態です。
ここにEC2インスタンスを設置してインターネット経由でアクセスしてみたいと思います。
今回は、
の順番にご紹介していきます。この記事(第3回)の完成イメージは以下の通りになります。
なお、各用語については前回(第2回)の記事にすべてまとめてありますのでそちらをご覧ください。
それではAWSコンソールから新しくEC2インスタンスを設置するための作業手順をみていきましょう。
AWSコンソールのサービス一覧からEC2の項目を選択し、以下の画面からインスタンスを作成ボタンをクリックします。
最初のステップではAMI(Amazonマシンイメージ)を選択します。
EC2そのものはコンピューティングリソースのレンタルなので、AMIを用いて基盤となるソフトウェア構成を導入する作業が必須となります。
今回は最新の「Amazon Linux 2 LTS Candidate 2 AMI (HVM), SSD Volume Type」を選択して次に進みます。
EC2インスタンスには、t2.nanoやm4.largeなどの様々なタイプがあり、一般的には数値が大きくなるほど、英単語のスケールが大きくなるほど、スペックが上がっていくと思ってください。
今回は無料利用枠が提供されているので、せっかくなのでこれを使います。Webサイトを新規で作成する程度ならこれで十分でしょう。
また、運営するサービスのアクセスが急増するなどスペック変更したくなる場合が出てくるかと思いますが、AWSであれば後からインスタンスタイプを変更する事が可能です。
変更にあたってはいくつか条件があるので、詳しくはインスタンスのサイズ変更に関する公式ドキュメントをご覧ください。
それでは、t2.microを選択して次に進みます。
(※確認と作成ボタンではなく、次の手順をクリックしてください!)
ここは少し細かいですが、ひとつずつ理解した上で設定していきましょう。
それぞれの項目について段落を分けて解説していきます。
そのままですね。現在は1つしか必要ではないので1を設定してください。
(※最終目標では踏み台サーバというものを作成するので後ほどもう1つ追加します)
前回作成したVPCとサブネットを選択してください。
有効化にしてください。無効にするとなぜか後から有効にすることができません。
自動割り当てはインスタンスを再起動する度に新しく割り当てられるので、このIPアドレスをベースにした処理の構築はおすすめできません。
これは、後ほど解説するEIP(Elastic IP :固定パブリックIP)を取得することで解決できます。
ただし、最終的な目標は「メインのEC2はプライベートサブネットに隔離する」ことなので、現時点では有効にして使用しますが、将来的にこのインスタンスが自動で割り当てられたパプリックIPアドレスは使用しません。
AWSでは、各ユーザーアカウントをIAM(AWS Identity and Access Management:アイアムと読みます)というサービスで管理しており、グループやロール(役割)などを非常に細かいレベルで個々のユーザーに振り分けることができます。
この機能を用いることで、例えばAさんはEC2の起動や停止に関わる操作を実行できるが、Bさんはそれができない。一方でBさんが...といったように、管理者の属性やレベルに応じて役割を変更することが可能です。
ここでは、IAMサービスにてロールを新規作成し、(もし複数人でEC2を管理するのならば)あなたの仲間にロールを割り当ててあげることで、EC2の管理権限を付与したり、逆に外したりすることができます。
今回のケースでは個人でのAWS管理を想定しているので、 IAM項目は「なし」としておきます。
停止を選択してください。
僕自身まだ恩恵を受けたことはありませんが、念のため有効にしておきます。後から変更することも可能です。
ここで出てくるCloudWatchは、AWSにおける監視ツールとしてのサービスです。
CPU使用率やトラフィックの監視、EBSボリュームの確認、ELB(ロードバランサー)のモニタリングなど、AWSにおける様々なサービスが正常に稼働しているかをチェックし、異常を検知したらアラートを出すといった機能が利用できます。
こちらは有料であるということと、現時点ではあまり必要性を感じないので無効のままでいきます。
AWSにおけるテナンシーの項目では、ハードウェアを物理的に占有するかどうかについて尋ねられています。
他のインスタンスからの影響を受けないという点がメリットですが、今はお金を払ってそんな贅沢なことをする必要は全くないので、こちらは共有にしておきます。
いわゆる限界突破です。通常時はt2.microタイプでお安く運用していく予定ですが、例えば、何かの拍子に記事がバズったり、テレビで関連する内容が放送されたりして、瞬間的に大量のアクセスがあったとします。
このとき、T2無制限を有効にしておけばCPUが100%で頭打ちになることなく、一時的にリソースを拡大して全てのアクセスを処理しようと試みます。
ただし、一時的にCPUを大量に使用するため、超過分について別途料金を徴収されます。
アクセスに対する採算が取れる見込みがあれば有効にしても良さそうですが、今回は予期せぬ暴発や攻撃によるCPUオーバーフローを防ぐために無効としておきます。
インスタンスの詳細設定は完了しましたでしょうか?次はストレージの追加についてです。
これまでに何度か説明してきましたが、EC2はコンピューティングリソースですので、EBSなどのボリュームをアタッチする形でデータを保存できるようにします。
今回は無料枠が30GiBあるので最大まで付与しました。
(※が、最終目標ではEC2インスタンス+EBSのペアを2つ作成するので、後ほど作成するEC2用に8GiBほど空けておいてもいいかもしれません)
合わせて削除のチェックは、もしEC2インスタンスを削除した時にEBSも同時に消すかどうかの判断ですが、こちらはお好みで構いません。
僕は他にRDSなどのデータストレージを利用していないので、念のため分離しています。
AWSではEC2以外にもタグを設定できます。
同じようなインスタンスが複数あるなど、ネットワークが複雑になってきた時に重宝します。
小規模なネットワークでは、インスタンスやセキュリティーグループは数える程しか利用しないので、タグをつけなくても名前で判断できると思います。
僕の場合、最初はつけていましたが、後々何の恩恵にも預かれなかったので、必要になったらつければいいと思います。
EC2はセキュリティーグループと呼ばれるファイアウォール構造で保護し、特定のポート(今回は:80と:22)のみを通過させるように設定します。
VPCネットワークを構築する上で、セキュリティーグループは非常に重要な役割を果たします。ここはしっかりと理解しておくようにしましょう。
セキュリティーグループは以下の図において「黄色と黒の波線」で示される領域です。
この領域というのはあくまでも概念であり、実際には異なるサブネットや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」と同義であると思ってください。
次に、タイプ等のルールを決めていきますが、ここで設定できるのはインバウンドのみになるので注意してください!アウトバウンドの設定が必要な場合は作成後に別途設定します。
今回は、
の3種類のルールを設定しました。HTTPSについては後ほど設定するので、予めこの段階で入れておきます。
この時、ソース欄に「0.0.0.0/0, ::/0」と自動入力された場合、後半の「,::/0」は消してしまって構いません。
カンマの前がIPv4、後ろがIPv6の設定ですが、前回の記事の「IPv6 CIDRブロックは必要か?」の見出し下で解説した理由からIPv4のみ利用します。
これにより、上述した3つのルール(に該当するアクセスを通すためのゲート)の設定が完了しました。これ以外のアクセスは遮断する、これがセキュリティーグループのファイアウォールとしての役割です。
ちなみに、一番右の説明欄に日本語を入力すると以下のように怒られるので注意!
これでEC2インスタンス作成に関する一通りの設定が完了しました。
最後の確認画面で内容をチェックし、問題なければ作成ボタンを押してください。
ここで、以下のようなキーペア作成ダイアログが表示されます。
キーペアとは、作成したEC2インスタンスに初めてSSH接続する際に必要な、公開鍵認証用の秘密鍵ファイル(*.pemファイル)のことです。
必ずダウンロードして紛失しないように保管しておきましょう。保存場所は(Macの場合)ユーザーのホームディレクトリ直下の.sshディレクトリ内に保存しておくと後々便利です(/Users/username/.ssh/***.pem)。
ダウンロードしたのち、インスタンスの成功すると以下のような画面に移ります。
請求書の予定請求額が設定した金額を超過した場合の「請求アラート」も任意で設定可能です。
インスタンスの作成には数分程度かかるので、終わるまでしばらく待ちます。
進捗はサイドメニューのインスタンスから確認でき、ステータスが緑色の「runnning」になれば使用できます。
それでは、作成した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設定が間違っているなどの原因が考えられます。
始めにご紹介した各種設定をもう一度確認し、ネットワークをイメージし、アクセスの経路がどこかで失われていないか確認してください。
SSHでの接続を確認したら最低限の初期設定をしていきます。
ログイン完了後のロゴの下、最後の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
以下のコマンドを順番に実行して日本時間を設定してください。
# 現在時間の確認(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
新規ユーザーの追加もコマンドから実行します。こうした最初の作業で早めにコマンド操作に慣れてしまいましょう。
まずは追加するユーザー名を決めて、以下のコマンドを打ちます。ここでは「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
以上で新規ユーザーの作成および設定は完了です!
今後は上で作成したユーザーを主に活用していくはずなので、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でログインすることを設定で禁止しています。変更可能です。
お疲れ様でした!ここまでの作業で、前回作成したサブネット内にセキュリティーグループで保護されたEC2インスタンスを設置して、SSH接続でアクセスすることができました。
また、基本的な初期設定も完了したので次回(第4回)は、
について作成していきましょう。
次回まで終わらせると、以下のようなネットワークが完成します。
次回の最後まで設定が完了すると、ようやく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会員
【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
【AWS】Auto Scalingする前に知っておくべき7つのこと
Amazon EC2 Auto Scaling(オートスケール)を使用すると、CPU使用率等に応じてEC2の台数を自動的に増減できます。ここでは、初心者の持つ疑問を通し...
WordPressの基本構造を理解してオリジナルテーマを作ろう(後半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやstyle.css)の役割やファイル構造を理解して、どのようにオリジナ...
WordPressの基本構造を理解してオリジナルテーマを作ろう(前半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやfront-page.php)の役割やファイル構造を理解して、どのようにオ...
【Heroku入門】無料枠サーバーを24時間スリープさせない方法
フリープランのHerokuサーバーでは、30分以上アクセスがないと自動的にスリープしてしまいます。ここでは、Herokuサーバーを寝かせない方法につい...
【入門編】Laravelのディレクトリ構造とMVCの処理の流れを理解する
Laravel初心者が学習する際にわかりにくいLaravelのディレクトリ構造を具体的な例を交えて解説します。MVCの基本であるビュー、モデル、コントロー...
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発
誰でも簡単にLINEBotをpythonを使ってHeroku環境で開発できる方法を解説します。ここでは、LINE Messaging APIを用いることでおうむ返しをするBot...
AWSでWebサーバー構築!踏み台サーバーでセキュアなネットワークを構築する(第5回)
連載の第5回です。メインEC2に対して直接SSH接続できる状態というのは、セキュリティの観点からあまり望ましくありません。MySQLやEBSが紐づいたメ...
AnacondaでのTensorFlow環境構築と基礎的な使い方
Anaconda(アナコンダ)のインストールからJupyter notebook(ジュピターノートブック)とTensorFlow(テンサーフロー)の基本的な使い方を初心者...
脱初心者!MNIST beginnerに隠れ層を加えたニューラルネット解説
TensorFlowのチュートリアルであるMNIST beginnerの応用して、隠れ層と活性化関数を加えたニューラルネットワークで手書き文字識別を解説します。...
AWSでWebサーバー構築!Apache2.4, PHP7, MySQLの導入と初期設定(第4回)
連載の第4回です。今回は作成したEC2インスタンスにWebサーバーとしての機能を持たせるため、Apache2.4のインストールおよびhttpd.conf等の各種設...
AWSでWebサーバー構築!EC2を作成してSSH接続する(第3回)
連載の第3回です。前回作成したVPC・サブネットにおいて、セキュリティーグループに保護されたEC2インスタンスの作成・設定およびSSH接続の確立ま...
初心者必読!MNIST実行環境の準備から手書き文字識別までを徹底解説!
Pythonによる機械学習をプログラミング初心者にもわかりやすいように、TensorFlowチュートリアルのMNIST beginnerを使って、手書き文字(MNIST)識別...
AWSでWebサーバー構築!専門用語の解説とVPC環境を構築する手順(第2回)
連載の第2回です。AWSにてVPCネットワークを構築してWebサーバーを設置・運用するためには、AWS内で利用される重要単語について正しく理解しておく...
知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識
機械学習・AIを理解するために必要なニューラルネットワークの基礎について、これから機械学習を勉強したい人、プログラミング未経験の人にもわか...
Canvaで簡単におしゃれなアイキャッチ画像を作ろう!使い方を徹底解説!
PhotoshopやIllustratorを使えなくてもCanvaなら誰でも簡単におしゃれなアイキャッチ画像が作れます。豊富なデザインテンプレートを組み合わせるだ...
プレビュー機能付きの記事編集画面の作り方(Laravel5)
記事編集フォームにはプレビュー機能の実装が必須です。記事を保存する処理とプレビューを表示する処理を共存させるにあたり、ボタンをクリックし...
AWSでWebサーバー構築!VPC設計に必要なIPアドレスとサブネットの基礎知識(第1回)
連載の第1回です。AWSのVPCネットワークを設計して実際に構築するためには、IPアドレスの基礎を理解することが非常に大切です。EC2 Webサーバーを...
MIYABI Labホームページを製作しました
様々な理由でプログラミングの勉強を困難だと感じてしまっている方のお役に立てれば嬉しいです。これからも小さなWebサービスを作り続けていき、技...
ゆざ、株式会社PLANを卒業します。
2年間インターンとしてお世話になった株式会社PLANを卒業します。AWS,Laravel,Pythonなどの技術的なことだけではなく、エンジニアとして、社会人と...