はじめに
現在SIer5年目でjavascript(Jqueryのみ)、PHP(フレームワーク無し)を2年ほど、C#(Windowsアプリ)3年ほどやってきました。
色々なご縁があり、個人で最近Webサービスの立ち上げをやることになったのですが何せ本当にWebサービスを立ち上げるための知識がほぼ0に等しいです
ただ今後のキャリアを考えた時に今のままではいけないと思いチャレンジすることにしました。
まずは最初に技術を習得しないといけないので、学ぶ&アウトプットするために毎回投稿していこうと思います。
今後身についていこうと思ってるのは下記のような技術です。
AWS
Docker
CI/CD環境の構築(何を使うかはまだ未定)
Laravel
Nuxt.js
今回はAWSについて学んでいきます。
今回学ぶこと
AWSでのVPC構築について
WebサーバとDBサーバを構築していきます。
- 外部のネットワークアクセス用のInternetGWmを作成する
- Webサーバは外部からアクセスを許可する
- DBサーバは内部からのアクセス(厳密にはWebサーバからのみ)許可する
- DBを構築する際に外部からmysqlなどインストールするのにネットワークに繋がないといけないため
NATGWから外部に接続する様に設定
-
VPC
ネットワークアーキテクチャの親玉 -
サブネット
VPCの中にIPの割り当てをした領域の設定
パブリックは外からでも見れる領域
プライベートはVPCの内部からしか見れない領域 -
ルートテーブル
IPアドレスの指定がされた時にどこにアクセスを行うのか設定を行う -
internetGW
外部のNWとアクセスするためのGW -
NAT GW
プライベートサブネットが外部のネットワークにアクセスするために経由させる機能
構築手順
- VPCを作る
- パブリックサブネットをを作る▶︎Webサーバの構築
- プライベートサブネットを作る▶︎DBサーバの構築
リージョン/アベイラビリティーゾーンとは
クラウドでのサーバを構築する実際の場所などの定義
リージョン
複数の地域を束ねたデータセンターの場所
アベイラビリティーゾーン
リージョンの中でも各データセンターの場所
VPCとサブネットの関係
VPCは全てのアベイラビリティーゾーンにまたがっている
サブネットは各アベイラビリティーゾーンに設定される
1. VPCを作る
VPCだけでなく、パブリック/サブネット/InternetGWも一緒に作成していく
新たにVPCを作成する
1個のVPCを作成を選択し、下記の設定にしVPCの作成を押下
publicサブネットも作成され、ルーティング設定も自身のIPアドレス群ならlocalに、それ以外であればinternetGWにいく様に定義されている
サブネットを新しく作る
先ほどはサブネット1aを作成したので、今度はサブネット1cを作成していく
サブネット作成ボタンを押下し、新しくサブネットを作成する設定を行っていく
作成後、ルーティングでinternetGWに対して設定されてないので設定を行っていく
2. パブリックサブネットをを作る▶︎Webサーバの構築
Webサーバ用EC2の作成
今回もインスタンスの作成から作業を行っていく
今までと違う箇所をピックアップする
インスタンスの詳細の設定
※本体はフルオープンにするべきではない
Webサーバ用EC2の設定
サーバの構築ができたので、インスタンスを起動しSSHで接続する
ssh -i {sshキーファイルのpath} ec2-user@{インスタンスのpublicIPアドレス}
下記の手順でWebサーバの設定を行う
## ホスト名の変更
sudo vim /etc/sysconfig/network
====
HOSTNAME=XXXX
====
sudo vi /etc/hosts
====
127.0.0.1 に↑を追加する
====
## OS の言語設定
sudo vi /etc/sysconfig/i18n
====
前)LANG=en_US.UTF-8
後)LANG=ja_JP.UTF-8
====
## OS の時刻設定
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo vim /etc/sysconfig/clock
====
ZONE="Asia/Tokyo"
====
# 必要なパッケージの導入
sudo yum update -y
sudo yum install -y httpd24
sudo yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
sudo yum install -y mysql
sudo yum install -y git
# Apache の設定
## DirectoryIndex の変更
sudo vim /etc/httpd/conf/httpd.conf
====
変更前)
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
変更後)
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
====
====
ServerName もコメントアウトを外して、hostname に変更する
====
## httpd.conf の確認テスト
sudo /etc/init.d/httpd configtest
## EC2 インスタンス再起動時に、自動で httpd プロセスが上がるように設定
sudo chkconfig httpd on
## httpd の立ち上げ
sudo service httpd start
# PHP の設定
# 日本語を扱える様に設定を変更していく
sudo vim /etc/php.ini
====
# Dynamic Extensions の下の方に
extension=mbstring
====
====
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
====
# サンプルリソース取ってくる
git clone https://github.com/ketancho/udemy-aws-14days.git
cd udemy-aws-14days/Day3/
sudo cp index.php /var/www/html/
sudo cp -r img /var/www/html/
3. プライベートサブネットを作る▶︎DBサーバの構築
DBサーバを構築する
プライベートサブネットの作成
DB構築箇所のプライベートサブネットを作成する
1aと1cそれぞれ作成する。
ルートテーブルの作成
ルートテーブルメニューからルートテーブル作成を押下し、画像の様に設定を行う
VPCは今回作成したものを選ぶ
それぞれ先ほど作成したプライベートサブネットにルートテーブルを適用する
1cの方も同様に
DBサーバ用インスタンスの作成
インスタンスの詳細の設定
#!/bin/bash
# ホスト名
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=udemy-aws-14days-db-1a/g' /etc/sysconfig/network
hostname 'udemy-aws-14days-db-1a'
# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
セキュリティグループの設定
※セキュリティグループについての補足
セキュリティグループはアクセスを許可をIPだけでなく、SGに対しても指定できる
NATGWを導入する
- NAT GWの作成
[NATゲートウェイ]>[NATゲートウェイの作成]
NATGWを配置するサブネットIDとPublicIPアドレスを設定する
新しいEIPを作成してそのまま設定することも可能です。
- ルートテーブルの設定
DBサーバを配置しているプライベートサブネットのルートテーブルをローカルIP以外に設定された際にNATGWにアクセスする様に設定を行う
MySQLのインストール
- WebサーバからDBサーバにSSHで接続できる様にSSHキーのファイルをローカルからコピーする
- DBサーバまで接続する
- mysqlをインストールし、インスタンス起動時にmysqlも起動する様に設定
- アプリを動作させるためにデータの作成
- アプリからDBにアクセスしデータを取得する様に修正
# 秘密鍵を Web サーバへコピー
scp -i udemy-aws-14days.pem udemy-aws-14days.pem ec2-user@x.x.x.x:/home/ec2-user/
# Web サーバへSSH(x.x.x.x は Web サーバのグローバルIPアドレス)
ssh -i udemy-aws-14days.pem ec2-user@x.x.x.x
# Web サーバへSSH(y.y.y.y は DB サーバのプライベートIPアドレス)
ssh -i udemy-aws-14days.pem ec2-user@y.y.y.y
# yum update
sudo yum update -y
## インストール&初期設定
sudo yum install -y mysql57-server
sudo chkconfig mysqld on
sudo service mysqld start
mysqladmin -u root password
## DB サーバ上で mysql 接続 & サンプルテーブルの作成
mysql -u root -p
create database simple_blog;
use simple_blog;
create table posts (id int not null primary key, title varchar(100), detail varchar(1000), image varchar(1000));
insert into posts values (1, "XXXX", "XXXXXXXXXX", "./img/img1.jpeg");
insert into posts values (2, "YYYY", "YYYYYYYYYY", "./img/img2.jpeg");
grant all privileges on *.* to root@"%" identified by 'rootroot' with grant option;
## Web サーバから mysql 接続
mysql -h x.x.x.x -u root -p
SGとネットワークACL(NACL)について
SGはインスタンスごとに対してNACLはサブネット単位で設定を行える
IN:OUTそれぞれに制限をかけることが可能
ネットワーク設計での注意点
- VPC&サブネットは将来も考えて適切な広さにする
- 広すぎてもIPが被った際には動かなくなる恐れも(VPC Peering)
- 1システム/1アカウント(1IAM)にするべき