こんにちは、2015年入社の橋本です。
re:InventではAWS Lambda(以降Lambda)が色々とアップデートされましたね。
個人的にテンションが上がったのはPythonへの対応とスケジュール実行の2つです。
Python対応が発表されてからというもの、早くPythonでLambda Function実装がしたくて仕方なかったので、今回の記事ではアップデートを盛り込んだLambdaの実装ネタをご紹介したいと思います。
お題
まずは実装するネタについて説明します。
ELBのお供によく使われる AutoScaling ですが、EC2インスタンスとは違ってStart/Stop することができません。業務時間だけサーバーを稼働できれば良い時にはどうしたら良いでしょうか?
1つの手として、使わない時は手動でMinSizeとDesiredCapacityを0にして稼働時に元の値に戻す、というやり方があります。が、マネコン上でいちいち操作するのはちょっとだけナンセンスですね。
解法
もっとも素直な答えは CLIを使って autoscaling put-scheduled-update-group-action を実行することです。名前が示す通り、これはスケジュールベースでAutoScalingのパラメータをコントロールすることができます。 --recurrence オプションにて、cronのフォーマットで定時実行のタイミングを指定できます。一例を挙げますと下記のような要領です。UTCで2015年10月29日になったらsome_asg_nameという名前のグループをアップデートします。
$
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name some_asg_name --scheduled-action-name "test_action" --start-time "2015-10-29T00:00:00Z" --min-size 0 --desired-capacity 0
詳しい仕様の解説はドキュメントに譲りますが、 --recurrence の指定をつけてMinSizeとDesiredCapacityの値をコントロールするアクションを(Start用、Stop用の)2つ作成してあげれば要件は達成できます。
別解
こちらが本記事のメインテーマです。
Lambda(の最近のアップデート機能)を使って、サーバーレスな構成で今回の要件を達成してみようと思います。機能としてはFunctionのスケジュール実行を使います。言語は新たに対応が発表されたPythonを利用しました。
社内で「車輪の再発明じゃね?」とツッコミご指摘を受けましたが、Python対応が嬉しすぎたので仕方ないですね。
やったことは以下の通りです。
- Start/Stop用のLambda Functionをそれぞれ作成する
- Lambda用のIAM Roleを作成
- IAM RoleをLambda Functionに割り当てる
- Lambda FunctionのEvent Sourceにトリガーしたい時間を設定
Lambda Function を作る
Start用とStop用のLambda Functionを作成します。
コードは下記です。パラメータ部分はStart/Stopの場合それぞれで置き換えてください。
IAM Role の作成と割り当て
AutoScalingの update-auto-scaling-group を実行する権限が必要になるため、作成Lambda Functionに適切なIAM Roleを割り当てます。
IAM RoleのAWS Service Roles で "AWS Lambda" を選択し、下記のポリシーを割り当てます。
Event Source の設定
Start/Stopしたい時間を設定します。Event Sourceには "Scheduled Event" を選択します。下記の図はStopする方のLambda Functionの例です。
スケジュール部分の設定方法に関しては公式ドキュメント "Walkthrough 5: Using Lambda Functions to Process Scheduled Events (Python)" が一番わかりやすいと思いますので、そちらをご覧ください。なお、時刻指定はUTCなので注意してください。
作業は以上で完了です。指定時刻にAutoScaling Groupのパラメータが反映されていれば成功です。
まとめ
Lambdaの新機能を利用してAutoScaling Groupの擬似Start/Stopを実装してみました。作り込みの要素がほぼなく、簡単に実現できるのがいいですね。せっかくですので、次はもうちょっと実用的な機能を実装してみたいと思います。
- AutoScalingのスケジュール機能は便利。惜しむらくは現状マネコンで設定ができないこと
- Python対応ばんざい\(^O^)/
上記があてはまるケースで有効なのではないかと思います。