Edited at

【AWS初心者向け】AWSでWebサーバーとデータベースを構築して、ブラウザにデータを表示する【ハンズオン】


はじめに


想定読者

AWS未経験者、初学者、非インフラエンジニア


簡単に自己紹介

システムエンジニア(2年目)(非インフラ)

AWS歴3ヶ月(独学)

最初の1ヶ月の勉強方法はこちら(インフラ知識ゼロの2年目プログラマーがAWS SAAに1ヶ月で合格した方法


この記事の目的

上記の想定読者ができるだけ少ない負担でAWSに触れ、実際に動かしてみること

私自身がAWSを勉強する前に感じていたインフラ・AWSに対する敷居の高さを少しでも払拭できないかという思いがあり、

もし自分が初心者向けにAWSのハンズオンをするならこういうことをしたいなという内容をそのまま記事にしました。

初心者が書いた記事なので、間違い等あれば指摘いただけると幸いです。

また、この記事で紹介するインフラ構成、構築方法はあくまで練習のための最低限のものなので、実際にサービスを構築・運用する際の参考にはならないことをご了承ください。


ゴール

AWS上でWebサーバー、データベースを構築し、データベースに登録したデータをブラウザで表示すること

スクリーンショット 2019-10-02 17.38.14.png

(userテーブルのid,nameカラムを表示)

できるだけ丁寧な解説を心掛けますが、わからない用語、手法が出てくるかもしれません。

ただ、進めていく中で理解できることもあると思うので、とりあえずやってみていただければと思います。

Macユーザー向けに書いていますが、Macの仕様に沿って動かしている箇所をWindowsに置き換えていただければ動作すると思います。(SSH接続でターミナルで動かすかわりにTeraTermを導入するなど)


下準備


この記事で扱うAWSの用語

AWSには用語がたくさんありますが、この記事で扱うものだけざっくり紹介します。最初はイメージしにくいかもしれないので、流し読みでも大丈夫です。


リージョン

AWSがサービスを提供している国の地域のこと

(東京リージョン、オレゴンリージョン、ロンドンリージョンなど)


AZ

・リージョン内のデータセンターのこと

・耐障害性を高めるため一つのリージョン内に複数のAZがある


VPC

Virtual Private Cloud

・AWS上の閉域(自分専用の)ネットワーク

・VPCを作成して、その中にサーバーなどを構築していく


サブネット

・VPC内でさらに細かく区切った任意のネットワークの範囲。

・Webサーバーはパブリックサブネットに配置し、データベースはプライベートサブネットに構築するなど、用途による切り分けができる。(パブリックサブネットとプライベートサブネットの違いは、インターネットと直接通信するかどうか)


EC2

Elastic Compute Cloud

・仮想サーバー

・ひとつひとつのサーバーはEC2インスタンスと呼ばれる。

・WindowsServer、LinuxなどOSの選択可能


RDS

Relational Database Service

・AWSが提供するRDBのサービス

Amazon Aurora、Oracle、SQL Server、PostgreSQL、MySQL、MariaDBから選択可能


IAM

Identity and Access Management

・簡単に言うとユーザーアカウント機能

・ルートユーザー(AWSに登録したアカウント)との差別化を図る

・各サービスのアクセス権限を設定できる


構成

簡単に構成を説明します。こちらも最初は流し読みでも大丈夫です。

ハンズオンを終えた後だとかなり理解しやすくなっていると思うので、もう一度見てみてください。

Untitled Diagram.jpg

AWS Cloud(AWSのネットワーク全体)、リージョン、アベイラビリティゾーンはAWSアカウントを作成していなくても存在しています。

AWSアカウントを作成すると、任意のリージョンの中に存在している状態になります。(初期設定はオレゴンリージョン)

まず初めに、自分が使用するネットワークの範囲を決めるために、VPCを作成します。

WebサイトなのでEC2(サーバー)は外部に公開します。データベースはセキュアな状態にしたいので外部に公開しません。

そのため、サブネットを外部に公開するものとしないものに分けて(パブリックサブネット、プライベートサブネット)その中にそれぞれWebサーバーとデータベースを構築します。

データベースに接続できるのはWebサーバーのみとします。

外部のネットワークとの通信には、インタネットゲートウェイと呼ばれる、サーバーがインターネット上と通信するための窓口が必要なので、VPC内に構築し、Webサーバーと紐づけを行います。これでWebサーバーがインターネットと通信することが可能になります。

以上が今回構築していくインフラ構成になります。


前提

AWSアカウントの登録は完了している状態とします。

AWS アカウント作成

また、ルートユーザー(AWSアカウントを登録したユーザー)と、実際にAWS上でサーバー構築などの作業を行うユーザーは分けることをAWS側が推奨しています。(全権限を持つルートユーザーで作業を行うのは非推奨。)

そのため、IAMユーザーを作成しておき、そのユーザーで作業を行うことをおすすめします。

(参考記事:AWSアカウント作ったらこれだけはやっとけ!IAMユーザーとAuthyを使ったMFAで2段階認証


ハンズオン開始


手順

1.VPCを作成する

2.インターネットゲートウェイを作成する

3.サブネットを作成する

4.ルートテーブルを作成する

5.セキュリティグループを作成する

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

7.Elastic IPを作成、紐づけする

8.SSHでサーバーにログインしてみる

9.RDSを構築する

10.WebサーバーからRDSにSSHでログインしてみる

11.ブラウザにデータを表示する


リージョンの選択

サービスを構築する前に今回のインフラを構築するリージョンを設定します。

AWS マネジメントコンソールにログインしてください。

画面に表示されているヘッダー右上に表示されている地域をクリックして選択できます。今回は東京リージョンを選択します。

スクリーンショット 2019-10-02 8.08.00.png


1.VPCを作成する

AWSマネジメントコンソールを開き、VPCと検索し、VPCダッシュボード(VPCの設定画面)を開きます。

スクリーンショット 2019-09-26 1.15.27.jpg

画面左側のメニューから「VPC」を選択し、「VPCの作成」をクリックします。

スクリーンショット 2019-09-26 1.17.39.jpg

名前タグ TestVpc

IPv4CIDRブロック 10.0.0.0/16

と入力して、「作成」をクリックします。

ーIPv4CIDRブロック:ネットワーク内で使用するIPアドレスの範囲

スクリーンショット 2019-09-26 1.18.30.jpg


2.インターネットゲートウェイを作成する

VPCの画面の左側のメニューから「インターネットゲートウェイ」を選択し、「インターネットゲートウェイの作成」をクリックします。

スクリーンショット 2019-09-26 1.18.56.jpg

名前を TestIGW とし、「作成」をクリックします。

作成したインターネットゲートウェイをVPCに関連付けます。

もう一度インターネットゲートウェイの画面を開き、作成したインターネットゲートウェイを選択します。

画面上部の「アクション」をクリックし、「VPCにアタッチ」を選択します。

スクリーンショット 2019-09-26 1.19.26.jpg

さっき作成したVPCを選択し、「アタッチ」をクリックします。

スクリーンショット 2019-09-26 1.19.32.jpg


3.サブネットを作成する

Webサーバー用のパブリックサブネットと、データベース用のプライベートサブネットを作成します。

引き続きVPCの画面左側から「サブネット」を選択し、「サブネットの作成」をクリックします。

スクリーンショット 2019-09-26 1.21.43.jpg

まずはパブリックサブネットから。下記を入力し、「作成」をクリックします。

名前タグ PublicSubnet

VPC 作成したVPC

アベイラビリティゾーンap-northeast-1a

IPv4CIDRブロック 10.0.1.0/24

スクリーンショット 2019-09-26 1.22.32.jpg

同じようにプライベートサブネットも作成します。

データベースの作成にサブネットが2つ以上必要なため、2つ作成します。

一つめのプライベートサブネット↓

名前タグ PrivateSubnet1

VPC 作成したVPC

アベイラビリティゾーンap-northeast-1c

IPv4CIDRブロック 10.0.2.0/24

スクリーンショット 2019-09-26 1.23.23.jpg

二つめのプライベートサブネット↓

名前タグ PrivateSubnet2

VPC 作成したVPC

アベイラビリティゾーンap-northeast-1d

IPv4CIDRブロック 10.0.3.0/24

スクリーンショット 2019-09-26 1.23.39.jpg


4.ルートテーブルを作成する

サブネットが任意のネットワークと通信するための経路であるルートテーブルを作成します。

VPCダッシュボードから「ルートテーブル」を選択し、「ルートテーブルの作成」をクリックします。

スクリーンショット 2019-09-26 1.23.53.jpg

下記を入力し、「作成」をクリックします。

名前タグ TestRT

VPC 作成したVPC

スクリーンショット 2019-09-26 1.24.12.jpg

ルートテーブルとインターネットゲートウェイ、ルートテーブルとパブリックサブネットを紐付けて、パブリックサブネットがインターネットと通信できるようにします。

VPCダッシュボードから「ルートテーブル」を選択し、作成したルートテーブルを選択します。

画面下半分に表示されているタブから「ルート」を選択し、「ルートの編集」をクリックします。

スクリーンショット 2019-09-26 1.24.36.jpg

「ルートの追加」をクリックし、送信先を0.0.0.0/0とします。

ターゲットに「Internet GateWay」を選択します。

(0.0.0.0/0はIPアドレスの制限がないこと、すべての通信を意味する)

スクリーンショット 2019-09-26 1.25.08 (1).jpg

先程作成したインターネットゲートウェイを選択し、「ルートの保存」をクリックします。

スクリーンショット 2019-09-26 1.25.15.jpg

作成したルートテーブルとパブリックサブネットを関連づけます。

VPCダッシュボードから「ルートテーブル」を選択し、作成したルートテーブルをクリックします。

画面下半分のタブから「サブネットの関連付け」を選択し、「サブネットの関連付けの編集」をクリックします。

スクリーンショット 2019-09-26 1.25.41.jpg

作成したパブリックサブネットを選択し、「保存」をクリックします。

スクリーンショット 2019-09-26 1.25.59.jpg


5.セキュリティグループを作成する

こちらもWebサーバー用とデータベース用を作成します。

まずはWebサーバー用から。

VPCダッシュボードから「セキュリティグループ」を選択し、「セキュリティグループの作成」をクリックします。

下記を入力し、「保存」をクリックします。

セキュリティグループ名 MyWebServerSG

説明 ForWebServer

VPC 作成したVPC

スクリーンショット 2019-09-26 1.27.37.jpg

セキュリティグループの画面から「MyWebServerSG」を選択し、画面下部のタブの「インバウンドのルール」から「ルールの編集」をクリックします。

「ルールの追加」をクリックし、下記のルールを追加します。

タイプ SSH ソース カスタム 0.0.0.0/0

タイプ HTTP ソース カスタム 0.0.0.0/0, ::/0

タイプ HTTPS ソース カスタム 0.0.0.0/0, ::/0

追加したら、「ルールの保存」をクリックします。

スクリーンショット 2019-09-26 20.39.00 (1).jpg

データベース用のセキュリティグループも同じように作成します。

以下を設定し、保存します。

セキュリティグループ名 MyRDSSG

説明 ForMyRDS

VPC 作成したVPC

スクリーンショット 2019-10-01 21.42.19.png

インバウンドのルール

タイプ MYSQL/Aurora ソース カスタム Webサーバー用のセキュリティグループ`

↑ここでデータベースにはWebサーバーからしか接続できないように設定しています

スクリーンショット 2019-10-01 21.44.42.png


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

いよいよWebサーバーの作成です。

マネジメントコンソールのトップの画面に戻り、EC2を検索し、選択します。

スクリーンショット 2019-09-26 1.29.02.jpg

EC2ダッシュボードに移動し、「インスタンスの作成」をクリックします。

スクリーンショット 2019-09-26 1.29.36.jpg

今回は一番上のLinuxのマシンイメージ(AMI)を選択します。

スクリーンショット 2019-09-26 1.29.46.jpg

インスタンスタイプもデフォルトで選択されているものをそのまま選択します。

スクリーンショット 2019-09-26 1.30.06.jpg

インスタンスの詳細の設定画面で下記を設定し、「ストレージの追加」をクリックします。

ネットワーク作成したVPC

サブネット作成したパブリックサブネット

自動割り当てパブリックIP有効 ←パブリックIPアドレスを付与するかどうかの設定

スクリーンショット 2019-09-26 1.30.30.png

手順4ストレージの追加、手順5タグの追加は特に設定を変えずに、

手順6セキュリティグループの設定に移ります。

セキュリティグループの設定で

セキュリティグループの割り当て:既存のセキュリティグループを選択する

を選択肢、先程作成した「MyWebServerSG」を選択します。

スクリーンショット 2019-09-26 1.32.11.png

「確認と作成」をクリックすると次の画面で警告が出ますが(IPアドレスの制限をかけていないため)、このまま「起動」をクリックします。

スクリーンショット 2019-09-26 1.32.31.png

キーペア(SSHでアクセスするための鍵ファイル)を作成するためのポップアップが出るので、

キーペア名 MyTestKeyPairとし、キーペアをローカルの任意の場所にダウンロードします。

スクリーンショット 2019-09-26 1.32.56.png

ダウンロードが終わったら「インスタンスの作成」をクリックします。

インスタンス作成中の画面が表示されます。「インスタンスの表示」をクリックして、

インスタンスの状態:running

ステータスチェック:2/2のチェックに合格しました

になっていたら無事にインスタンス(サーバー)の作成、起動が完了です。

ここで、さっき作成したキーペアですが、このままだとパーミッション(権限レベル)がゆるすぎますよーという警告が出るので、ターミナルで600に変更します。おまじないみたいなものです。

Macのターミナルを開いて chmod 600 【キーペアのパス】を入力し、Enterキーを押します。

スクリーンショット 2019-09-29 10.20.19.png

エラーが出なければ変更完了です。


7.Elastic IPを作成、紐づけする

EC2インスタンス作成時にパブリックIPアドレスの付与を有効化しましたが、実はEC2インスタンスのパブリックIPは停止→起動のたびに違うものが付与されます。

何度起動しても同じIPアドレスを付与する機能がElastic IPです。

EC2ダッシュボードで「Elastic IP」を選択し、「新しいアドレスの割り当て」をクリックします。

スクリーンショット 2019-09-26 1.38.11.png

表示された画面でそのまま「割り当て」をクリックします。

ElasticIPの画面に戻り、「アクション」から「アドレスの関連付け」を選択します。

スクリーンショット 2019-09-26 1.38.25.png

「アドレスの関連付け」の画面で下記を入力します。

リソースタイプインスタンス

インスタンス作成したEC2インスタンス

プライベートIP作成したEC2インスタンスのプライベートIP

スクリーンショット 2019-09-26 1.38.38.png

「関連付け」をクリックして、作業完了です。


8.SSHでサーバーにログインしてみる

SSH(自分のPCから別のPCに安全にリモート接続できるコマンド)で、EC2インスタンスに接続してみます。

ターミナルを開いて下記を入力、Enterをクリックしてください。

ssh ec2-user@【EC2インスタンスのパブリックIPアドレス】 -i 【pemキーのパス】

インスタンスのパブリックIPアドレスは、EC2ダッシュボードから対象のインスタンスを選択し、

画面下部の「説明」タブの中で確認できます。

スクリーンショット 2019-09-26 1.41.21.png

つなげていいですかー?というメッセージが出るのでyesを入力し、Enterをクリックしてしばらく経つと、接続完了の旨のメッセージが表示されます。

スクリーンショット 2019-09-26 1.41.36.png

Webサーバーとして稼働させるため、apacheをインストールしていきます。

ターミナルに順番に下記のコマンドを入力してください。

↓管理者権限で実行

sudo su 

↓アプリケーションのアップデートの確認、実行

yum update -y

↓apacheインストール

yum install httpd -y

↓apache起動

service httpd start

起動していることを確認してみます。

↓フォルダ移動

cd /var/www/html

↓viエディタでindex.htmlを開く

sudo vi index.html

index.htmlに下記のコードを貼り付けてください。


index.html

<!DOCTYPE html>

<html lang="ja">
<head>
<meta charset="utf-8">
<title>テストタイトル</title>
</head>
<body>
<p>Hello AWS!</p>
</body>
</html>

貼り付けたら、escキーをクリックした後「:」→「w」→「q」→「Enter」の順にクリックして保存してください。

ブラウザでEC2インスタンスのIPアドレスを入力して、画面が表示されたら成功です。

スクリーンショット 2019-10-01 22.32.12.png


9.RDSを構築する

まず、RDSインスタンスが所属するためのサブネットグループを作成します。

RDSダッシュボードの左側のメニューから「サブネットグループ」を選択し、「DBサブネットグループの作成」をクリックします。

「サブネットグループの詳細」エリアに下記を入力します。

名前TestDbSubnetGroup

説明ForTestDb

VPC作成したVPC

スクリーンショット 2019-09-26 2.00.42.png

「サブネットの追加」で、3.で作成したデータベース用のサブネット2つを追加します。

スクリーンショット 2019-09-26 2.00.58.png

スクリーンショット 2019-09-26 2.01.03.png

「作成」をクリックして完了です。

RDSインスタンスを作成します。

画面左上のサービスからRDSを検索し、RDSダッシュボードを表示します。

スクリーンショット 2019-09-26 1.59.28.png

「データベース」を選択し、「データベースの作成」をクリックします。

スクリーンショット 2019-09-26 1.59.52.png

「データベースの設定」で「Standard Create」、「エンジンのオプション」で今回は「MySQL」を選択します。

スクリーンショット 2019-09-26 2.01.36.png

「テンプレート」で「無料利用枠」を選択します。

「設定」-「認証情報の設定」でデータベースのマスターアカウントのユーザー名とパスワードを入力します。

スクリーンショット 2019-09-26 2.02.24.png

「DBインスタンスサイズ」「ストレージ」はデフォルトの設定を利用します。

「接続」の「VPC」で、作成したVPCを選択します。

スクリーンショット 2019-10-02 15.27.57.png

「接続」-「追加の接続設定」で以下を設定します。

サブネットグループ:作成したDBサブネットグループ

パブリックアクセス可能:なし

VPCセキュリティグループ:既存の選択

既存のVPCセキュリティグループ:データベース用に作成したセキュリティグループ

アベイラビリティゾーン:ap-northeast-1d

データベースポート:3306

スクリーンショット 2019-09-26 2.15.37.png

この状態で「データベースの作成」をクリックすると、データベースが作成中になります。

EC2と同様、しばらく経つとインスタンスが作成され、クリックすると詳細情報が確認できます。

スクリーンショット 2019-10-02 15.35.35.png

スクリーンショット 2019-10-02 15.39.40.png


10.WebサーバーからRDSにSSHでログインしてみる(疎通確認)

EC2インスタンスにMySqlクライアントをインストールします。

ターミナルを起動してさっきと同じようにSSHでEC2インスタンス(Webサーバー)に接続します。(すでに接続している場合はそのままでOK)

ssh ec2-user@【EC2インスタンスのパブリックIPアドレス】 -i 【pemキーのパス】

↓WebサーバーにMySQLクライアントをインストールします。

sudo yum -y install mysql

WebサーバーのMySQLクライアントからRDSに接続します。

下記を入力してEnterキーを押すと、パスワードを求められるので入力して再度Enterを押します。

mysql -h 【エンドポイント】 -P 3306 -u 【ユーザー名】 -p

接続できたら疎通確認完了です。

スクリーンショット 2019-10-04 21.31.12.png

Webサーバー、データベースを構築し、Webサーバーからデータベースへ接続する一連の流れを構築できました。


11.ブラウザにデータを表示する

サーバーサイドにはPHPを使用します(個人的に構築が楽なので)。

データベースサーバーに接続している状態で、データを作っていきます。

↓データベースの作成(testdbという名前のデータベース)

create database testdb;

↓テーブル、カラムの作成

今回はuserテーブルと、その中にid(int型)、name(varchar型)を作成します。

create table testdb.user(id int , name varchar(20));

↓データを作成する

insert into testdb.user VALUES (1,'tanaka'),(2,'satou');

↓データが登録できたことを確認する

select * from testdb.user;

↓データベースサーバーとの接続を切り、Webサーバに戻る

quit

スクリーンショット 2019-10-01 23.33.37.png

↓EC2インスタンスにPHPとMySQLを扱うためのモジュールをインストールする

$ sudo yum -y install php php-mysql

拡張子が.phpのファイルがphpファイルとして読み込まれるように設定する

↓viエディタでhttpd.confファイルを開く

$ sudo vi /etc/httpd/conf/httpd.conf

<IfModule mime_module>

・・・(略)
</IfModule>

↑のタグで囲まれている部分があるので、下記のようにコードを追加する

(aを押すと編集モードになるので、その状態で貼り付けてください)

<IfModule mime_module>

・・・(略)
AddType application/x-httpd-php .php //←追加
</IfModule>

編集が終わったらescキーをクリックした後 「:」→「w」→「q」→「Enter」の順にクリックして保存してください

↓設定を反映するためにapacheを再起動する

 sudo service httpd restart

↓下記のテストコードを実行し、ブラウザで 【EC2インスタンスのパブリックIPアドレス】/index.php に接続してテストページが表示されれば成功です。

 sudo sh -c "echo '<?php phpinfo(); ?>' >> /var/www/html/index.php"

スクリーンショット 2019-10-04 21.44.15.png

phpファイルを、DB情報を取得・表示するコードに修正する

↓viエディタでindex.phpファイルを起動

sudo vi /var/www/html/index.php

↓下記コードの【】をそれぞれ編集し、index.phpに貼り付けてください。

<?php

try
{
$dbs = "mysql:【エンドポイント】;dbname=testdb;charset=utf8";
$user='【ユーザー名】';
$password='【パスワード】';
$dbh=new PDO($dbs, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql='SELECT * FROM user';
$stmt=$dbh->prepare($sql);

$dbh=null;
//実行
$stmt->execute();

$all = $stmt->fetchAll();
//配列を表示
foreach($all as $loop){
echo $loop['id']." ".$loop['name'].'<br>';
}

}
catch (Exception $e)
{
print '接続失敗';
exit();
}
?>

escキーをクリックした後 「:」→「w」→「q」→「Enter」の順にクリックして保存 

もう一度ブラウザに【EC2インスタンスのパブリックIPアドレス】/index.phpを入力して、データベースのデータが表示されていたら成功です。

スクリーンショット 2019-10-02 17.38.14.png

ハンズオンは以上になります。

今回はすべて無料利用枠の範囲内に収まるようにしていますが、無料時間枠を超えると請求が発生してしまうので、早めにリソースを削除することをおすすめします。(EC2インスタンス、RDS、Elastic IPは特に)


まとめ

ハンズオンが終了したら、冒頭に書いている用語や構成図を見直してみてください。

きっと理解しやすくなっていると思います。

私自身が、インフラ知識がなかった状態からAWSの勉強を始めてその面白さを知ったので、今回の記事でAWSの魅力、手軽さを少しでも感じていただけていたら幸いです。

また、興味を持ったサービスがあればぜひ公式のサービス別資料集を読んでみてください。

わかりやすく、実務にも役立つし資格の勉強にもなるのでおすすめです。

AWS サービス別資料