こんにちは!Tamaです!
今回はコスト削減のためインスタンスを定時で起動し定時で停止するLambda関数を作成したいと思います。
Auto Scalingでも定時起動停止は可能ですが今回はLambdaからでの設定を紹介します。
準備
AWS CLI とLambda(Python)からcliを使用する際に必要なモジュールをインストールします。
こちらを参考にさせて頂きました。
AWS Lambda Python で AWS CLI を実行する方法
Lambdaで実行するファイルの作成
Lambdaで実行するファイルを作成します。
先程aws-cliをインストールしたディレクトリに移動します。
実行ファイルはCLIを利用するので簡単です。
開始の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ vim lambda_function.py import commands import json import os from cStringIO import StringIO import re print('Loading function') def aws(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): result=aws("./aws ec2 start-instances --instance-ids [InstanceId] --region ap-northeast-1") return result |
停止の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ vim lambda_function.py import commands import json import os from cStringIO import StringIO import re print('Loading function') def aws(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): result=aws("./aws ec2 stop-instances --instance-ids [InstanceId] --region ap-northeast-1") return result |
最後にzipファイルを生成し、S3にアップロードします。
1 2 3 |
$ zip -r lambda_function.zip * $ aws s3 cp /home/ec2-user/aws_cli/lambda_function.zip s3://[BucketName]/lambda_function.zip #S3 に作成したスクリプトをアップロード |
Lambda関数の作成
Lambda関数を作成します。
「Create a Lambda function」をクリックします。
blueprintではコードをS3より読み込むためBlank Functionを選択します。
トリガーを時刻にするためCloudWatch Events – Scheduleを選択します。
時刻の設定をcron文で行いますがUTC時間になるため注意が必要です。午前9時に起動したい場合は0時になります。
構文について詳しくはAWSのドキュメントを参考にしてください。
参考URL:http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
月~金 9:00の場合cron(0 0 ? * 2-6 *)になります。
Python2.7を選択し、S3にアップロードしておいたlambda_function.zipを選択またはzipファイルをアップロードします。
また、roleにはEC2起動停止の権限を持ったIAM roleを選択します。
Advanced settingsはデフォルトではTimeoutが3秒のため、30秒程度に設定しました。
これでLambda functionが作成できました!
時間になると有無を言わさず停止してしまうので注意が必要かと思います。
私の場合EC2を使い終わった後停止するときは下記のコマンドを該当のインスタンスにエイリアス登録して使っています。
1 2 |
aws ec2 stop-instances --instance-ids `curl http://169.254.169.254/latest/meta-data/instance-id` |
朝は自動でEC2が起動、帰る時にコマンドで停止、もしくは自動停止されるのでコスト削減になるためおすすめです!
今回は以上になります!
お疲れさまでした!
またお会いしましょう!