この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
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インスタンスの自動起動&停止を試してみました。 料金削減などにお役立ていただけると嬉しいです。