[Lambda]Provisioned ConcurrencyをスケジュールベースでAutoScaling #reinvent

2019.12.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

コールドスタート対策として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をスケジュールベースで、スケールアウト・スケールインさせてみました。コールドスタートの高速化、需要が予測可能であればスケジュールベースを利用することで、コスト削減できます。導入の際はご検討ください。

参考