普段、開発やテストで使っているEC2インスタンスが大量にあるので、インスタンスのスケジュール起動・停止をcronでおこない、できるだけコストを抑えて使っています。AWS Lambdaを全く触った事が無かったので、cronバッチから移行する良い機会だと考えAWS Lambda用に少し手を入れたので晒してみます。
できること
"開発などで利用しているインスタンスを、営業時間だけ起動したい"、"特定の曜日だけで定期的に起動したい"といった事ができます。
インスタンスへの設定方法は、インスタンスのタグに設定ファイルに書いたタグを入れておくだけで、解除もタグ削除するだけです。
準備
- python2.7, pipが実行できる環境
- AWSアクセスIDとシークレットキーを予め用意しておく。
- コードをDL https://github.com/hidesakai/EC2Scheduler
ライブラリのbotoとpytzが必要なので、ec2_scheduler.pyと同一階層にインストールしておきます。
$ pip install boto -t path/to/ec2_scheduler/
$ pip install pytz -t path/to/ec2_scheduler/
設定ファイルのtag-key, tag-valueと同一のタグを持つインスタンスのみスケジュール実行される仕組みとなっている。スケジュール実行を止める場合は、タグを削除すればOK。
設定項目は以下(ファイル名は変更可)
[Develop]
region: ap-northeast-1 <= リージョン
type: daily <= 実行Type(dailyしか無いのでこのまま)
tag-key: AWS-Schedule <= インスタンスタグ名
tag-value: Dev-Weekday <= タグ値
start: 9:00 <= 起動
stop: 19:00 <= 停止
skip: saturday, sunday <= スキップする日を曜日で指定
timezone: Asia/Tokyo <= タイムゾーン指定
↓設定ファイル内に複数のスケジュール設定もできる
[TestServer]
region: ap-northeast-1
...
...
実行するLambda Functionを用意
# -*- coding: utf-8 -*-
from ec2_scheduler import EC2Scheduler
def lambda_handler(event, context):
access_id = 'AWSアクセスID'
secret_key = 'AWSシークレットキー'
conf = 'schedule.cfg'
schedule = EC2Scheduler(access_id=access_id, secret_key=secret_key, conf=conf)
schedule.job()
Lambda Functionまで準備出来たら、用意したファイルをzipで圧縮する。(同じディレクトリで実行)
cd path/to/ec2_scheduler
zip -r ec2_scheduler.zip .
AWS Lambdaの設定
AWSマネジメントコンソールのAWS LambdaでLambda Functionを新規作成
[Lambda]
[Create a Lambda function] -> [Python2.7] -> [lambda canary] を選択
[Configure event sources]
[Event source type] -> [CloudWatch Events - Schedule]を選択
[Rule name]に適宜名前を入れる
[Schedule expression]で実行スケジュールを選択
[Configure function]
[Name]に適当な名前
[Runtime] -> [Python 2.7]
[Lambda function code] -> [Upload a .ZIP file]で事前に用意したzipファイルをアップロード
[Handler*]にhandler名を入れる(例では「lambda_function.lambda_handler」)
[Role] -> [Basic execution role]
[Advanced settings] 適宜設定をする
あとは[Create function]で作成されるはず
Lambda Functionを作ったら、あとはTestで確認する。
Testがsucceededになるはずなので、あとは[Event source]でさっき設定したScheduleEventをState Enabledにすれば完了。