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インスタンスの自動起動&停止を試してみました。 料金削減などにお役立ていただけると嬉しいです。