AWS Lambdaを使ってEC2を定時起動・停止してみた

AWS CLI とLambda(Python)からcliを使用する際に必要なモジュールをインストールします。

こちらを参考にさせて頂きました。

AWS Lambda Python で AWS CLI を実行する方法

Lambdaで実行するファイルの作成

Lambdaで実行するファイルを作成します。

先程aws-cliをインストールしたディレクトリに移動します。

実行ファイルはCLIを利用するので簡単です。

開始の場合

1$ vim lambda_function.py2import commands3import json4import os5from cStringIO import StringIO6import re78print('Loading function')910def aws(cmd):11    return commands.getoutput(cmd)1213def lambda_handler(event, context):14    result=aws("./aws ec2 start-instances --instance-ids [InstanceId] --region ap-northeast-1")15    return result

停止の場合

1$ vim lambda_function.py2import commands3import json4import os5from cStringIO import StringIO6import re78print('Loading function')910def aws(cmd):11    return commands.getoutput(cmd)1213def lambda_handler(event, context):14    result=aws("./aws ec2 stop-instances --instance-ids [InstanceId] --region ap-northeast-1")15    return result

最後にzipファイルを生成し、S3にアップロードします。

1$ zip -r lambda_function.zip *2$ aws s3 cp /home/ec2-user/aws_cli/lambda_function.zip s3://[BucketName]/lambda_function.zip #S33に作成したスクリプトをアップロード

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を使い終わった後停止するときは下記のコマンドを該当のインスタンスにエイリアス登録して使っています。

1aws ec2 stop-instances --instance-ids `curl 2http://169.254.169.254/latest/meta-data/instance-id`

朝は自動でEC2が起動、帰る時にコマンドで停止、もしくは自動停止されるのでコスト削減になるためおすすめです!

今回は以上になります!

お疲れさまでした!

またお会いしましょう!

この記事を書いた人

aws-recipe-user