白”雪姫”の雑なエンジニアブログ

ダイアリーがなくなってしまったため、エンジニアブログとして再出発

AWSでコールドスタンバイの自動処理をしてみる

気がつけば1年近く更新してませんでした。

今回は、AWSのお話です。
あるお客さんの希望として
「冗長構成は要らない、でも、”出来得る限りコストを抑えて”止まらないサービスを提供して欲しい」
と言われました。
このお客様の悩みは、コールセンターや土日・夜中でも普通に電話をしてくること・・・・。そうなんです。私ら休めない。
そこで、同僚・上司その他みなさんと一緒に話をして
「どうせAWSにするなら冗長じゃないけど、楽するためにコールドスタンバイ方式にした方がいいんじゃないか」
と言われて検証をした記録です。

なぜこんな形にしたのか?AutoScaringで良いじゃないか?
という話もあると思いますが、客に拒否られました。
「サービス的にロードバランサーを入れる必要ないでしょ」って
いや、たしかにそうですけど!!

ということで、やってみました。コールドスタンバイによる自動起動

参考にしたのはこちらのURL

https://geeknavi.net/aws/ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%83%BB%E8%87%AA%E5%8B%95

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で応用したら同時起動できるかも)