miyamon_good’s blog

エンジニア×パチンコ・パチスロ

PHP勉強始めますpart.3

・データベース(MySQL)と接続するためのプログラム

<?php

try {

  $db = new PDO('mysql:dbname=mydb;host=localhost;charset=utf8',

  'root', 'root');

} catch(PDOException $e) {

  echo 'DB接続エラー: ' . $e->getMessage();

}

?>

new PDO:PHP Data object(DBを扱うためのオブジェクト)のコンストラクターという、

オブジェクトを作るときに指定するパラメーターを指定していく。

DBに接続するための文字列(接続文字列)としてsqlの場合は、

DBの名前+サーバーのアドレス+文字コードを指定しそれぞれを;で区切る。

try{}catch{}構文:エラーが発生した時そのままエラーとして落とすのではなく例外を発生させそれを受け取り処理を行う構文。

try{new PDO}:接続をしてうまく行かなかった時は例外を投げてくださいという処理。

catch(){}:例外を投げた時PDOExceptionを$eとして受け取り、その$eの中のメッセージを出力する処理。これによりDBに接続できなかった時エラー画面に飛ばしたり、DBを使わなくてもできる処理だけを行うといった制御が可能になる。

複数のファイルに記載する場合は、DB接続のファイルを1つ用意し、別ファイルでは

require('DB接続ファイル');

で呼び出す方法が適している。

 

・DBからデータを出力する:指定のカラムを連想配列で取り出すプログラム

$records = $db->query('SELECT * FROM my_items');

while ($record = $records->fetch()) {

  print($record['item_name'] . "\n");

}

queryメソッドは後述のSELECT文で得られた値を受け取る。

これで$recordsはオブジェクトのインスタンスとなり、Recordsetというオブジェクトのインスタンスとなる。このインスタンスが持つメソッドの中の1つとしてfetchを利用。

fetchはDBから受け取ったレコードの行の集まりから1行を取り出していき無くなるとfalseを返す。

全てのレコードを受け取るためwhile文で繰り返し処理を行い1つ1つを$recordに格納。

$recordは連想配列のため、$recordのブラケットとDBのカラム名を指定し、

item_nameというカラムのレコードを取り出し出力。

 

・URLパラメーターにページの数字を指定された時にそのページに対応するデータを出力するプログラム

require('dbconnect.php');

if (isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {

  $page = $_REQUEST['page'];

} else {

  $page = 1;

}

$start = 5 * ($page - 1);

$memos = $db->prepare('SELECT * FROM memos ORDER BY id DESC LIMIT ?, 5');

$memos->bindParam(1, $start, PDO::PARAM_INT);

$memos->execute();

1ページ目には最新id5件まで出力。2ページ目以降は順番に5件ずつ出力するよう設定。

?のプレースホルダーには数字が入れたいためbindParamメソッドを使用。

1番目の?に$startの値を入るように設定し、数字でパラメーターを渡すために型を指定している(PDO::PARAM_INT)。そしてexecuteメソッドでプリペアドステートメントを実行している。

プリペアドステートメント:SQL文で値が変わる可能性を有る箇所に対して、変数のように別の文字列を入れておき後で置き換える仕組み。

 

 

 

 

 

 

 

PHP勉強始めますpart.2

 ・ファイル読み込み

$news = file_get_contents('../../news_data/news.txt');

$news = "2021-2-20 本日は夜にご飯へ行きます\n" . $news;

file_put_contents('../../news_data/news.txt', $news);

print($news);

file_get_contentsメソッドで2階層上のファイルからnews.txtを読み込み、

そこへ文章をfile_put_contentsで書き込み、printメソッドでブラウザへ出力。

 

・テキストデータから任意のテキストを抽出

$data = file_get_contents('/json/');

$json = json_decode($data);

foreach ($json->items as $item):

・<a href="<?php print($item->url); ?>"><?php print($item->title); ?></a>

endforeach;

json方式のテキストデータをfile_get_contentsで内容を抽出し、

json_decodeメソッドでjson形式のデータをPHPのオブジェクト形式で処理。

itemプロパティは配列の形式であるから、foreach構文で繰り返し処理し、1つ1つを$itemに格納。

配列の中のurl要素とtitle要素を抽出し、urlにaタグ属性を付与しリンクで出力。

 

・formで入力された情報を受け取る

お名前: <?php print(htmlspecialchars($_REQUEST[my_name], ENT_QUOTES); ?>

htmlspecialcharsはセキュリティ目的で使用。

これがないとhtmlタグがそのまま反映されるため危険。

パラメーターは2つあり、1つ目に何をエスケープするのかを指定し、2つ目にどのようにエスケープするのかを指定する。

$_REQUESTはフォームの値を受け取るためのプログラムであり、グローバル変数

htmlでmethod属性がgetのとき、REQUESTとGETが対応。

パスワードや暗号にREQUESTを使うとパスに表示されるため注意が必要。

ENT_QUOTESは変換パターンの1つであり、',",<,>といった記号等をエスケープしクロスサイトスクリプティング対策として講じる1つの手段。

 

・複数選択可能なチェックボックスの値を受け取る

foreach ($_POST['reserve'] as $reserve) {

  print(htmlspecialchars($reserve, ENT_QUOTES) . ' ');

}

複数選択可能なチェックボックスの値を受け取る場合は配列の為、foreach構文を使用。

htmlで設定したチェックボックスのname属性(reserve)を1つ1つ$reserveへ格納。

PHPではformのname属性にブラケット[ ]必要となるので注意。

 

・全角数字を半角数字に修正し、それ以外はそのままにする

$age = 20;

$age = mb_convert_kana($age, 'n', 'UTF-8');

if (is_numeric($age)) {

  print($age . '歳');

} else {

  print('※年齢が数字ではありません');

}

mb_convert_kanaは文字を全角・半角に変換する。

'n'で全角数字を半角数字に直してから$ageに再読み込みし変換している。

is_numericは数字であるかを判断し、数字であれば半角に修正されているので入力された数字が全角であろうと半角数字で出力され、数字以外であればエラー文が出力される。

 

・剰余算の性質を利用した曜日出力

$week = array('日', '月', '火', '水', '木', '金', '土');

for ($i=1; $i<31; $i++) {

  print($week[$i%7] . "\n");

 

Cookieに値を保存する

setcookie('save_message', 'Cookieに保存した値', time() + 60 * 60 * 24 * 14);

 

Cookieの値: <?php print($_COOKIE['save_message']); ?>

setcookieは('cookieのキー', 'cookieに保存したい内容', そのcookieをいつまで保存したいか)を設定し活用する。cookie情報は$_COOKIEというグローバル変数に格納され、キーを指定することで呼び出し可能であり、保存したcookie情報は検証ツールのApplicationから確認可能。

 

・sessionに値を保存する

session_start();

$_SESSION['session_message'] = '値をセッションに保存';

 

<?php print($_SESSION['session_message']);

sessionを使用するときは、文頭にsession_start();の記述が必要。

sessionに保存した値はブラウザが閉じられた、移動したタイミングで消えるのに対し、

cookieは定めた期間中保存される。

sessionはWebサーバーに保存され、サーバーに保存された情報がどのブラウザに保存された情報なのかを判断するためにsessionIDを発行する。

sessionIDをWebブラウザcookieに保管し、そのsessionIDをもとにsessionの内容を受け渡す仕組み。

cookieに直接パスワードを保存するよりは安全性が高いが、sessionIDが盗まれるとそこからパスワードを盗まれるセッションハイジャックされる危険があるため注意。

 

 

 

 

PHP勉強始めますpart.1

来週の面接に向け、本格的にPHP勉強を始めました。

1日の終りに10,15分程だけでも勉強を振り返ることで得られる定着を目的に、

ブログにて学んだことをアウトプットしていこうと思います!

 

・環境構築

MAMPを使用。

Macintosh」「Apache」「MySQL」「PHP」の頭文字をとったもの。

MacintoshとはApple社が開発したPCの総称。現Mac

ApacheはWebサーバー。

MySQLはリレーショナルデータベースマネジメントシステム(RDBMS)。

 

エスケープシーケンス

\n改行,\rキャリッジリターン,\tタブ,\\,\$,\"各記号

 

・時間を表記するプログラム

print('現在は' . date('G時 i分 s秒') . 'です');

間の.は文字列連結。Rubyでは+でしたがPHPでは.を使用。

変数宣言した場合は以下のように書く。

$today = new DateTime();

print($today->format('G時 i分 s秒'));

PHPの変数宣言には$をつける。

printファンクションによって出力。

$todayというDateTimeオブジェクトのインスタンスのメソッドを使用し、現在時刻を出力している。

 

・繰り返し処理

365回繰り返す処理をプログラムする。

$i = 1;

while ($i <= 365 ) {

  print($i . "\n");

  $i ++;

}

$i++はインクリメントであり、

$i = $i + 1を省略した書き方。

while構文の構成は以下。

初期化処理

while (繰り返す条件) {

  繰り返したい処理

  更新処理

}

 

 for構文を使った繰り返し処理は以下。

for ($i = 1; $i<=365; $i++){

  print($i . "\n");

}

for (初期化処理; 繰り返す条件; 更新処理){

  繰り返したい処理

}

 

・ファイルを書き込むプログラム

$success = file_put_contents('../../news_data/news.txt',

'2021-02-20 PHP勉強中!');

if ($success) {

  print('ファイルへの書き込むが完了しました!');

} else {

  print('書き込みに失敗しました。');

}

これは現在のファイルから2階層上にあるnews_dataフォルダへnews.txtファイルを保存する処理をプログラムし、成功か失敗の結果を出力するプログラム。

file_put_contentsは様々な内容をファイルに書き込むファンクションであり、

$successにfile_put_contentsの戻り値を代入している。

 

 

AWS⑥DBサーバーの構築

本日は、DBサーバーを構築していきます!

 

まずは、今までしてきたことを軽くおさらい、復習します。

・パブリックサブネットにWebサーバーを設置し、

Route 53を使いドメイン名でWebサーバーにアクセスが可能に。

・プライベートサブネットにDBサーバーを設置する理由はセキュリティを高める目的で、インターネットから直接アクセスできないようにするため。

 

では、実装に向けての予備知識を。

RDS

AWSのフルマネージドなリレーショナルデータベースのサービス」

構築運用の手間を軽減し、コア機能の開発に注力できるというメリットがある。

利用可能な代表的エンジンは、MySQL,PostgreSQL,Oracleなど複数。

可用性向上の為、MasterとSlaveによる複数のアベイラビリティゾーンでの運用(サービスを停止させないための仕組み)や、リードレプリカを簡単に構築する(DBの読込と読書を区別することでDBの負荷を下げる)ことでパフォーマンスを向上させることが出来る。また、自動的にバックアップやソフトウェアメンテナンスを行い、監視等もしてくれる非常に便利なサービス。

 

では、実装していきます!

まず、プライベートサブネットを作成していきます。

理由は、DBサーバーを設置するにあたり、プライベートサブネットをもう1個作りアベイラビリティゾーンを作成する必要があるからです。

RDSは設置する時、DBの冗長化ができるように複数のアベイラビリティゾーンを必要とします。1台のDBに問題が生じても他のDBがあることによりシステムがダウンしないようにするため、RDSは複数のアベイラビリティゾーンにDBを設置することが推奨されていて、RDSでは複数のDBを別のアベイラビリティゾーンに作れるように複数のアベイラビリティゾーンにサブネットを用意しておくという約束がある為、今回作成するDBは1つですがサブネットを追加で用意しておくという訳です。

 

では、プライベートサブネットを作成。

CIDRブロックは10.0.21.0/24として、アベイラビリティゾーンを1cで作成完了。

 

次にRDSの作成準備をしていきます。

準備工程は4つ。

1,セキュリティグループの作成

RDSへのファイアウォール設定。

必要なところからのみアクセスできるようにする。

今回はWebサーバーからMySQLでのみ接続できるようにしたいので、

タイプはMySQL/Auroraを選択。

ソースにWebサーバーのセキュリティグループを選択。

これによりWebサーバーのインスタンスから接続できるようになる。

2,DBサブネットグループの作成

VPC内にあるサブネットを複数指定して、RDSインスタンスの起動するサブネットを指定する設定。複数のサブネットを使用する為、RDSを作成するときにはこれを作成しないといけない。

今回は作成した2つのプライベートサブネットを選択。

3,DBパラメータグループの作成

RDSではDBの設定ファイルを直接設定できないのでDBの設定値を指定する。

今回はMySQL8.0を選択。

4,DBオプショングループの作成

DBの機能を設定する。

エンジンにはmysqlを指定し、メジャーエンジンは8.0を選択。

これで下準備は完了です。

 

では、DBエンジンを作成していきます。

エンジンはMySQLを選択し、作成したVPC、サブネットグループ、セキュリティグループを選択し作成。これでRDSインスタンスの作成完了!

 

次に、WebサーバーにMySQLをインストールし、RDSへmysqlコマンドで接続できるようにしていきます。 

ターミナルでsshによるログイン後、以下コマンドでmyqlをインストール。

「sudo yum -y install mysql」 

そしてmysqlコマンドで接続します。以下のコマンドを入力。

mysql -h エンドポイント -u ユーザー名 -p」

-hはエンドポイントを指定。

エンドポイントは作成したDBのエンドポイントをコピーして貼り付け。

-uは接続するユーザー名(作成したDBのMasterユーザー名)を指定。

以下の画面になれば接続完了です!

f:id:miyamon_good:20201222145611p:plain

 

 

これでWebサーバーとDBサーバーが完成しました。

では、いよいよポートフォリオAWSにデプロイしていこうと思います! 

 

 

AWS勉強⑤Route 53でDNSを設定する

本日は、Route53でドメインを設定したいと思います!

 

まずは、予備知識。

なぜRoute53でドメインを登録するのか?

現在はIPアドレスを指定しないとWebサーバーへアクセス出来ない状態。

IPアドレスは覚えづらいので、ドメイン名を設定しIPアドレスと紐付けることで、

アクセスすることが可能となる。

 

ドメイン

「インターネット上に存在するコンピュータやネットワークを識別する為の名前」

 

DNS(Domain Name System)

ドメイン名をIPアドレスに変換する管理システム

電話帳の役割をもつ「ネームサーバー」と、リクエストに応じたIPアドレスを調べてくれる「フルリゾルバ」で構成される。

 

Route 53

AWSDNSサービスであり、ネームサーバーの役割を果たす」

SLA100%というのが最大の特徴。稼働率が100%を示し、Route53が落ちることがないということをAWSが保証している。また、フルマネージドサービスであり、DNSサーバーの設計や維持管理が不要となる。

Route 53を使用するにあたり重要となる概念は以下4つ。

・ルーティングポリシー

Route 53がRecord Setに対してどのようにルーティングを行うかを決めるもの。

フルリゾルバからIPアドレスを聞かれた時に、どのIPアドレスを返すかを決める。

・ホストゾーン

DNSのリソースレコードの集合

・レコードセット

リソースレコードを示す

・ヘルスチェック

サーバーの稼働状況をチェック

 

予備知識は以上。

では、今回使用するドメインを購入します。

ドメインを設定するにはレジストラやリセラで購入する必要あり。

今回は国内最大のレジストラである「お名前.com」で購入します。

1番安い「.work」で作成、購入できたら自動更新をOFFに設定し、作成完了。

 

それでは、

作成したドメインからWebサーバーが起動するように設定していきます!

 

その前に・・・この時フルリゾルバで行われている処理を確認。

1,Webブラウザに作成したドメインを入力し検索

2,フルリゾルバからルートネームサーバーへ問い合わせる

3,設定したドメインに基づく(今回はwork)ネームサーバーへ問い合わせ

4,ネームサーバーRoute 53から設定したIPアドレスをフルリゾルバへ返す

5,フルリゾルバからブラウザへIPアドレスを返す

6,ブラウザからWebサーバーへ抽出したIPアドレスで接続する

 

この時の3,4間の処理を可能にするための設定を行います。

(※現状では、お名前.comのネームサーバーが設定されているから)

具体的な作業内容は、以下の2点。

ドメインのネームサーバーをRoute 53に変更

・Route 53でホストゾーンを作成

・ネームサーバーをお名前.comからRoute 53に変更

ドメインに紐づくIPアドレスを登録

・Route 53でAタイプレコードセットを作成

 

では実装していきましょう!

まずはRoute 53でホストゾーンを作成。

この中に、レコードセットを登録することでドメイン名とIPアドレスを関連付けることが出来る。

タイプはインターネットへ接続したいので「パブリックホストゾーン」を選択。

「プライベートホストゾーン」はAWSVPC内でルーティングする時にIPアドレスではなくドメイン名を使用する時に選択する。

作成すると、NSレコードSOAレコードが生成されていることを確認。

NSレコードとはそのドメインを管理するネームサーバーとの紐付け。

SOAレコードとはそのドメインのゾーンの管理情報。

NSタイプを確認すると、4つのネームサーバーを確認。

f:id:miyamon_good:20201218130324p:plain

これでネームサーバーができましたが、接続することは出来ません

その理由をターミナルで確認します。

 

sshコマンドでサーバーへログインし、以下のコマンドを入力。

「dig ○○○.work NS +short」

digはドメインに紐づくIPアドレスIPアドレスに紐づくドメインを調べるコマンド。

NSは作成したレコードのタイプ。

+shortはdigコマンドは色々な情報が出力される為、NSだけを出力するようにする。

すると、以下の表記が出現。

dns2.onamae.com.

dns1.onamae.com.

これは現在、デフォルトでお名前.comのネームサーバーが適用されていることを示す。

これをゾーンはRoute 53にあると変更するために、お名前.comの管理画面から変更。

ネームサーバー情報はRoute 53のNSサーバーに設定された4つの値を入力し設定完了。

設定の反映には1〜3日かかる。

 

次に、Route 53でAタイプのレコードセットを作成。

A(Address)レコードは、IPv4でホスト名とIPアドレスの関連づけを定義するレコード。

値にIPv4パブリックIPアドレスを入力。

これにより、ドメインのネームサーバーの変更が反映された後、ドメインWebブラウザに入力するとAレコードで登録されたIPアドレスが返されWebサーバーに接続できるようになる。

これでドメイン名からWebページが表示できれば実装OK!

 

次は、DBサーバーを構築していきます!

 

AWS勉強④Webサーバーの構築~構築パート~

では、Webサーバーを構築するためにEC2インスタンスを設置します!

 

実装のゴールは

パブリックサブネットにEC2インスタンスを設置しインターネットへアクセスを可能とすること

実装の手順

①EC2インスタンスを設置

Apacheをインストール

ファイアウォールを設置

④Elastic IPアドレスIPアドレスを固定

 

では①から!

インスタンス設置手順は前半でざっくりまとめましたのでその順番で進めます。

まずAMIを選択。今回はクイックスタートでAmazon Linux 2 AMI を選択。

これはAWSによってメンテナンスされているLinuxで、AWSの各サービスを連携するためのツールやライブラリが全て入っているためすぐに利用できるAMI。

インススタンスタイプにはt2.microを選択。無料利用枠で使用可能。パフォーマンスは低いが動作確認には十分。

次にインスタンスの詳細の設定。作成したVPCをネットワークに設定し、インターネットへアクセスしたいのでパブリックサブネットをサブネットに指定。自動割当パブリックIPは有効にすることでインターネットへアクセスが可能

その他の設定は触りませんでした。

プライマリIPを設定しようと思い、10.0.10.10で設定するとエラーが発生。 

調べてみるとパブリックサブネットのIPv4 CIDRの範囲を10.0.0.0/24に誤って設定していました(-_-;

プライマリIPは、パブリックサブネットのIPアドレスの範囲(10.0.10.0/24 は 10.0.10.0 ~ 10.0.10.255)で設定する必要あり。

IPv4 CIDRの範囲は後から変更できない?みたいなので再度パブリックサブネットを作成し、プライマリIPを設定。これを設定するメリットは、接続先を指定する時に毎回同じ指定先を指定すればOKになる。自動で設定すると指定するIPを書き直さないといけなくなります。

ストレージはデフォルトのルートのまま使用。

キーペアは新しいキーペアを作成しダウンロード。

作成したインスタンスの状態とチェックが問題なければインスタンス作成OK。

 

これで①は完了!

次に②を実装します。

 

立てたサーバーにログインし、ApacheをインストールしWebサーバーとして構築していきたいのですがそのためには「サーバーへSSHでログイン」する必要があります。

 

まずはターミナルを開き、ダウンロードしたpemファイルを自分以外が使用できないようにする設定を行います。

pemファイルを保存したディレクトリへ移動しターミナルで、

「chmod 600 ○○○.pem」と入力すれば設定OK。初めの1回のみこれを行う。

 

次に作成したインスタンスIPv4パブリックIPをコピー。このIPアドレスに対してSSHでログインしていく。

ターミナルで以下のコマンドを実行。

ssh -i  ○○○.pem ec2-user@コピーしたパブリックIP」

sshssh接続するためのコマンド。

-iは秘密鍵(pemファイル)を指定し公開鍵認証で接続できるようにする。

ec2-userはサーバーへログインする時のユーザー名。

まとめると、「指定しているEC2へ秘密鍵を用いて、ec2-userというユーザー名で指定したIPアドレスへ接続します」という意味。

 

それでは実行!すると以下のエラーが発生。

Warning: Permanently added '54.95.12.198' (ECDSA) to the list of known hosts.

ec2-user@54.95.12.198: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

解決策を調べてみると.sshという隠しディレクトリに移動し、ファイル指定をフルパスにしてみる方法があったので試してみます。

qiita.com

 

これで何とかEC2にログインできました。良かったε-(´∀`*)ホッ

ちなみにですが、.sshの隠しディレクトリに移動しなくてもファイル指定をフルパスにしているだけでもログインできました。

 

このままApacheをインストール!の前に...

 

ここで一度ポート番号を確認します。

SSHクライアント(自分)からSSHサーバーに対して送られるリクエストには

IPアドレスは○○で、ポート番号は22番で接続したい」が含まれています。

この時SSHサーバー側にポート番号22番が設定されていれば、無事通信が成立します。

では、このことをサーバーへ確認してみましょう。

ターミナルで「sudo lsof -i -n -P」と入力。

この時Pは大文字なので気をつけましょう!(私は間違えたのでエラーが出ました。

これは、どのポート番号でどのプログラムを待ち受けているかを確認するコマンド。

注目するのはLISTENと書かれているコード。

これは他のコンピュータから待ち受けているポートです。以下のコードを発見。

sshd     3203     root    3u  IPv4  19250      0t0  TCP *:22 (LISTEN)

↑は、sshdというプログラムが22番で待ち受けていることを示しており、このおかげで自分のPCからssh通信が出来るという仕組み。

確認できたところで、いよいよApacheをインストールしていきます!

 

まずyumをアップデートし最新版にします。ターミナルで、

「sudo yum update -y」で入力。

sudoはルートユーザー権限で実行することを示す。

yumとはLinuxの管理パッケージツールをインストールやアンインストールする時にyumを使用(LinuxはサーバーのOS)。

-yはyesオプション。yesを自動で返す。

完了したら。以下のコマンドを実行。

「sudo yum -y install httpd

httpdApacheを構成する実行ファイルであり、これでインストールする。

「sudo systemctl start httpd.service」

systemctlは指定したアプリケーションを起動したり停止、再起動するコマンド。

これでApacheを起動することを表す。

「sudo systemctl status httpd.service」

起動状態を確認することができる。

Active: active (running) since〜となっていればOK。

この他にも確認する方法はあり、プロセスコマンドがある。

プロセスとは、そのサーバー上で実行中のプログラムのこと。

この中に「httpd」があれば起動していることが確認できる。

「ps -axu」か「ps -axu |  grep httpd」を入力。

/usr/sbin/httpd -DFOREGROUNDがあれば起動OK。

ps -axu |  grep httpdの縦棒はパイプラインといい、左側の出力結果を右側に渡す役割。

grepは検索して表示するコマンド。この場合左側の出力結果の中からhttpdという文字を検索して含まれているものだけ表示。

次に、サーバーが起動する時Apacheも自動で起動するように設定する。

※今のままだとサーバーが停止、再起動するとその都度Apacheを起動する必要あり。

以下のコマンドを実行。

「sudo systemctl enable httpd.service」

enableは自動起動設定する為のコマンド。

設定できたか確認。

「sudo systemctl is-enabled httpd.service」

enabledが返ってくればOK。

これで無事Apacheのインストールが完了。

 

次は③ファイアウォールの設定にいきます!

現段階では、まだWebページを表示できません。ファイアウォールによって通信がシャットダウンされてしまいます。

(試しにパブリックIPv4アドレスをコピーして検索するとアクセスできないことがわかります)

理由は現在パブリックサブネットに許可されている通信はポート番号22番のssh通信のみになっており、それ以外はファイアウォールによって遮断されているから。

AWSにおいては「セキュリティグループ」がファイアウォールの役割を担う。

インバウンド→サーバーへ入ってくる通信(ポートは必要なものだけ開ける)

アウトバウンド→サーバーから出ていく通信(ポートは全て開けることが多い)

インターネットからの通信を受け取るためにすることは、

セキュリティグループのポート80番を開けることです。

では、EC2のセキュリティグループを開き、アウトバウンドを確認。

f:id:miyamon_good:20201211121655p:plain

上記の通り、ポート番号22番のSSH通信のみ通信を通していることがわかりました。

では、設定を変更して通信を通すようにします。

タイプはHTTP、ソースは任意の場所を指定し保存すればOK。

試しにパブリックIPv4アドレスをコピーして検索するとApacheのデフォルト画面が出現を確認できれば、正常に動いています。

 

これで③は完了!

最後に④を実装します。

 

その前にElastic IPアドレスについて軽く説明。

Elastic IPアドレスとは?

インターネット経由でアクセス可能な固定グローバルIPアドレスを取得でき、

インスタンスに付与できるサービス

なぜこれを設定するのか?

現状では、EC2インスタンスを起動や停止をする度に別のIPアドレスが自動で割り当てられます。これでは何かと不便な為、Elastic IPアドレスを使用することでIPアドレスを固定することが出来るから。

Elastic IPアドレスの注意点→料金について

Elastic IPアドレスをEC2インスタンスに関連付けてそのインスタンスが起動中であれば無料で使用可能だが、EC2インスタンスに関連付けていない時や、EC2インスタンスを使用すると料金発生。

Elastic IPアドレスを使用しない時は、Elastic IPアドレスを開放するようにする。

 

それでは、Elastic IPアドレスを紐付けていきましょう!

新しいアドレスの割当から、Elastic IPアドレスを作成。

それのアドレスの関連付けを選択。作成したインスタンスに紐付け、プライベートIPを選択で関連付け完了。設定したElastic IPアドレスをコピーして検索しページが表示されれば設定OK。

Elastic IPアドレスインスタンスに紐付けていないと課金されるため、インスタンスを停止する場合は「アドレスの関連付けを解除」し、「アドレスを解放」することで料金の発生を防ぐことができます。

インスタンスを停止した場合は、Elastic IPアドレスの解放を忘れないようにしましょう!

 

以上でWebサーバーの構築が完了!

次は「Route 53」でDNSを設定していこうと思います。 

AWS勉強③Webサーバーの構築~準備パート~

本日はWebサーバーの構築、すなわちEC2を使って実装していきたいと思います!

まずは構築にあたって必要な知識と技術をざっくり学びます。

 

・EC2(Elastic Compute Cloud)

AWSが提供する仮想サーバー」で従量課金制のサービス。

EC2インススタンスとは、EC2から建てられたサーバー一つ一つのことを指す。

作成の手順をざっくりおさえておきます。

1,AMIの選択(Amazon Machine Image)

インスタンス起動に必要な情報が入ったOS?に近いイメージ。

サーバーのテンプレートのようなもの。

2,インスタンスタイプの選択

「サーバーのスペックを定義したもの」

アクセス数などに応じて必要なスペックのあるインスタンスタイプを選択。

インスタンスファミリー+インスタンス世代+インスタンスサイズで構成。

世代は数字の大きいものが最新世代のため、大きいものを推奨されている。

3,ストレージの追加

「サーバーにくっつけるデータの保存場所」

EBS(Elastic Block Store)とインスタンスストアの2種類あり、

EBSは高い可能性と耐久性を持ち、永続性と耐久性が必要なデータを置く。

インスタンスストアは一時ファイルやキャッシュなどの、失われても問題がないデータを置く。(Stop/Terminateでデータが消えるため)

EBSは追加費用有り、インスタンスストアは無料で使用可能。

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

インターネットと通信する為にセキュリティグループのポートを設定。

5,SSHキーペアの設定

 

Apache

「Webサーバーのソフトウェア」これによりサーバーはWebサーバーとなる。

 

ファイアウォール

「通して良いデータだけを通し、それ以外を遮断する壁」

AWSでは、「セキュリティグループ」がファイアウォールの役割を担う。

 

SSH

「サーバーと自分の目の前のパソコンをセキュアに繋ぐサービス」

SSHクライアント(自分)とSSHサーバー(操作するサーバー)をSSHでログインすることでデータを暗号化された遠隔操作を可能としている。

SSHでログインすることでサーバーに入って自分のパソコンから操作することが可能。

イメージ的には自分がまるでWebサーバーの目の前にいるかのように、操作可能。

 

・公開鍵認証

「サーバーに本人だけがログインできるようにする認証」

公開鍵認証のイメージは南京錠に近い。

南京錠本体≒公開鍵(サーバーから公開鍵で暗号化した物が送られる)

南京錠の鍵≒秘密鍵秘密鍵で復号化したデータをサーバーへ送る)

サーバーからそのデータが合っていればログインすることが可能。

公開鍵を用いて暗号化し、内容は秘密鍵で復号するイメージ。

 

・ポート番号

「プログラムのアドレス」

同一コンピュータ内で通信を行うプログラムを識別する時に利用される。

 

予備知識は以上です。

実装のゴールは、

パブリックサブネットの中にWebサーバーを設置し表示できる状態にすること。

実装の順番は以下の通り。

①パブリックサブネットの中にサーバーを設置し、apacheをインストール。

(インターネットへ接続し、Webサーバーとして表示する準備)

②インターネットからWebサーバーにアクセスされたときに、Webページを表示できるようにファイアウォールを設定

 

では、次回から実装に入ります!