こちらははてなエンジニアアドベントカレンダー 2016の11日目の記事です。
developer.hatenastaff.com
前日は id:Windymelt さんの「趣味のプログラミングから職業としてのプログラミングへ」でした。
windymelt.hatenablog.com
今回はAWSサービスをいくつか触ってみた話について書きたいと思います。
やったこと
軽く自己紹介すると私は去年の夏頃はてなに入社したエンジニアで、それ以前はWeb開発の経験はなく、AWSのサービスも触ったことがなかったです。そこで簡単なWebアプリケーションを開発してみて、AWS上にデプロイしてみるということをしました。具体的な構成としてはEC2インスタンスにアプリケーションを置き、データベースはRDS、ロードバランサーはALB、そしてNAT Gatewayも使ってみました。監視はMackerelを利用しました。この際様々な概念があったのでこの記事で整理してみます。
EC2
まずはAmazon Elastic Compute Cloud (Amazon EC2) です。クラウド上のサーバインスタンスが欲しいときに便利そうですね。
aws.amazon.com
使い方に関してはこちらを見ながらやると出来ると思います。
aws.amazon.com
VPC
Amazon Virtual Private Cloud (Amazon VPC)です。以下の記事に簡単な説明があります。
aws.amazon.com
VPC内の構成はユーザ次第という感じで、その中にサブネットを配置して、EC2インスタンスなどを起動するということができます。
サブネット
サブネットとは何かという感じですが、以下の記事を読むとVPCとの関係がわかりやすいです。
docs.aws.amazon.com
ルートテーブル
ネットワークトラフィックを指定するもののようですね。
docs.aws.amazon.com
つまりこのルートテーブルにてサブネットのトラフィックをインターネットゲートウェイに向ければパブリック・サブネットにできるという感じですね。
ルートテーブルの作成
ルートテーブルもVPCダッシュボード「ルートテーブル」の欄から作成できます。以下のような「ルート」タブがあるので、ルーティングを指定できます。
IAMロール
IAMロールに関しては以下に詳しくありますが、どのユーザがどのリソースにたいしてアクセス権限があるのかを制御するのに使うようですね。後ほどサーバ監視・管理サービスMackerelの話でもこちらのIAMロールが出てきます。
docs.aws.amazon.com
IAMロールの作成や管理はこちらからできます。
https://console.aws.amazon.com/iam/
セキュリティグループ
セキュリティグループですが、トラフィックを制御するという点ではルートテーブルやサブネットとごっちゃになりそうですが、サブネットレベルではなくインスタンスレベルで制御するようです。
docs.aws.amazon.com
RDS
次にAmazon Relational Database Service (RDS)です。アプリケーションがデータベースを利用している際は便利そうですね。6つのデータベースエンジンから選択することができるようです。
aws.amazon.com
RDSの作成
EC2の作成の際と同様に、RDSダッシュボードに行き、インスタンスの起動を選択します。「今すぐ始める」を選択しても同じみたいです。
私の場合はアプリケーションでMySQLを利用していたのでMySQLを選択しました。
MySQLのエンジンのバージョンやストレージ、識別子など聞かれるので入力していきます。
ネットワーク&セキュリティ欄にてVPC、サブネット、セキュリティグループなど聞かれます。これらはEC2の際にもみた概念ですね。自分の構成に合わせて選択していくと良さそうです。
あとは作成ボタンを押せば完了。少し待てばDBインスタンスを利用できるようになります。本当にクリックだけで利用できるようになって便利です。
ALB
次にApplication Load Balancerです。名前の通りロードバランサーなので、サービスに対するリクエストを分散させたりできます。
aws.amazon.com
ALBの作成
EC2ダッシュボードに「ロードバランサー」という項目があるのでそこから作成できます。以下のような画面になるのでApplication Load Balancerを選択。
アベイラビリティゾーンという概念が登場します。ALBで二つ以上のゾーンを指定することによって、このリクエストは1a、これは1cなどのように振り分けることができるようです。
ALBのセキュリティグループも指定できます。EC2やRDSの場合もそうですが、それぞれセキュリティグループを適当にデフォルトのものなどにしているとわからなくなってくるので、これはアプリケーションのあるEC2インスタンスのセキュリティグループ、これはDBインスタンスのセキュリティグループなどとわかりやすく名前などもつけておくと良いと感じました。
ターゲットグループとヘルスチェックという概念が登場します。
ターゲットグループ
ALBでリクエストをルーティングする対象のEC2インスタンスなどが「ターゲット」なので、それらをまとめたものが「ターゲットグループ」という感じですね。
docs.aws.amazon.com
また1つのALBにつきターゲットグループは複数指定することも可能のようです。
ターゲットグループの作成
先ほどALBを作成する際に一緒に作成することも可能ですし、ALBを作成したあとにEC2ダッシュボードの「ターゲットグループ」から新たに作成することができます(大体同じ画面にきます)。VPCなども適切に指定してあげましょう。ターゲットグループを作成した後、個別のターゲットをグループに入れていけば良いです。
ヘルスチェック
定期的にターゲットグループ内のターゲットに対してリクエストを送信し、正常かどうかを確認することがヘルスチェックとのことです。
docs.aws.amazon.com
自分のアプリケーションが一部のターゲットグループではうまく動作していない場合、そちらにリクエストがいくようになってると困りますよね、そういうことが起きないようにヘルスチェックをし、そちらにはリクエストをいかせないようにALBがやってくれるようです。便利ですね。
ALB vs. ELB, CLB
ALBについて調べていると、ELBやCLBのような用語も登場すると思います。どうやら元々ELBというものがあり(Elastic Load Balancer), 最近になってALBが追加された(Application Load Balancer)ので、それに従って今までELBと呼ばれていたものがCLBとなり(Classical Load Balancer)、現在ではCLBとALBがどちらもELBの一種という位置付けになっているみたいです。
ALBとCLBの具体的な違いについては以下にまとまってあります。
docs.aws.amazon.com
NAT Gateway
最後にNAT Gatewayです。以下の記事にも書いてありますが、これを利用すればインターネットからはアクセスできないようにしつつ、インスタンスからインターネットや他インスタンスにアクセスできるよう制御できて嬉しいです。
docs.aws.amazon.com
NAT Gatewayの作成
こちらはVPCダッシュボードから作ります。パブリックサブネットとElastic IPを指定するだけで作れます。
ここまでの概念がわかれば以下の画像もわかりやすいかと思います。プライベートサブネットのインスタンスがNAT Gatewayを利用しトラフィックを送信していることがわかります。ルートテーブルが正しく指定されていることも大事です。
NAT Gateway vs. NAT Instance
以下の表がわかりやすいです。元々NAT Instanceがあり、NAT Gatewayの登場によりメンテナンスコストが減ったようです。
docs.aws.amazon.com
監視
ここからはおまけみたいな感じですがとても大事だと思います。
AWS上にアプリケーションをデプロイし、色々なサービスを利用したは良いけど、障害などが起きた際にどこが問題なのか知るにはどうすれば良いでしょうか。やはり監視はしておきたいですね。AWS Cloudwatchでグラフをみたりアラームを設定したりもできますが、今回はMackerelを利用してみました。
Mackerel
Mackerelははてなが運営するサーバ監視・管理サービスです。
mackerel.io
ちょうど昨日のMackerelアドベントカレンダーでもMackerelのサービスメトリック、監視設定、アラートについて触れましたので、そちらも参考にしてください。
stefafafan.hatenablog.com
mackerel-agent
Mackerelの基本的な構成としてはエージェントをサーバにインストールし、メトリックを定期的にMackerel本体へプッシュしていくという感じです。エージェントのインストール方法に関してはMackerelにログインし、「新規ホストの登録」画面に行くとOSごとにインストール方法が記載されています。
あとは設定ファイルにAPIキーを追記し、エージェントを起動させると勝手にグラフに様々なメトリックが描画されます。
エージェントに関してはオープンソースです。
github.com
プラグインなども充実しています(自分のプラグインを作成して利用するのも可能)
github.com
AWSインテグレーション
EC2インスタンスなどにエージェントをインストールしてメトリックを取得するのも便利ですが、今回のようにAWSのサービスを複数利用している場合はMackerelのAWSインテグレーションを利用するとより便利かと思います。
mackerel.io
連携の仕方としては推奨されている方法はIAMロールを指定するというものです。IAMロールを利用すると、権限を制限することができますので安心です(EC2の場合はAmazonEC2ReadOnlyAccessなど)。
オーガニゼーション設定のAWSインテグレーションタブから設定できます。
IAMロールやリージョンを選択し、メトリックを取得したいAWSサービスにチェックを入れると以下のように取得されるインスタンスの数が表示されるので実際に設定を作る前に確認できます。
あとは数分待てば勝手にグラフができます。便利ですね。