[Lambda]Provisioned ConcurrencyをスケジュールベースでAutoScaling #reinvent
コンニチハ、千葉です。
コールドスタート対策としてProvisioned ConcurrencyがLambdaに追加されました。
[速報]コールドスタート対策のLambda定期実行とサヨナラ!! LambdaにProvisioned Concurrencyの設定が追加されました #reinvent
事前にプロビジョニングする数を指定しプールできます。今回は、Application AutoScalingを利用しプールする数をチューニングしてみたいと思います。今回はスケジュールベースでスケールアウト、スケールインをしてみます。マネージメントコンソールをみたのですが、Lambdaは指定できなかったのでAWS CLIを利用し設定を行いました。
やってみた
Lambdaは手動で作成し、プロビジョニングされた同時実行は5と設定してあります。エイリアスは、autoscalingという名前で作成しました。
スケジュールベースのAutoScaling
まずは、作成したLambdaのエイリアスと、AutoScalingのターゲットとして登録します。キャパシティは、min 1、 max 10と指定しました。
$ aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:autoscaling-test:autoscaling --min-capacity 1 --max-capacity 10 \ --scalable-dimension lambda:function:ProvisionedConcurrency
次にスケーリングポリシーを適用します。スケジュールベースで、登録します。スケールアウト、スケールインするように設定してみました。(日次ではなく、1回きりの指定) *時間はUTCで指定
スケールアウトさせるには、MinCapacityとMaxCapacityを変更します。現在のキャパシティよりMinCapacityの値が大きいとスケールアウトします。
$ aws application-autoscaling put-scheduled-action --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency \ --resource-id function:autoscaling-test:autoscaling \ --scheduled-action-name my-one-time-action-scale-out \ --schedule "at(2019-12-5T20:00:00)" \ --scalable-target-action MinCapacity=10,MaxCapacity=10
次にスケールインを設定します。MinCapacityとMaxCapacityを変更します。現在のキャパシティよりMaxCapacityの値が小さいとスケールインします。
$ aws application-autoscaling put-scheduled-action --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency \ --resource-id function:autoscaling-test:autoscaling \ --scheduled-action-name my-one-time-action-scale-in \ --schedule "at(2019-12-5T01:00:00)" \ --scalable-target-action MinCapacity=1,MaxCapacity=1
設定できました。指定した時間になった場合の挙動をみてみます。まずはスケールアウトから。
想定通り動作していますね。次にスケールイン。
こちらもちゃんとスケールインできてます!
今回は、指定した時間に1度だけ実行するスケーリングポリシーでした。定期的に実行する場合のスケーリングポリシーのサンプルです。cron形式で指定します。
$ aws application-autoscaling put-scheduled-action --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency \ --resource-id function:autoscaling-test:autoscaling \ --scheduled-action-name my-recurring-action \ --schedule "cron(0 12 * * ? *)" \ --scalable-target-action MinCapacity=5,MaxCapacity=10
動作確認できたので、スケーリングポリシーとターゲットを削除します。
$ aws application-autoscaling describe-scaling-policies --service-namespace lambda $ aws application-autoscaling delete-scaling-policy --policy-name my-policy --service-namespace lambda --resource-id function:autoscaling-test:autoscaling --scalable-dimension lambda:function:ProvisionedConcurrency $ aws application-autoscaling describe-scheduled-actions --service-namespace lambda $ aws application-autoscaling delete-scheduled-action --service-namespace lambda --scheduled-action-name my-one-time-action-scale-out --resource-id function:autoscaling-test:autoscaling --scalable-dimension lambda:function:ProvisionedConcurrency $ aws application-autoscaling delete-scheduled-action --service-namespace lambda --scheduled-action-name my-one-time-action-scale-in --resource-id function:autoscaling-test:autoscaling --scalable-dimension lambda:function:ProvisionedConcurrency
さいごに
Provisioned Concurrencyをスケジュールベースで、スケールアウト・スケールインさせてみました。コールドスタートの高速化、需要が予測可能であればスケジュールベースを利用することで、コスト削減できます。導入の際はご検討ください。