この記事の概要
概要
- CloudWatch+Lambdaでスケジュール起動する。
- 特定のタグを付けたEC2インスタンスのみ起動させる。
- 祝日は起動しないようにする。
背景
- インスタンスのタグだけで自動起動On/Offを切り替えられた方が、見えやすいので利用者にとってありがたそう。
- 単に自動起動するだけだと散々先人が通ってきた道なので、祝日は起動しないようにするくらいは(記事に)したい。
- 休日分のインスタンス稼動コスト減&わざわざ休日に自宅からEC2止めるなんてことをしたくない。
前提
- EC2インスタンスの作成については触れません。
- AWSマネジメントコンソール(以下、コンソール)は、日本語で利用しています。
- 自力でLambdaを動かせる人を対象にしています(ハンドラとかロールとかには触れてません)。
- Pythonに関する解説とかは入れていません。
- 祝日はGoogleカレンダーの「日本の祝日」から取得しています。ご利用は自己責任で。
ゴールまでの流れ
- Lambda関数を作成する
- CloudWatchでスケジュール起動用のルールを作成する
- EC2インスタンスにタグを付ける
手順
Lambda関数を作成する
- コンソールから「Lambda」を選択。
- 「設計図の選択」で「Blank Function」を選択。
- 「トリガーの設定」はとりあえず「次へ」。
- ここに、後で作るCloudWatchのルールを指定します。
- 「関数の設定」で「名前」に適当な名前を入れ、「ランタイム」にPython2.7を指定。コードエントリタイプは「.ZIPファイルをアップロード」。
- さくっとインライン編集したいところですが、そこそこ外部ライブラリを利用するのでZIPで上げます。
- Lambda関数実装編は別稿で書くかも知れません。
- githubに上げたsource配下をzipで固め、「関数パッケージ」の「アップロード」からアップロードして、「次へ」。
- 「関数の作成」で完成。
CloudWatchでスケジュール起動用のルールを作成する
- コンソールから「CloudWatch」を選択。
- 左側のメニューリストから「ルール」を選択し、「ルールの作成」。
- 「ステップ 1: ルールの作成」で「スケジュール」「Cron式」を選択。
- 毎朝9:00に自動起動させたいので、
0 0 ? * MON-FRI *
を入力。- JSTではなくGMTなので注意してください。
- 9:00前に起動したい場合は9時間足してその時間になるよう調整してください。
- その場合曜日もずれます(SUN-THU)。GoogleカレンダーはJSで見ているのでLambda側の手直しも必要です。
- 右側の「ターゲット」でプルダウンから「Lambda関数」を選択。
- 「機能」のプルダウンからLambda関数を作成するで作成したLambda関数を選択し、「設定の詳細」。
- 「ステップ 2: ルールの詳細を設定する」で「名前」に適当な名前を入れ、「ルールの作成」。
ここまでで、作成したLambda関数が毎朝9:00にせっせと動くようになりました。
EC2インスタンスにタグを付ける
- コンソールから「EC2」を選択。
- 左側のメニューリストから「インスタンス」を選択
- 自動起動したいインスタンスを選択し、下部のタブ群から「タグ」を選択
- 「タグの追加/編集」で表示されたダイアログにて「タグの作成」
- 追加された行の「キー」に「AutoStart」「値」に「yes」を入力
- ここはLamda関数の内容と合っていれば何でも構いません(以下、サンプル内ののコードです)。
if tag["Key"] == "AutoStart" and tag["Value"] == "yes":
補足
- タグに起動時刻を設定するようにして、CloudWatchを毎時起動とかにすれば起動時刻も柔軟に設定できるようになりそうです。
- Python初級者なのでソースが稚拙なのはご容赦ください。
以上で終了です。
これでタグを付けたインスタンスが土日祝を除く毎日9:00に自動で起動するようになります。