AWSアーキテクチャー設計

概要

AWS VPC上にEC2/RDSを立ち上げ、冗長化構成を構築する方法。構成図は以下の通りです。

 

前提条件

・AWSアカウントを所持していること。

 

VPCの作成

Elastic IPアドレスの作成

① AWSマネジメントコンソール「サービスを検索する」から「VPC」と入力し「VPC」を選択します。

 

② VPC左メニュー「Elastic IP」→「Elastic アドレスの割り当て」を選択します。

 

③ 「割り当て」をクリックします。

 

④ Elastic IPが割り当てられます。

 

VPCの作成

① VPC左メニュー「VPCダッシュボード」→「VPCウィザードの起動」を選択します。

 

② 「パブリックとプライベートサブネットを持つVPC」→「選択」を選択します。

 

③ VPCとサブネットの作成をします。入力後「VPCの作成」をクリックします。

IPv4 CIDR ブロック VPCのCIDRを設定
IPv6 CIDR ブロック IPv6を利用しない場合は「IPv6 CIDR ブロック」なし
VPC名 VPCの名前を入力
パブリックサブネットのIPv4 CIDR パブリックサブネットのIPのCIDRを設定
アベイラビリティーゾーン 任意のゾーンを選択する
パブリックサブネット名 サブネット名を指定
(設定したアベイラビリティーゾーンがわかる名前がよい)
プライベートサブネットのIPv4 CIDR プライベートサブネットのIPのCIDRを指定
アベイラビリティーゾーン パブリックで指定した同じゾーンを指定
プライベートサブネット名 サブネット名を指定
(設定したアベイラビリティーゾーンがわかる名前がよい)
Elastic IP 割り当てID 作成したElastic IPを割り当てる

④ 作成に少し時間を要しますが作成後、以下の画面が表示されるので「OK」をクリックします。

 

サブネットの作成

別のAZのパブリック、プライベート用のサブネットを作成します。

 

① VPC左メニュー「サブネット」→「サブネットの作成」を選択します。

 

② パブリック用のサブネットを作成します。入力後「作成」をクリックします。

名前タグ 任意の名前を入力します。
VPC 作成したVPCを選択します。
アベイラビリティーゾーン VPCで作成したアベイラビリティーゾーン以外を選択します。
IPv4 CIDR ブロック IP、サブネットマスクを入力します。

 

③ 作成が完了するので「閉じる」をクリックします。

④ VPC左メニュー「サブネット」→「サブネットの作成」を選択します。

 

⑤ プライベート用のサブネットを作成します。入力後「作成」をクリックします。

名前タグ 任意の名前を入力します。
VPC 作成したVPCを選択します。
アベイラビリティーゾーン VPCで作成したアベイラビリティーゾーン以外を選択します。
IPv4 CIDR ブロック IP、サブネットマスクを入力します。

 

⑥ 作成が完了するので「閉じる」をクリックします。

 

⑦ パブリックサブネットにチェックを入れ「アクション」→「自動割り当てIP設定の変更」をクリックします。

パブリックサブネットは2つあるので、2つ設定をしてください

 

⑧ 「IPv4の自動割り当て」にチェックを入れ「保存」をクリックします。

ルートテーブルの編集

① VPC左メニュー「ルートテーブル」→「Name」の編集で名前を入力します。インターネットゲートウェイの設定が入っているルートテーブルを選択し「サブネットの関連付けの編集」をクリックします。

 

※インターネットゲートウェイ(パブリック側)の判別方法

「ルートテーブル」を選択し「ルート」タブを開き、「igw…」と表示されている

 

② パブリックのサブネットを2つ選択し「保存」をクリックします。

 

③ プライベートのルートテーブルを選択し「サブネットの関連付けの編集」をクリックします。

 

④ プライベートのサブネットを2つ選択し「保存」をクリックします。

 

 

EC2インスタンスの作成

 

パブリック用EC2インスタンスの作成 1

① AWSマネジメントコンソールのサービスを検索するから「ec2」と入力し「EC2」を選択します。

 

② EC2左メニュー「インスタンス」→「インスタンスの作成」をクリックします。

 

③ 「Amazon Linux2」を選択します。

 

④ 無料枠の「t2.micro」を選択し「次のステップ:インスタンスの詳細の設定」を選択します。

 

⑤ 以下を選択します。

ネットワーク 作成済みのVPC
サブネット 作成済みのパブリックサブネット
自動割り当てパブリックIP 「有効」(パブリックIPを割り当てるため)
IAMロール 作成済みのロールを選択
終了保護の有効化 「チェック」(誤終了防止)
モニタリング 「チェック」

 

⑥ EC2起動時、初期設定を自動で入力するため、ユーザーデータに以下のコードをコピーします。その後「次のステップ:ストレージの追加」をクリックします。

#!/bin/bash

## パッケージの更新
##----------------------------------------------------------------------------
sudo yum update -y
 

## ホスト名の変更(hostnameを任意の値に変更)
##----------------------------------------------------------------------------
sudo sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=sample-webserver1/g' /etc/sysconfig/network
hostname 'sample-webserver1'

## タイムゾーンの変更
##----------------------------------------------------------------------------
# ローカルタイムを日本に変更
sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

# ハードウェアクロックを日本に変更
sudo sed -i "s/\"UTC\"/\"Japan\"/g" /etc/sysconfig/clock


## 文字コードを日本語に変更
##----------------------------------------------------------------------------
sudo sed -i "s/en_US\.UTF-8/ja_JP\.UTF-8/g" /etc/sysconfig/i18n
LANG=ja_JP.UTF-8


## パッケージの自動更新設定 (任意)
##----------------------------------------------------------------------------
# インストール
sudo yum install yum-cron -y

# 有効化
sudo chkconfig yum-cron on

# 自動更新設定
sudo sed -i "s/^apply_updates.*$/apply_updates = yes/g" /etc/yum/yum-cron.conf

# 起動
sudo service yum-cron start


## 新規ユーザー「web-user」を作成し「ec2-user」を削除(任意)
##----------------------------------------------------------------------------
# 新規ユーザーの作成
sudo useradd web-user

# 新規ユーザー用の.sshディレクトリの作成
sudo mkdir /home/web-user/.ssh

# ec2-userの用のauthorized_keysをコピー
sudo cp -a /home/ec2-user/.ssh/authorized_keys /home/web-user/.ssh/

# パーミッションの変更
sudo chmod 700 /home/web-user/.ssh
sudo chmod 600 /home/web-user/.ssh/authorized_keys

# オーナーの変更
sudo chown -R web-user:web-user /home/web-user/.ssh

# sudoの許可
sudo bash -c "echo 'web-user     ALL=(ALL)       NOPASSWD:ALL' >> /etc/sudoers"

# ec2-userの削除aaa
userdel -r ec2-user


## Apacheのインストール
##----------------------------------------------------------------------------
sudo yum install httpd -y 
sudo chkconfig httpd on
sudo systemctl start httpd

 

⑦ 「次のステップ:タグの追加」をクリックします。

 

⑧ EC2上のNameを設定します。キーに「Name」値に「サーバー名」を入力し「次のステップ:セキュリティグループの設定」をクリックします。

 

⑨ 「新しいセキュリティグループ」を選択し「セキュリティグループ名」「説明」を入力します。Webサーバーの作成のサンプルとして「HTTP」「HTTPS]を追加し「確認と作成」をクリックします。

 

⑩ 「起動」をクリックします。

 

⑪ キーペアを選択し「インスタンスの作成」をクリックします。

  ※キーペアを新規に作成する方法は「https://se-log.net/aws-ec2-terminal/#outline__2_5」を参照ください。

 

⑫ 「インスタンスの表示」をクリックします。

 

作成後のEC2の確認 1

① インスタンスから作成したEC2インスタンスを選択し、IPv4パブリックIPをコピーします。

 

② ターミナルからsshでEC2にログインします。

ssh -i "*********.pem" web-user@xxx.xxx.xxx.xxx

 

③ 自動設定が設定が反映されているか確認する

# ホスト名の確認
hostname

# タイムゾーンの確認 
cat /etc/sysconfig/i18n
echo $LANG

# ローカルタイムの確認 (JTS-9と表示されればOK)
strings /etc/localtime

# yumの確認
yum check-update
yum list installed | grep yum-cron

# Apacheの確認
httpd -v

 

④ サンプルのhtmlファイルを作成するため、htmlディレクトリに移動する

cd /var/www/html

 

⑤ htmlのサンプルファイルの作成

vim index.html
<html>
	<head>
		<title>Sample HTML</title>
	</head>
	<body>
		<h1>Hello World Web1</h1>
	</body>
</html>

 

⑥ パブリック用のIPを入力して、ブラウザで表示できるか確認します。

http://xxx.xxx.xxx.xxx

パブリック用EC2インスタンスの作成 2

AWSマシンイメージ(AMI)を利用して、作成済みのEC2インスタンスをコピーして作成します。

 

① 作成済みのEC2インスタンスを選択し「アクション」→「イメージ」→「イメージの作成」を選択します。

 

② 「イメージ名」「イメージの説明」を入力し「イメージの作成」をクリックします。

 

③ イメージが作成されます。

 

④ EC2左メニュー「AMI」→「起動」をクリックします。

 

⑤ 無料枠の「t2.micro」を選択し「次のステップ:インスタンスの詳細の設定」を選択します。

⑥ 以下を選択し「次のステップ:ストレージの追加」をクリックします。

ネットワーク 作成済みのVPC
サブネット 作成済みのパブリックサブネット(最初に作成したEC2インスタンスとは別AZ)
自動割り当てパブリックIP 「有効」(パブリックIPを割り当てるため)
IAMロール 作成済みのロールを選択
終了保護の有効化 「チェック」(誤終了防止)
モニタリング 「チェック」

 

⑦ 「次のステップ:タグの追加」をクリックします。

 

⑧ EC2上のNameを設定します。キーに「Name」値に「サーバー名」を入力し「次のステップ:セキュリティグループの設定」をクリックします。

 

⑨ 「既存のセキュリティグループ」を選択し「確認と作成」をクリックします。

 

⑩ 「起動」をクリックします。

 

⑪ キーペアを選択し「インスタンスの作成」をクリックします。

※キーペアを新規に作成する方法は「https://se-log.net/aws-ec2-terminal/#outline__2_5」を参照ください。

 

⑫ 「インスタンスの表示」をクリックします。

作成後のEC2の確認 2

① インスタンスから作成したEC2インスタンスを選択し、IPv4パブリックIPをコピーします。

② ターミナルからsshでEC2にログインします。

ssh -i "*********.pem" web-user@xxx.xxx.xxx.xxx

 

③ 自動設定が設定が反映されているか確認する

# ホスト名の確認
hostname

# タイムゾーンの確認 
cat /etc/sysconfig/i18n
echo $LANG

# ローカルタイムの確認 (JTS-9と表示されればOK)
strings /etc/localtime

# yumの確認
yum check-update
yum list installed | grep yum-cron

# Apacheの確認
httpd -v

 

④ サンプルのhtmlファイルを作成するため、htmlディレクトリに移動する

cd /var/www/html

 

⑤ htmlのサンプルファイルの作成(Hello World Web2に変更)

vim index.html
<html>
	<head>
		<title>Sample HTML</title>
	</head>
	<body>
		<h1>Hello World Web2</h1>
	</body>
</html>

 

⑥ パブリック用のIPを入力して、ブラウザで表示できるか確認します。

http://xxx.xxx.xxx.xxx

 

Certificate Managerに証明書登録

SSL証明書が発行されていることを前提条件です。無料のSSL証明書「Let’s Encrypt」の設定は https://se-log.net/lets-encrypt/ を参照して発行してください。

 

① AWSマネジメントコンソールのサービスを検索するから「acm」と入力し「Certificate Manager」を選択します。

 

② 「証明書のインポート」をクリックします。

 

③ 証明書情報をコピー&ペーストし「次へ」をクリックします。

証明書本文 cert.pem
証明書のプライベートキー private.pem
証明書チェーン chain.pem

 

④ タグ名「Name」値に「証明書名」を入力し「レビューとインポート」をクリックします。

 

⑤ 「インポート」をクリックします。

 

ロードバランサーの作成

① EC2左メニュー「ロードバランサー」→「ロードバランサーの作成」をクリックします。

 

② ロードバランサーの種類を選択します。

Application Load Balancer HTTP/HTTPSトラフィックを使用するWEBアプリケーション(小規模サイト)
Network Load Balancer 大規模なTLSのオフロード、UDPサポート(動画サイト) (大規模サイト)
Classic Load Balancer EC2-Classicを利用しているアプリケーションのみ (基本利用しない)

 

③ ロードバランサーの名前を入力し「リスナーの追加」をクリックし「HTTPS」を追加します。

 

④ 作成した「VPC」を選択し、2つのアベイラビリティーゾーンにチェックを入れ、パブリックサブネットをそれぞれ選択します。

 

⑤ キーに「Name」値に「ロードバランサー名」を入力し「次の手順:セキュリティ設定の構成」をクリックします。

 

⑥ 証明書タイプ「ACMから証明書を選択する」を選択し、作成済みの「証明書の名前」を選択します。「次の手順:セキュリティグループの設定」をクリックします。

 

⑦ EC2インスタンス作成時に設定した「セキュリティグループ」を選択し「次の手順:ルーティングの設定」をクリックします。

 

⑧ ターゲットグループの「名前」を入力します。「次の手順:ターゲットの登録」をクリックします。

 

⑨ 対象のインスタンスを選択し「登録済みに追加」をクリックします。「次の手順:確認」をクリックします。

 

⑩ 「作成」をクリックします。

 

⑪ 作成が完了するので「閉じる」をクリックします。

 

ドメインの変更

ロードバランサーのDNS名ではなく、別のドメインに割り当てる方法。
※ 「Route53」の「ホストゾーン」にレコード登録が無い場合は、DNS名でブラウザにアクセスしてください。
例としてse-log.netのサブドメイン「test.se-log.net」とELBのCNAMEを作成します。

 

① 作成されたロードバランサーが表示されるので「DNS名」をコピーします。

 

② AWSマネジメントコンソールのサービスを検索するから「53」と入力し「Route53」を選択します。

 

③ Route53左メニュー「ホストゾーン」→「ドメイン名」をクリックします。

 

④ 「レコードを作成」をクリックします。

 

⑤ 「シンプルルーティング」を選択し「次へ」をクリックします。

 

⑥ 以下、入力します。入力後「シンプルなレコード定義」をクリックします。

レコード名 サブドメインの値を入力
値/トラフィックのルーティング先 レコードタイプに応じたIPまたは別の値
ロードバランサーのDNSを入力
レコードタイプ CNAME

 

⑦ 「レコードを作成」をクリックします。

 

ブラウザチェック

ブラウザでサイトにアクセスして、以下を確認します。

・HTTPS接続が正常に行われる
・ロードバランサーが正常に機能している(ページをリロードした際に「Web1/Web2」に切り替わる)

 

Auto Scalingの設定

Auto Scaling
EC2インスタンスの設定した値に達した場合に、スケールアウトしてインスタンスの台数を自動的に増やして負荷分散する機能。

 

起動設定

① EC2左メニューAuto Scaling「起動設定」→「起動設定の作成」をクリックします。

 

② 名前を入力して、作成済みのAMIを選択します。インスタンスタイプは「t2.micro」を選択しています。

 

③ セキュリティグループはEC2作成時に設定した「セキュリティグループ」を選択します。

 

④ EC2インスタンスで利用している「既存のキーペア」を選択し「起動設定の作成」をクリックします。

 

⑤ 設定が完了します。

 

Auto Scaling グループ

① EC2左メニュー「Auto Scaling グループ」→「Auto Scalingグループを作成する」をクリックします。

 

② 「Auto Scalingグループの作成」をクリックします。

 

③ 「Auto Scalingグループ名」を入力し、起動テンプレートのリンク「起動設定に切り替える」をクリックします。

 

④ 「起動設定」で設定したものを選択し「次へ」をクリックします。

 

⑤ 作成した「VPC」を選択し、2つのAZの「パブリックサブネット」を選択します。「次へ」をクリックします。

 

⑥ 以下、設定し「次へ」をクリックします。

ロードバランシングの有効化 チェック
Application Load Balancer 選択
ロードバランサーのターゲットグループ ELBで設定した「ターゲットグループ」を選択
ヘルスチェック ELBにチェック
モニタリング チェック

 

⑦ グループサイズを選択します。

希望する容量 EC2インスタンスを何台利用したいか
最小キャパシティ EC2インスタンスの最小値
最大キャパシティ EC2インスタンスの最大値
(設定した分のAuto Scaling用のインスタンスが起動)

 

⑧ 「ターゲット追跡スケーリングポリシー」を選択。Auto Scalingするターゲット値を設定します。以下は、CPUが80%を超えた場合にスケールする設定です。設定後「次へ」をクリックします。

「スケールインを無効にしてスケールアウトポリシーのみを作成する」にチェックを入れた場合、ターゲット値を超えてスケールアウトした後、ターゲット値が戻った際にスケールインしない。

 

⑨ Auto Scalingが実行された場合に通知が必要な場合は「通知の追加」で設定します。「次へ」をクリックします。

 

⑩ タグを追加では「タグを追加」をクリックし、キー「Name」、値・オプション「グループ名」を入力し「次へ」をクリックします。

 

⑪ 確認画面が表示されるので、確認後「Auto Scalingグループを作成」をクリックします。

 

⑫ 作成が完了します。

 

⑬ EC2インスタンス画面を表示すると、Auto Scaling用のインスタンスが立ち上がります。

 

スケールインの終了ポリシー

Defaultの設定の場合、EC2インスタンスがスケールインした際に、古いインスタンスから削除します。Auto Scalingで作成されたインスタンスから削除する設定にします。

 

① 作成したAuto Scaling グループにチェックを入れ、高度な設定の「編集」をクリックします。

 

② 終了ポリシーをDefaultから「Newest Instance」に変更します。「更新」をクリックします。

 

Auto Scalingグループのアタッチ

作成したEC2インスタンスすべてに適用してください

① EC2左メニュー「インスタンス」→「作成済みインスタンスにチェック」→「アクション」→「インスタンスの設定」→「Auto Scalingグループにアタッチする」を選択します。

 

② 「既存のAuto Scalingグループ」を選択し「作成済みのAuto Scalingグループ」を選択し「アタッチ」をクリックします。

 

③ 「閉じる」をクリックし、完了です。

 

Auto Scalingのテスト

設定したターゲット値を超えた場合に、自動的にEC2インスタンスが作成されるかチェックします。

 

① 作成済みの1つのEC2インスタンスにsshでログインします。

ssh -i "******.pem" ec2-user@xxx.xxx.xxx.xxx

 

② root権限でログインします。

sudo su

 

③ stressコマンドのダウンロードをします。

wget http://ftp.riken.jp/Linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm

 

④ rpmでstressコマンドのインストールをします。

rpm -ivh stress-1.0.2-1.el7.rf.x86_64.rpm

 

⑤ インストールの確認のため、バージョンを表示します。

stress --version

 

⑥ 「CPU 99%」にするコマンドを実行します。

stress -c 1 -q &

 

⑦ topコマンドで実際に負荷が掛かっているか確認します。

top

 

⑧ 負荷により、しばらくするとAuto Scalingでインスタンスが自動的に作成されます。

インスタンスの作成・削除は時間が掛かります。

 

⑨ stressコマンドを停止します。

pkill stress

 

⑩ Auto Scalingで作成されたインスタンスが削除されることを確認します。

 

RDSの作成

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

① AWSマネジメントコンソールのサービスを検索するから「rds」と入力し「RDS」をクリックします。

 

② RDS左メニュー「サブネットグループ」→「DBサブネットグループを作成」をクリックします。

 

③ 名前、説明を入力し、作成したVPCを選択します。

 

④ アベイラビリティーゾーンで「2つ」のゾーンを指定します。作成済みのサブネットを「2つ」選択します。その後「作成」をクリックします。

 

⑤ RDSのサブネットグループが作成されました。

 

データベースの作成

① RDS左メニュー「データベース」→「データベースの作成」をクリックします。

 

② 「標準作成」を選択します。作成するSQLを選択します。

 

③ テンプレート は「開発/テスト」を選択します。

「マルチAZ配置」の設定するために、無料利用枠を指定していません。

 

④ 任意の「DBインスタンス識別子」を入力し、ユーザー名、パスワードを入力します。

 

⑤ DBインスタンスサイズをしてします。

 

⑥ ストレージタイプとストレージを割り当てます。自動スケーリングの設定をします。

「ストレージの自動スケーリング」をONにすると、データベースの容量が増えた場合に自動的にスケーリングしてくれます。しきい値を設定することで、MAXの容量の指定が可能です。

 

⑦ 「マルチAZ配置」を選択します。

 

⑧ 作成済みの「VPC」「サブネットグループ」を選択します。

 

⑨ データベース認証は「パスワード認証」を選択します。

 

⑩ 「追加設定」をクリックすると詳細な設定を選択することが可能です。

 

⑪ 設定した内容のコスト(月)が表示されています。問題なければ「データベースの作成」をクリックします。

 

⑫ データベースの作成を開始します。作成まで「数分掛かります。

 

接続テスト

① 作成済みの「セキュリティグループ」名をクリックし「インバウンドルールの編集」をクリックします。

 

② インストールしたSQLを指定し「0.0.0.0/0」を入力し「ルールを保存」をクリックします。

「0.0.0.0/0」はIPの疎通をすべて許可する指定です。

 

③ EC2インスタンスからRDSへアクセスするためのエンドポイントをコピーします。

RDS左メニュー「データベース」→「データベース名」→ 「エンドポイント」をコピーします。

 

④ 作成済みのEC2インスタンスにターミナル経由でsshでログインします。

ssh -i "*********.pem" web-user@xxx.xxx.xxx.xxx

 

⑤ SQLコマンドを実行できる環境をインストールします。(下記はMySQLの例)

yum install mysql -y

 

⑥ SQLにログインします。

mysql -h (コピーしたエンドポイント) -u (ユーザー名) -p

 

⑦ RDSで設定したパスワードを入力しEnterを押します。

Enter Password: (パスワード)

 

⑧ データベースを作成します。

以下コマンドはMySQLのコマンドとなります。

create database sampledb;

 

⑨ 作成したDBへ移動します。

use sampledb;

 

⑩ テーブルを作成します。サンプルとして「items」のテーブル内に「ID]「Item」の列を作成しています。

create table sampledb.items(ID int, Item varcher(20));

 

⑪ テーブルが作成されたか確認します。

show tables;

 

⑫ テーブル内にサンプルデータを入力します。

insert into items values(100, "みかん");
insert into items values(101, "りんご ");

 

⑬ データが登録されたか確認します。

select * from items;

 

RDSスナップショットの取得

① RDS左メニュー「スナップショット」→「スナップショットの取得」をクリックします。

 

② 作成済みの「DBインスタンス」を選択します。「スナップショット名」を入力し「スナップショットの取得」をクリックします。

 

RDSスナップショットの復元方法

① 取得したスナップショットを選択し「アクション」→「スナップショットを復元」をクリックします。

 

② DBインスタンス識別子を入力します。

 

③ DBインスタンスサイズを選択します。

 

④ 「マルチAZ配置」をするか選択します。

 

⑤ 「DBインスタンスの復元」をクリックします。

 

⑥ 新しいデータベースが作成されていることを確認します。

 

Automated backupsから復元

Automated backupsとは
RDS側で指定した期間に従ってバックアップを保持してくれる機能

① RDS左メニュー「Automated backups」→「作成済みのDBを選択」→「アクション」→「特定時点への復元」をクリックします。

 

② 「DBインスタンスのクラス」を指定します。「マルチAZ配置」を「はい」と選択します。

 

③ 「DBインスタンス識別子」を入力します。

 

④ 「特定時点への復元」をクリックします。

 

⑤ データベースが作成されたことを確認します。

 

RDSリードレプリカの作成

参照用のデータベースを作成し、メインDBを更新用として負荷分散させる仕組み

① 「作成済みのDBを選択」→「アクション」→「リードレプリカの作成」をクリックします。

 

② 「DBインスタンスのクラス」を選択します。マルチAZ配置は「いいえ」を選択します。

 

③ 「アベイラビリティーゾーンの選択」をします。

 

④ 任意の「DBインスタンス識別子」を入力します。

 

⑤ 「リードレプリカの作成」をクリックします。

 

⑥ データベースが作成されたことを確認します。