LambdaのScheduleイベントでEC2を自動起動&自動停止してみた#reinvent

はじめに
Lambdaがアップデートされ、スケジュール機能が使えるようになりました。
当ブログでも紹介されています。
・【速報】AWS Lambdaの機能拡張が数多くきました!VPC対応、ロングランニング、スケジュール、バージョニング、Python対応! #reinvent
・AWS Lambda の Scheduled Event を試してみた #reinvent
皆さんは日中帯や平日のみ使うサーバをお持ちでしょうか。
開発用のインスタンスであれば、業務時間だけ使えればOKなんて事もあるかと思います。
スケジュール機能を使ってEC2インスタンスを自動起動&自動停止してみました。
セットアップ手順
Lambda Functionの作成
LambdaのWEBコンソールにて、「Create a Lamdba function」を選択します。
Step 1: Select blueprintは、[Skip]します。
Step 2: Configure functionで、Lambda Functionの設定を行っていきます。
キャプチャは起動のものとなります。停止はstartをstopに置き換えて下さい。
Function Codeをコピー&ペーストします。
Function CodeのインスタンスIDとリージョンは適宜記載して下さい。
□ 起動用Function Code
const INSTANCE_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');
});
};
□ 停止用Function Code
const INSTANCE_ID = '*****';
var AWS = require('aws-sdk');
AWS.config.region = '*****';
function ec2Stop(cb){
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [
INSTANCE_ID
]
};
ec2.stopInstances(params, function(err, data) {
if (!!err) {
console.log(err, err.stack);
} else {
console.log(data);
cb();
}
});
}
exports.handler = function(event, context) {
console.log('start');
ec2Stop(function() {
context.done(null, 'Stoped Instance');
});
};
Roleでは、[Basic execution role]を選択します。
IAMロールの設定画面に遷移します。
[Create a new IAM Role]を選択し、適切な[Role Name]を入力します。
[View Policy Document]を押下すると、ポリシーが表示されます。
[Edit]を選択しポリシーを入力します。入力後[Allow]を押下します。
ブラウザの設定でポップアップがブロックになっていたところ、上手くいきませんでした。
操作が上手くいかない場合はご確認ください。
□ 起動用ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:StartInstances"
],
"Resource":[
"arn:aws:logs:*:*:*",
"arn:aws:ec2:*"
]
}
]
}
□ 停止用ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:StopInstances"
],
"Resource": [
"arn:aws:logs:*:*:*",
"arn:aws:ec2:*"
]
}
]
}
Advanced settingsはデフォルト値としました。
問題がなければ、[Create function]を押下します。
Functionのテスト
起動テストを実行します。
対象のインスタンスが停止している状態で、Testボタンを押下します。
インスタンスが起動したら、OKです。停止も同様にテストします。
EventSource設定
[Event sources]タブを開き[Add event source]を選択します。
21時40分に起動されるように設定しました。停止の場合も同様に設定して下さい。
時刻の指定方法はこちらを参照ください。
自動起動&停止の確認
EC2のWEBコンソールを確認すると、起動したことがわかります。
CloudTrailには、以下のように記録されました。
停止の場合、CloudTrailには以下のように記録されました。
おわりに
EC2インスタンスの自動起動&停止を試してみました。
料金削減などにお役立ていただけると嬉しいです。