イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

AWSのサービスを使ってLAMP環境を構築してみた

こんにちは、小柳津です。
先日、 AWS 認定ソリューションアーキテクト – アソシエイト を受験して合格しました!

AWS Certified Logo SAA 588x300 Color.png

今までAWSをほぼ触ったことがなかったのですが、試験を受けるにあたって触ってみることにしました。
具体的には、以下の基本的なサービスを用いて、LAMP環境を構築してみました。

  • VPC

  • EC2

  • EBS

  • ELB

  • Route53

そして上記サービス利用して作成したWebアプリケーションがコチラ。

aws blog.png

簡単なブログを作ってみました。

こちらのブログは以下のようなLAMP環境で動作しています。

  • Amazon Linux

  • Nginx

  • PHP(フレームワーク: Laravel)

  • MySQL

Webアプリケーションを作成する上では以下のような順番で作成しました。

  1. AWS上でLAMP環境を構築

  2. 作成していたアプリケーションのソースコードをAWS上にLAMP環境にクローンする

  3. ドメイン名を取得し、割り当てる

今回は1番をメインに話を進めていこうと思います。

構成

先程のアプリケーションを実行するLAMP環境のアーキテクチャはこのように設計しました。

aws architecture01.png

このアーキテクチャのポイントは以下です。

  • Webサーバ用のパブリックサブネットを2つ設置し、AZは分ける

  • Webサーバへの通信はELBで負荷分散を行う

  • パブリックサブネットにNATインスタンスを設置する

  • プライベートサブネットに設置したDB用EC2にMySQLをインストールする

  • DBへの通信もELBで負荷分散を行う

ここでツッコミポイントなのが、RDSを使わずにEC2にMySQLをインストールする点。
これの理由は試験勉強も兼ねて、NATインスタンスを使ってプライベートサブネットからインターネットへ接続を行いたかったからです。
DB用EC2をプライベートサブネットに設置し、yum installを使ってインターネット経由でMySQLをインストールすることを実践してNATインスタンスの役目や作成方法を覚えました。
リージョンサービスであるS3やDynamoDB、SQSなどをプライベートサブネットから使用するためには必要なNATインスタンスなので、いい勉強になりました。

このアーキテクチャを構成するために以下のような手順で行いました。

  1. VPC・サブネットの作成

  2. EC2の設置とセキュリティグループ設定

  3. ELBの設置とセキュリティグループ設定

  4. Route53の設定

上記の手順で以下の画像のように行いました。

aws architecture02.png

※手書きで失礼します

順番に説明していきます。

VPC・サブネットの作成

VPCのCIDRブロックは192.168.0.0/16と設定しました。
そして そのVPCの中に4つのサブネットを作ります。

  • NAT用サブネット(パブリック)

    • CIDRブロック: 192.168.0.0/24

    • 名前: pub-nat-a

    • Availability Zone: ap-northeast-1a

  • Webサーバ用サブネット1(パブリック)

    • CIDRブロック: 192.168.1.0/24

    • 名前: pub-web-a

    • Availability Zone: ap-northeast-1a

  • Webサーバ用サブネット2(パブリック)

    • CIDRブロック: 192.168.2.0/24

    • 名前: pub-web-c

    • Availability Zone: ap-northeast-1c

  • DB用サブネット(プライベート)

    • CIDRブロック: 192.168.12.0/24

    • 名前: pri-db-c

    • Availability Zone: ap-northeast-1c

aws architecture03.png

EC2の設置とセキュリティグループ設定

作成したサブネットの中にEC2を作っていきます。

pub-web-apub-web-cには同じインスタンスを設置するので、pub-web-aで設定をしたEC2からAMIを取得し、pub-web-cに設置していきます。

aws architecture04.png

Webサーバ用・DB用インスタンスは通常のAmazon Linuxで作成して問題ないですが、NATインスタンスの場合はある特定のAMIを指定して作成する必要があります。
NATインスタンス用のAMIがコミュニティ AMIから選べるので、そこからamzn-ami-vpc-natを選択します。
また、NATインスタンスは送信元/送信先の変更チェックを無効にする必要があります。

making nat.png

インスタンスを設置し終えたらルートテーブルを設定します。

パブリックサブネットには以下のルートテーブルを設定します。

送信先 ターゲット

192.168.0.0/16

local

0.0.0.0/0

IGW

プラベートサブネットには以下のルートテーブルを設定します。

送信先 ターゲット

192.168.0.0/16

local

0.0.0.0/0

NATインスタンスID

このようなルートテーブルを設定することで、プラベートサブネットであってもNATインスタンス経由でインターネットと通信が出来ます。

ルートテーブルを設置し終えたら、セキュリティグループを設置します。
セキュリティグループでアウトバウンドの制限はしていないものは省略します。

Webサーバ用インスタンスのセキュリティグループ

セキュリティグループ名 トラフィックの制限

allow-my-office(inbound)

社内のIPであれば全てのトラフィックを許可

allow-internal(inbound)

VPC(192.168.0.0/16)内であればHTTP,HTTPS,TCP(3306)の通信を許可

DB用インスタンスのセキュリティグループ

セキュリティグループ名 トラフィックの制限

allow-pub-subnet(inbound)

pub-nat-a(192.168.0.0/24)からの通信であればSSHの通信を許可,

allow-internal-db(inbound)

VPC(192.168.0.0/16)内であればTCP(3306)の通信を許可

NATインスタンスのセキュリティグループ

セキュリティグループ名 トラフィックの制限

allow-my-office(inbound)

社内のIPであれば全てのトラフィックを許可

allow-nat(inbound)

pri-db-c(192.168.12.0/24)内であればHTTP,HTTPSの通信を許可

allow-nat(outbound)

外部の通信(0.0.0.0/0)をHTTP,HTTPSの通信に限定

このようにセキュリティグループを設定し、セキュリティレベルを高めます。

ルートテーブルとセキュリティグループを設定したので、pub-web-aのWebサーバ用インスタンスにNginxとPHPをインストールし、設定を行います。
すべて設定が終わったあとインスタンスのAMIを取得して、そのAMIをもとにpub-web-cにインスタンスを作成します。
セキュリティグループなどはpub-web-aのWebサーバ用インスタンスと同様のものを設置します。

pri-db-cのDB用インスタンスにはMySQLをインストールし、設定を行います。

これらの設定を行うと以下のように通信ができるようになります。

aws architecture05.png

ELBの設置とセキュリティグループ設定

負荷分散を行うために、ELBを設置していきます。

設置する場所は以下の2点です。

  1. 外部からWebサーバにアクセスがある箇所

  2. WebサーバからDB用インスタンスにアクセスがある箇所

今回DB用インスタンスは1つしか設置していないですが、今後の拡張性を考えて設置してみました。

1番のELBには以下のような設定を行いました。
ELBの種類はApplication Load Balancerを選択しました。

スキーマ

外部向け

リスナー

HTTP

アベイラビリティーゾーン

pub-web-apub-web-cの2つに設定

セキュリティグループ

allow-my-office(社内のIPであれば全てのトラフィックを許可)

ターゲットグループ

HTTP通信で/に対してヘルスチェックを行う

2番のELBには以下のような設定を行いました。
ELBの種類はClassic Load Balancerを選択しました。

リスナー

TCP(3306)

サブネット

pri-db-c

セキュリティグループ

allow-internal(VPC内であればHTTP,HTTPS,TCP(3306)の通信を許可)

ターゲットグループ

TCP(3306)に対してヘルスチェックを行う

これで必要な設定は全て完了し、画像のようなアーキテクチャが構成出来ました。

aws architecture01.png
aws architecture02.png

Route53の設定

構築したアーキテクチャ上のアプリケーションに対して、ドメイン名を割り当てます。

.comのドメインが意外に安く購入できました。

Webサーバに対するアクセスを負荷分散するELB(赤い枠部分)のDNS名に対して購入したドメイン名をエイリアスAレコードとして設定します。

aws architecture07.png

できた!これで指定したドメイン名で作成したWebアプリケーションにアクセスできる!!!
完成!!

おわりに

いや〜サービスを公開するってハードルが高いですね…​

公開するためにやったことが、結構たくさん。

  1. ローカルに開発環境を構築

  2. アプリケーションを作成

  3. アプリケーションのソースコードをリモートレポジトリに登録

  4. AWS上にLAMP環境を構築

  5. AWS上にLAMP環境にソースコードをクローン

  6. ドメイン名を取得し、設定

中々大変だった…​
でも外部に公開できるスキルがあってはじめて、エンジニアとしてのアウトプットができるようになった気がします。
これからいろいろなものをアウトプットして行きたいと思います!

AWSを触りながら AWS 認定ソリューションアーキテクト – アソシエイト 試験の勉強を進めるとかなり理解も深まり、実践的なケースも想像できるようになるので、オススメです!

今回はここで失礼します。