この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
目次
EC2 インスタンスの自動起動と自動停止
今回はサーバーレス(Lambda)で時間をトリガーとした EC2 インスタンスの自動起動と自動停止を行う方法を紹介します。
自動起動・自動停止の活用が見込める状況
EC2の自動起動・停止が使われると思われる状況は、
- 営業時間外(夜中や休日)のテスト用サーバーの自動起動/停止によるコスト削減
- ELBで管理しているEC2を増台・減台するとき
- 常時必要ではないが週一など一定間隔ごとに行う定期処理
が考えられます。
1つ目、コスト削減を行う際に、営業時間外のテスト用など常時稼働が不要なサーバーの自動起動/停止は効率的です。社員が帰宅した頃に自動でEC2が停止して、社員が出社する頃に自動でEC2が起動すると使い勝手も抜群です。
次にELBを利用している場合、もちろんAWSの自動スケールを利用する事もできますが、PUSH通知やイベントなどによるリクエストの急増には対応できません。仮にアクセス数の増加が定期的に見込まれる時間帯があるのであれば、事前にサーバーを増やしてELBに追加した方が安全です。
最後の定期処理は、例えば週1回または1日1回ログの解析処理や集計処理を行ったりする場合を想定しています。
今回はEC2の自動起動と自動停止に関するやり方を記述します。ELBへのEC2の追加と削除は機会があれば後ほど記事にします。
では設定方法を確認してみましょう。
Lambdaの設定手順
LambdaがアクセスできるAWS内のサービスを指定するために権限(ロール)の作成します。できれば下記の画像のように必要最小限の権限を付与することが一番良いのですが、権限(ロール)に関する設定を決められた書式に従って記載する必要があるため面倒くさいです。そこで不要な権限をいくつか付与してしまいますが、IAMから設定する簡単な設定方法を記述します。
権限(ロール)の作成
AWSトップ画面の「セキュリティ、アイデンティティ、コンプライアンス」>「IAM」を選択してください。
左メニューにある「ロール」を選択して、「ロールの作成」ボタンをクリックします。
Lambda用の権限なので、「AWS サービス」>「Lambda」を選択します。
今回付与する権限は自動起動と自動停止するために「EC2」と時間によるトリガーを設定するための「CloudWatch」の権限を付与します。
EC2の自動起動
では続いてLambdaの設定を行って、EC2の自動起動を設定します。
Lambdaの画面にて「関数」>「関数の作成」を選択します。先ほど作成した権限を設定して、プログラムは「Python3.6」(Python2.7でも可能)を選択しています。
時間による自動起動を設定するため、左メニューにある「トリガーの追加」から「CloudWatch Events」をクリックしてトリガーを追加します。
紐づけた「CloudWatch Events」をクリックし時間による起動設定を行います。ルール名には分かり易い名前をつけ、「ルールタイプ」は「スケジュール式」を選択して
とcronの書式で実行する時間を設定します。
※時間による設定と注意点は、本記事の下のほうにある「実行条件の設定」の項目にて詳細を記述しています。
最後に実行するプログラムを追加しましょう。
今回は自動起動・停止するEC2リージョンは東京(アジアパシフィック)を選択しています。
リージョン「ap-northeast-1」はご利用のリージョンを、インスタンス「i-1XXXXXXXXXXXXXXXX」はご自身のインスタンスを選択してください。インスタンスは配列で設定しているので1台でも複数台でも対応可能です。
1 2 3 4 5 6 7 8 9 |
import boto3 region = 'ap-northeast-1' instances = ['i-1XXXXXXXXXXXXXXXX', 'i-2XXXXXXXXXXXXXXXX'] def lambda_handler(event, context): ec2 = boto3.client('ec2', region_name=region) ec2.start_instances(InstanceIds=instances) print('started instances: ' + str(instances)) |
リージョンについて
プログラム内で設定するリージョンについて、使用頻度が高いと思われる地域だけ記載しておきます。全てのリージョンを確認したいときは、下記に設置したリンクよりAWS公式ページにてご確認ください。
コード | 名前 |
---|---|
us-east-1 | 米国東部(バージニア北部) |
us-west-2 | 米国西部 (オレゴン) |
ap-northeast-1 | アジアパシフィック (東京) |
リージョンとアベイラビリティーゾーン
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
EC2の自動停止
サーバーの停止も起動と同じように「StopEC2Instances」として、サーバーとスクリプトを結び付けます。
1 2 3 4 5 6 7 8 9 |
import boto3 region = 'ap-northeast-1' instances = ['i-1XXXXXXXXXXXXXXXX', 'i-2XXXXXXXXXXXXXXXX'] def lambda_handler(event, context): ec2 = boto3.client('ec2', region_name=region) ec2.stop_instances(InstanceIds=instances) print('stopped instances: ' + str(instances)) |
実行条件の設定
今回は定期的に実行したいので時間指定で起動・停止を指定します。
まずは下記をご覧ください。
crontabと記載方法が微妙に違いますね。
crontabの書き方の場合だと
1 |
*/15 * * * * * |
となり、Lambdaの場合だと
1 |
0/15 * * * ? * |
となります。
では異なる点を確認してみましょう。
世界標準時が適用される
Lambdaの場合は必ず世界標準時が適用されます。日本時刻ではないので注意して下さい。
都度実行の書き方が違う
crontabでは「*/15」ですが、Lambdaだと「0/15」です。
曜日の書き方が違う
Lambdaの場合だと「?(クエスチョンマーク)」となるようです。
まとめ
使い慣れていないと面倒だと感じるかもしれませんが、サーバーを設置せずに定期作業ができるのでLambdaはかなりおススメです。EC2の起動や停止以外にも用途は多いので、機会があればまたLambdaの記事を書きたいと思います。