[Lambda]Provisioned Concurrencyを使用率でAutoScalingさせる #reinvent

2019.12.06

コンニチハ、千葉です。

コールドスタート対策として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

次にスケーリングポリシーを適用します。プールの使用率が70%になった場合にスケールするように設定します。  

$ aws application-autoscaling put-scaling-policy --service-namespace lambda \
--scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:autoscaling-test:autoscaling \
--policy-name my-policy --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": {"PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'

設定できました。試しに、同時実行させてみます。AutoScaling用のCloudWatchアラームを見ると、閾値を超えています。

そしてプロビジョニング同時実行数が、自動で拡張されていることを確認できました。

確認できたので、スケーリングポリシーとターゲットを削除します。

$ 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-scalable-targets --service-namespace lambda
$ aws application-autoscaling deregister-scalable-target --service-namespace lambda --resource-id function:autoscaling-test:autoscaling --scalable-dimension lambda:function:ProvisionedConcurrency

さいごに

Application AutoScalingを利用して、Lambdaの事前プロビジョニングされた同時実行数をチューニングしてみました。今回は、事前にプロビジョニングした量に対し、70%超えになった場合にスケールするように設定しました。プロビジョニング完了までにはラグがありますが、スパイクなどの読めないアクセスに自動的にスケールされることができるので素敵だと思います。

参考