こんにちは、岩橋聡吾です。

やってみよう!AWSでWEBサーバー環境構築、好評の第2回に続きまして、待望の第3回をやっていきたいと思います。前回までに作成したインフラ構成にKVS(Elasticache)データベース(RDS)さらにCDN(CloudFront)を追加して、Webアプリケーションの動作環境構築の仕上げをしましょう。

RDSを設定する

一部の例外を除き、WEBサイト上では情報を整理して格納する・検索して取り出すという機能性を少なからず持っていると言っても過言ではありません。そのようなサイトにおいては必然的に何らかのデータベースサーバーを運用することになります。今日のWEBで使われるデータベースは概ね以下の4つに絞られてくるのですが、これらのDBサーバーを構築・運用する場合においては、運用時の死活監視やバックアップ、パラメータの調整やパフォーマンスチューニングなどが常に課題となります。Amazon RDSを活用することでこれらの課題を自動化して運用の手間を低減し、WEBサービスそのもののサービス向上という本質的な課題に注力することが出来ます。早速設定してみましょう。

まずRDSの作成に必要なサブネットを作成します。
p1213-rds-01

p1213-rds-02

作成時にサブネットの名前を間違えてしまったので直しておきますw
p1213-rds-03

次にメニューからRDSを選択して作成ウィザードを起動しましょう。
p1213-rds-10
p1213-rds-20

MySQLと互換性がありパフォーマンスも高いAuroraを選択したいところですが、無料利用枠の対象外ですので今回はMySQLを選択します。
p1213-rds-30

今回はブログ作成用ですので、開発/テストを選んで次に進みます。
p1213-rds-40

DBの詳細を設定していきます。テストしたいだけであれば無料利用枠内で使用可能な機能だけに絞るチェックボックスを有効にしておきます。
p1213-rds-50
p1213-rds-60

パブリックアクセス可能設定や、バックアップ時間の設定を行い次に進みます。
p1213-rds-70

これでインスタンスが作成されました。
p1213-rds-80

接続の確認前にセキュリティーグループを設定します。RDSのウィザードで新しくセキュリティーグループが作成されたはずなのでこちらを変更します。
p1213-rds-90

次にMySQLに接続するためのユーティリティーを、接続元になるec2へインストールします。

[ec2-user@ip-10-0-0-204 ~]$ sudo yum install mysql
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
Resolving Dependencies
–> Running transaction check
—> Package mysql.noarch 0:5.5-1.6.amzn1 will be installed
–> Processing Dependency: mysql55 >= 5.5 for package: mysql-5.5-1.6.amzn1.noarch
–> Running transaction check
—> Package mysql55.x86_64 0:5.5.54-1.16.amzn1 will be installed
–> Processing Dependency: real-mysql55-libs(x86-64) = 5.5.54-1.16.amzn1 for package: mysql55-5.5.54-1.16.amzn1.x86_64
–> Processing Dependency: mysql-config for package: mysql55-5.5.54-1.16.amzn1.x86_64
–> Running transaction check
—> Package mysql-config.x86_64 0:5.5.54-1.16.amzn1 will be installed
—> Package mysql55-libs.x86_64 0:5.5.54-1.16.amzn1 will be installed
–> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
mysql noarch 5.5-1.6.amzn1 amzn-main 2.7 k
Installing for dependencies:
mysql-config x86_64 5.5.54-1.16.amzn1 amzn-updates 49 k
mysql55 x86_64 5.5.54-1.16.amzn1 amzn-updates 7.5 M
mysql55-libs x86_64 5.5.54-1.16.amzn1 amzn-updates 815 k

Transaction Summary
================================================================================
Install 1 Package (+3 Dependent packages)

Total download size: 8.3 M
Installed size: 31 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): mysql-5.5-1.6.amzn1.noarch.rpm | 2.7 kB 00:00
(2/4): mysql-config-5.5.54-1.16.amzn1.x86_64.rpm | 49 kB 00:00
(3/4): mysql55-5.5.54-1.16.amzn1.x86_64.rpm | 7.5 MB 00:00
(4/4): mysql55-libs-5.5.54-1.16.amzn1.x86_64.rpm | 815 kB 00:00
——————————————————————————–
Total 8.7 MB/s | 8.3 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : mysql-config-5.5.54-1.16.amzn1.x86_64 1/4
Installing : mysql55-libs-5.5.54-1.16.amzn1.x86_64 2/4
Installing : mysql55-5.5.54-1.16.amzn1.x86_64 3/4
Installing : mysql-5.5-1.6.amzn1.noarch 4/4
Verifying : mysql-5.5-1.6.amzn1.noarch 1/4
Verifying : mysql55-5.5.54-1.16.amzn1.x86_64 2/4
Verifying : mysql55-libs-5.5.54-1.16.amzn1.x86_64 3/4
Verifying : mysql-config-5.5.54-1.16.amzn1.x86_64 4/4

Installed:
mysql.noarch 0:5.5-1.6.amzn1

Dependency Installed:
mysql-config.x86_64 0:5.5.54-1.16.amzn1 mysql55.x86_64 0:5.5.54-1.16.amzn1
mysql55-libs.x86_64 0:5.5.54-1.16.amzn1

Complete!

上手く入りました。

それでは確認してみましょう。

[ec2-user@ip-10-0-0-204 ~]$ mysql -h yattemiyou.cxotk9qitqo0.ap-northeast-1.rds.amazonaws.com -u yattemiyou –password=Abc12345
amazonaws.com -u yattemiyou –password=Abc12345
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 54
Server version: 5.6.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

成功しました!

KVS(Elasticache)を設定する

サイト上の処理の一部には計算や検索処理に時間の掛かるものがあるでしょう。例えば1日1回だけ更新されるデータが幾つかあって、その検索1回につき300ミリ秒掛かる場合にWEBサイトへ大量のアクセスがあったらどうなるでしょうか。きっとサイトは簡単にパンクしてしまうでしょうね。(検索処理が遅いのも大問題ですが) そもそも1日1回しか更新されないデータを取り出すために毎度DBサーバーへ問い合わせに行くのは勿体無いですよね?何処かに検索結果だけを溜めておけるような仕組みが欲しいと思います。
こんな時にうまく活用したいのがKVS (Key Value Store)です。さっきの1日1回だけ更新されるデータを例えば、今日の天気としましょう。格納された今日の天気を300ミリ秒くらい掛けてDBサーバーから取り出して、その結果だけを「today-weather」と呼ばれる識別子を付けて別の場所に保存しておきます。その日のうちであればデータの内容は変わりませんので、必要になったらDBの代わりに都度KVSへ問い合わせて、「today-weather」の識別子がついたデータを要求します。そして日付が変わったらその日最初の1回だけ、再びDBサーバーからデータを取り出してKVSに保管します。こうすることで、DBへのリクエスト回数を削減できますね。

このようなミドルウェアをWEBアプリに活用することでサイトのパフォーマンスをさらに改善することが可能になります。それではインフラの設定をしてみましょう。

ElastiCacheの設定に必要なサブネットを設定します。
p1213-kvs-01
p1213-kvs-02

ElastiCacheのメニューからサブネットグループを設定します。サブネットグループとは、文字通りVPC内のサブネットを束ねるAWS上の概念となります(第一回参照)。
p1213-kvs-10
p1213-kvs-20

それではElastiCacheのキャッシュクラスターを作成します。(とは言っても今回は最小構成として複数台使わないのでクラスターではありませんが…)
p1213-kvs-30

Redisかmemcachedを選択します。Number of replicasにNoneを設定すると単一構成になります。(memcachedについて、このままではレプリケーションができないので特別な方法が必要となります…筆者はとても嵌りましたw。)
p1213-kvs-40

Node typeはデフォルトでかなり大きめのインスタンスタイプが設定されています。テストで使う場合は小さいものを設定しましょう。
p1213-kvs-50

Advanced Redis Settingsを開いて、先程作成したSubnet Groupを指定しましょう。
p1213-kvs-60

正しく作成できたようですので接続を試みてみます。
p1213-kvs-70

エンドポイント情報をコピーして再度ターミナルを開きます。
p1213-kvs-80

Redisにはとりあえずtelnetを使えば接続が出来ますのでやってみましょう。

[ec2-user@ip-10-0-0-204 ~]$ sudo yum install telnet
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
–> Running transaction check
—> Package telnet.x86_64 1:0.17-48.8.amzn1 will be installed
–> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
telnet x86_64 1:0.17-48.8.amzn1 amzn-main 62 k

Transaction Summary
================================================================================
Install 1 Package

Total download size: 62 k
Installed size: 107 k
Is this ok [y/d/N]: y
Downloading packages:
telnet-0.17-48.8.amzn1.x86_64.rpm | 62 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 1:telnet-0.17-48.8.amzn1.x86_64 1/1
Verifying : 1:telnet-0.17-48.8.amzn1.x86_64 1/1

Installed:
telnet.x86_64 1:0.17-48.8.amzn1

Complete!

[ec2-user@ip-10-0-0-204 ~]$ telnet yattemiyou-kvs.f1pyqo.0001.apne1.cache.amazonaws.com 6379
Trying 10.0.10.39…
telnet: connect to address 10.0.10.39: Connection timed out

繋がりませんでした 汗。
あれこれ見てみるどうやらセキュリティーグループを設定するのを忘れていたようです。あるあるですねw。

ではElastiCacheで使われているセキュリティーグループを調べます。
p1213-kvs-90

セキュリティーグループのIDが分かったのでこれに対してRedisの接続ポートに当たる6379を内部で許可するようにします。
p1213-kvs-a0

再度試してみると。。

[ec2-user@ip-10-0-0-204 ~]$ telnet yattemiyou-kvs.f1pyqo.0001.apne1.cache.amazonaws.com 6379
Trying 10.0.10.39…
Connected to yattemiyou-kvs.f1pyqo.0001.apne1.cache.amazonaws.com.
Escape character is ‘^]’.
SET a a
+OK
GET a
$1
a

うまくいきました!

CloudFrontを設定する

それでは仕上げにCloudFrontを設定します。CloudFrontはAmazon AWSが提供しているCDN構築用のインフラです。

CDNとは正式にはコンテンツデリバリーネットワークなどと呼ばれますが、これはウェブコンテンツの配信用として最適化されたネットワークのことをいいます。 AWSの場合ELBの前にCloudFront(CDN)がリクエストを待ち受けており、過去に同様のリクエストがあった場合は、ELBに通さず自身でコンテンツの配信を肩代わりするという機能を持っています。こうすることで負荷分散を図ることができます(表示速度の向上)。

今回の設定例は動的なWebアプリ向けに必要な設定を施したものになります。アプリケーションの機能を全てのCDNに分散することはできませんので、原則として動的要素はELBを経由することになりますが、CloudFrontとELBは太いネットワークで接続されていますので、動的要素を含むサイトであってもパフォーマンスを観点から利用する価値はあります。

メニューからCloudFrontをひらきます。
p1213-cf-10

Web側のディストリビューションを作成します。
p1213-cf-20

Originとして既存の(コンテンツの大元となる)ELBを選択します。
p1213-cf-30

Allowed HTTP Methodとして全てを選択します。これを忘れると動的要素が正しく動かなくなることがあります。
また、Forward CookiesやQuery String Forwardingも忘れずに設定しておきます。
p1213-cf-50

今回はテスト用ですので、Price Classとして最も安いものを選択し、Alternate Domain Namesも設定しておきます。
p1213-cf-60

下にスクロールして、この部分はそのまま次に進みましょう。
p1213-cf-70

ディストリビューションができました。
p1213-cf-80 height=”1264″ class=”alignnone size-full wp-image-1064″ />

一応見えてはいるようですが…
確認の為にリクエストの応答ヘッダーを覗いみましょう。

名称未設定

「xxx.cloudfront.net(CloudFront)」とありましたね!これでクラウドフロントから上手く返ってきていることがわかりました。

これで、第2回〜第3回に渡りましたが、Rote53(DNSサーバー) -> CloudFront(CDN) -> ELB(ロードバランサー) -> EC2(Webサーバー) までのパケットの流れを正しく設定することができました。

第3回目の最後に

今回のやってみようAWSシリーズでは、簡単ではありますがAWS上におけるインフラ構築手順をざっとご紹介しましたが、AWSではまだまだ多くのインフラサービスが提供されており、そのうちのどれもが実際のWEBサービス運営に役立つ強力な武器となります。今後もこのようなシリーズ記事を通じて皆さんに有益な情報を提供できればと思います。
またこのシリーズでこれまでインフラと縁遠かった方でもAWSに対する理解が少しでも深まっていれば幸いです。

ご清覧頂きありがとうございました。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにきてください。

◉シリーズ
・やってみよう!AWSでWEBサーバー環境構築(シリーズ第1回)
・やってみよう!AWSでWEBサーバー環境構築(シリーズ第2回)

◉筆者のおすすめ記事
・【DB設計入門|ER図|MySQL】コンビニレシートから学ぶ!データモデリング手法
・【機械学習入門|Python|scikit-learn】結局何ができる?cheat-sheetから解説してみる篇

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る