気がつけば1年近く更新してませんでした。
今回は、AWSのお話です。
あるお客さんの希望として
「冗長構成は要らない、でも、”出来得る限りコストを抑えて”止まらないサービスを提供して欲しい」
と言われました。
このお客様の悩みは、コールセンターや土日・夜中でも普通に電話をしてくること・・・・。そうなんです。私ら休めない。
そこで、同僚・上司その他みなさんと一緒に話をして
「どうせAWSにするなら冗長じゃないけど、楽するためにコールドスタンバイ方式にした方がいいんじゃないか」
と言われて検証をした記録です。
なぜこんな形にしたのか?AutoScaringで良いじゃないか?
という話もあると思いますが、客に拒否られました。
「サービス的にロードバランサーを入れる必要ないでしょ」って
いや、たしかにそうですけど!!
ということで、やってみました。コールドスタンバイによる自動起動。
参考にしたのはこちらのURL
http://dev.classmethod.jp/cloud/aws/ec2_start_and_stop_from_aws-lambda/
使うのは以下のサービス
EC2・・・・・2台(Active機とCold機)かつ、このインスタンスにはそれぞれ、EIPを振っておくこと
Route53・・・Active機のレコードはヘルスチェックをしておくこと。
Lamdba/CloudWatch/SNS
のみです。
さてでは流れをはじめに説明していきます。
Route53→(HealthCheck)→ActveEC2の特定URI
尚、HealthCheckによりFailOverで自動でコールド機のレコードに切り替え
HealthCheckはCloudWatchで監視を実施しSNSに通知するように設定します。
SNSはLamdba及びEmailへ通知するようにします。
Lamdba→EC2のコールド機起動
という具合になっていきます。
さて、では問題の起動手順。
結構大変ですよ?
まずはIAMをつくります。
これは、LambdaがEC2の起動権限・VPCへのアクセス権限が必要になるからです。
その上で以下の作業を進めていきます。
1.EC2インスタンスを起動・設定
皆様ご存知だと思いますのでここは割愛。
2.Route53にレコードを登録する。
まずはアクティグ機のレコードを登録します。
順番的には、アクティブ登録→ヘルスチェック追加→アクティブ機のレコードをPrimaryRecordで且つHeakthチェックを有効にする→セカンダリーレコードをセカンダリーとして追加
します。
3.CloudWatchを設定。
2で設定しているHealthチェックCloudWatchのMetricsとして登録し、設定します。
この時検知状態でEmailの通知とSNSの通知をしておくと便利です。
4.SNSの設定を追加。
SNSの設定を追加し、Lambdaへ連携できるようにします。
5.Lambdaの設定を導入。
トリガーはSNS、テンプレートはブランク
そして以下のコードを記載
const INSTANCE_ID = 'コールド機のインスタンスID'; var AWS = require('aws-sdk'); AWS.config.region = 'コールド機があるリージョン'; function ec2Start(cb){ var ec2 = new AWS.EC2(); var params = { InstanceIds: [ INSTANCE_ID ] }; ec2.startInstances(params, function(err, data) { if (!!err) { console.log(err, err.stack); } else { console.log(data); cb(); } }); } exports.handler = function(event, context) { console.log('start'); ec2Start(function() { context.done(null, 'Started Instance'); }); };
そして登録。
6.テスト
アクティブ機のヘルスチェックで実行してる(はずの)プロセスを強制的に落とします。
うまくいってればEmail通知とSNSによるコールド機の起動されるはずです。
このコールドスタンバイのメリット・デメリット
メリット:
・ELBがなくてもできる。
・OutboundのEIPさえ紐付ければ、ある程度は対処できる。
・ELB+AutoScaringに比べればコストは抑えられる。
デメリット:
・少なからず、DTが発生する
・アクティブ機に関しては、起動したままとなってしまう(Lambdaなどの改良で停止可能かも)
・コールド機(停止状態)のため少しコストがかかる。
・負荷対策としては使えない。(CPUMetricsで応用したら同時起動できるかも)