リンクバル技術部の川畑です。以前こちらの記事(AWS Lambdaを使ってEC2インスタンスを起動・停止する)をご紹介させて頂きました。それから約1年ぐらいが経過しましたが、その間にAWSのLambdaがpython3に対応したり、環境変数に対応したりと便利なアップデートがありスクリプトを修正しましたので、こちらでもご紹介させて頂きます。
AWS Lambdaのスケジュール機能の良いところ
以前の記事でも述べさせて頂きましたが、AWS Lambdaのスケジュール機能には以下のメリットがあると思います。
- Linux上のcrontabを設定する場合、1台サーバを常時起動しなければならないがAWS Lambdaではサーバ不要(Server Less)
- 常時起動しているサーバが単一障害点になるが、AWS LambdaではマルチAZで構成され可用性が高い(High Availability)
- スケジュールがAWSコンソールで確認できる(Standardization)
スクリプト説明
起動・停止の機能は理解のしやすさを考慮し、ファイルを別々にしてあります。スクリプトからAWSを操作するために「botocore」「boto3」、Lambdaに設定した環境変数を読み込むため「os」パッケージをimportします。Lambdaで環境変数「TAG_NAME」を設定し、タグを設定すると一致したEC2インスタンスが処理対象となり、起動・停止処理を実行する仕組みとなります。
使用言語
EC2起動スクリプト
|
#!/usr/bin/env python |
|
# -*- coding:utf-8 -*- |
|
|
|
""" |
|
# lambda-ec2-start.py |
|
|
|
This repository is AWS Lambda function's upload files. |
|
""" |
|
|
|
__authour__ = "masaru.kawabata" |
|
__version__ = 1.3 |
|
|
|
import botocore |
|
import boto3 |
|
import os |
|
|
|
def lambda_handler(event, context): |
|
""" Create Connection """ |
|
try: |
|
ec2 = boto3.resource('ec2', region_name='ap-northeast-1') |
|
except: |
|
print('Connection Error') |
|
return 1 |
|
|
|
""" Get EC2 Instance Info """ |
|
instance = [i for i in ec2.instances.all() for t in i.tags if t["Value"] == os.environ['TAG_NAME']][0] |
|
|
|
""" Start EC2 Instance """ |
|
try: |
|
instance.start() |
|
except: |
|
print('Start EC2 Instance Error') |
|
return 1 |
|
|
|
return 0 |
EC2停止スクリプト
|
#!/usr/bin/env python |
|
# -*- coding:utf-8 -*- |
|
|
|
""" |
|
# lambda-ec2-stop.py |
|
|
|
This repository is AWS Lambda function's upload files. |
|
""" |
|
|
|
__authour__ = "masaru.kawabata" |
|
__version__ = 1.3 |
|
|
|
import botocore |
|
import boto3 |
|
import os |
|
|
|
def lambda_handler(event, context): |
|
""" Create Connection """ |
|
try: |
|
ec2 = boto3.resource('ec2', region_name='ap-northeast-1') |
|
except: |
|
print('Connection Error') |
|
return 1 |
|
|
|
""" Get EC2 Instance Info """ |
|
instance = [i for i in ec2.instances.all() for t in i.tags if t["Value"] == os.environ['TAG_NAME']][0] |
|
|
|
""" Stop EC2 Instance """ |
|
try: |
|
instance.stop() |
|
except: |
|
print('Stop EC2 Instance Error') |
|
return 1 |
|
|
|
return 0 |
GitHubリポジトリはこちら
AWS Lambda設定手順
次にAWS Lambdaの設定に移ります。AWS Lambdaに関数を登録したり、上記で準備したファイルをアップロードしたりする必要があります。以下はEC2をAWS Lambdaから自動起動する手順となります。
1.スクリプトの準備
- AWS Lambdaにアップロードするファイルの準備
1 2 3 4 5 | git clone https: //github .com /makaaso/lambda-ec2-operation .git
cd lambda-ec2-operation
pip install botocore -t ./ --upgrade
pip install boto3 -t ./ --upgrade
zip -r .. /lambda-ec2-operation .zip .
|
2.AWSコンソールにログイン
- AWSコンソールのLambda画面で「Functions」を選択し、「Create function」を選択

3.python3ファンクションの検索
- Blueprints下のフィルタに「python3」を入力して検索

4.python3ファンクションの選択
- 検索結果から「hello-world-python3」を選択

5.functionの作成
- Nameは適宜入力
- Roleは作成済みであることを想定しております(※lambdaロール未作成の場合は、適切な権限を付与して作成)
- Existing roleで適切なLambdaロールを選択
- すべて入力したら「Create function」を選択

6.スクリプトのアップロードと設定
- Code entry typeで「Upload a .ZIP file」を選択して、zipファイルをアップロード
- HandlerはEC2起動の場合は「lambda-ec2-start.lambda_handler」、EC2停止の場合は「lambda-ec2-stop.lambda_handler」と入力
- Environment variablesで、key「TAG_NAME」、valueにタグ名を入力

7.トリガの設定
- 「Trigger」を選択して「Add Trigger」を選択

8.トリガの追加

9.CloudWatch Eventの設定
- Rule nameは適宜設定
- Rule typeは「Schedule expression」を設定
- 「Schedule expression」の値はcronフォーマットで設定(※時間はUTC)

10.functionの保存

AWS Lambdaで環境変数が使用できるようになり、環境ごとにスクリプトを修正することなく設定できるのは大変助かります。最近はRDSも停止できるようになったので、RDSの起動・停止スケジュールについても挑戦していきたいと思います。
リンクバルに興味がある方は こちら ご覧ください。