リンクバルの川畑です。AWSのEC2インスタンス上にある開発環境など、営業時間外は誰も使用しないので停止して少しでも費用を抑えたいところです。この課題を解決するために、AWS Lambdaのスケジュール機能を利用してEC2インスタンスの起動・停止する検証をしました。
目次
AWS Lambdaのスケジュール機能の良いところ
個人的にAWS Lambdaを使いたいから。。。というのもあるのですが、実際にAWS Lambdaのスケジュール機能を利用するメリットとしては次のポイントが挙げられます。
- Linux上のcrontabを設定する場合、1台サーバを常時起動しなければならないがAWS Lambdaではサーバ不要(Server Less)
- 常時起動しているサーバが単一障害点になるが、AWS LambdaではマルチAZで構成されか可用性が高い(High Availability)
- スケジュールがAWSコンソールで確認できる(Standardization)
コード準備
AWS Lambda上でコードを実行するにはpythonかnodo.jsのどちらかになります。今回のようなバッチ処理はnode.jsよりpythonのほうが向いていると思うので、pythonを使用。3.5を使いたいところなのですが、AWS Lambdaは2.7のみのサポートなので、バージョンはpython2.7.10を使用。そしてpython用AWS SDKのモジュールですが、デフォルトで「boto」が使用できるようですが、スクリプトと一緒にライブラリアップロードするば使用できるようなので、最新版で使いやすい「boto3」を使用します。コードはこちら。コード内の<TAG_NAME>にタグ名を書き換えて使用するものとなります。
1.lambda-instance-operation.py
2.アップロード用にディレクトリを作成して、そのディレクトリ配下にコードを配置
$ cd lambda-instance-operation
$ vi lambda-instance-operation.py
[/bash]
3.コードと一緒にアップロードするライブラリをダウンロード
[/bash]
4.アップロード用ファイルを準備
[/bash]
※サンプルコードはこちら
AWS Lambda設定手順
次にAWS Lambdaの設定に移ります。AWS Lambdaに関数を登録したり、上記で準備したファイルをアップロードしたりする必要があります。以下はEC2インスタンスをAWS Lambdaから自動起動する手順となります。
1.AWSコンソールにログインして「AWS Lambda」を選択
2.「Create a Lambda function」を選択
3.言語を「python2.7」を選び「hello-world-python」を選択
4.トリガー一覧を表示
5.「CloudWatch Events – Schedule」を選択
6.トリガーの設定①
- Rule Name:任意の値を入力
- Schedule expression:「cron (0 17 ? MON-FRI *)」のフォーマットで適宜修正
- Enable triggerをチェック
7.トリガー設定②
- Runtime:Python2.7
- Code entry type:Upload a zip file
- Handler:今回の場合は「lambda-instance-operation.instance_start」
- Exsisting role:EC2インスタンス起動・停止権限を付与したロールを選択
8.設定値を確認して「Create function」を選択
9.以下のような画面になったら登録完了
おわりに
今回この手順でAWS Lambda経由でEC2インスタンスの起動・停止できることが確認できました。この手順を手動で登録するのは面倒なので、今後のことを考えると柔軟に横展開できるようAnsibleなどで自動化していきたいと思います。リンクバルはサーバエンジニアを積極募集中です。興味のある方は、ご応募ください。もちろん、社内の人間と面識があるのでしたら、直接にご連絡いただいてもかまいません。