Serverless Provisioned Concurrency Autoscaling
Serverless Plugin for AWS Lambda Provisioned Concurrency Auto Scaling configuration

# ⚡️ serverless-provisioned-concurrency-autoscaling
[](https://www.npmjs.com/package/serverless-provisioned-concurrency-autoscaling)
[](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/actions?query=workflow%3A%22build%20ci%22)
[](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/blob/master/LICENSE)
[](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/blob/master/CONTRIBUTING.md)
[](https://snyk.io/test/npm/serverless-provisioned-concurrency-autoscaling)
Serverless Plugin for AWS Lambda Provisioned Concurrency Auto Scaling configuration.
Related blog post can be found on the [Neiman Marcus Medium page](https://medium.com/neiman-marcus-tech/serverless-provisioned-concurrency-autoscaling-3d8ec23d10c).
## Usage
Add the [NPM package](https://www.npmjs.com/package/serverless-provisioned-concurrency-autoscaling) to your project:
```bash
$ npm install serverless-provisioned-concurrency-autoscaling
```
Add the plugin to your `serverless.yml`:
Use version 1.9.1 for Serverless 1/ Serverless 2.
Use version 2.0.1 for Serverless 3.
```yaml
plugins:
- serverless-provisioned-concurrency-autoscaling
```
## Configuration
Add `concurrencyAutoscaling` parameters under each function you wish to autoscale in your `serverless.yml`.
Add `customMetric: true` if you want to use `Maximum` instead of `Average` statistic.
### Minimal Configuration
```yaml
functions:
hello:
handler: handler.hello
provisionedConcurrency: 1
concurrencyAutoscaling: true
```
### Full Configuration
```yaml
functions:
world:
handler: handler.world
provisionedConcurrency: 1
concurrencyAutoscaling:
enabled: true
alias: provisioned
maximum: 10
minimum: 1
usage: 0.75
scaleInCooldown: 0
scaleOutCooldown: 0
customMetric:
statistic: maximum
scheduledActions:
- name: OpenOfficeTime
startTime: "2025-01-01T00:00:00.000Z"
endTime: "2025-01-01T23:59:59.999Z"
timezone: "America/Chicago"
schedule: "cron(30 8 ? * 1-6 *)"
action:
maximum: 100
minimum: 10
- name: CloseOfficeTime
startTime: "2025-01-01T00:00:00.000Z"
endTime: "2025-01-01T23:59:59.999Z"
timezone: "America/Chicago"
schedule: "cron(30 17 ? * 1-6 *)"
action:
maximum: 10
minimum: 1
- name: BlackFridayPeak1
startTime: "2025-01-02T00:00:00.000Z"
endTime: "2025-01-02T23:59:59.999Z"
timezone: "America/New_York"
schedule: "at(2025-01-02T12:34:56)"
action:
maximum: 50
minimum: 5
- name: BlackFridayPeak2
startTime: "2025-01-03T00:00:00.000Z"
endTime: "2025-01-03T23:59:59.999Z"
timezone: "Europe/Warsaw"
schedule: "rate(1 hour)"
action:
maximum: 50
minimum: 5
```
That's it! With the next deployment, [serverless](https://serverless.com) will add Cloudformation resources to scale provisioned concurrency!
You must provide at least `provisionedConcurrency` and `concurrencyAutoscaling` to enable autoscaling. Set `concurrencyAutoscaling` to a boolean, or object with configuration. Any omitted configuration will use module defaults.
### Defaults
```yaml
alias: provisioned
maximum: 10
minimum: 1
usage: 0.75
scaleInCooldown: 0
scaleOutCooldown: 0
```
**Change in Default Behavior:** Starting in v1.7.0, the default scaleInCooldown is zero, not 120. This is backwards compatible, but different default behavior. This is in line with AWS' default scaleInCooldown.
### Scheduled Actions
For more details on Scheduled Actions formats see
[the AWS CloudFormation ScheduledAction description](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html).
#### Description of `scheduledActions`'s properties:
| Attribute | Description | Required | Example |
|-----------|---------------------------------------------------------------------------------------------------------------|----------|----------------------------------|
| endTime | The date and time that the action is scheduled to end, in UTC. | no | `2025-12-31T23:59:59.999Z` |
| startTime | The date and time that the action is scheduled to begin, in UTC. | no | `2025-01-01T00:00:00.000Z` |
| timezone | Timezone for `startTime` and `endTime`. Needs to be the canonical names of the IANA (supported by Yoda-Time). | no | `America/Chicago` |
| name | The name of the scheduled action unique among all other scheduled actions on the specified scalable target. | yes | `OpenOfficeHourScheduleStart` |
| schedule | One of three string formats: `at`, `cron` or `rate` (see next table). | yes | `cron(* 30 8 * 1-6 *)` |
| action | Object of `minimum` and `maximum` properties. At least one is required. | yes | `minimum: 100`
`maximum: 105` |
#### Description of `schedule`'s properties:
For more details on schedule syntax see:
* [AWS CloudFormation ScheduledAction description](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html)
* [AWS Schedule Expressions for Rules](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html) (cron)
* [AWS Put Scheduled Action - Timezone](https://docs.aws.amazon.com/autoscaling/application/APIReference/API_PutScheduledAction.html#API_PutScheduledAction_RequestSyntax)
| Attribute | Description | Format | Example |
|-----------|--------------------------------------|---------------------------|---------------------------|
| at | A start (a point in time) | `at(yyyy-mm-ddThh:mm:ss)` | `at(2025-01-02T00:00:00)` |
| cron | A cron syntax for recurring schedule | `cron(fields)` | `cron(30 17 ? * 1-6 *)` |
| rate | A rate | `rate(value unit)` | `rate(16 minuets)` |
## Known Issues/Limitations
N/A
## Authors
- [Clay Danford](mailto:crd013@gmail.com)
- [Dawid Boissé](mailto:dawid.boisse@gmail.com)
## Contributors
- [Vinoth Kumar Chandrasekar](vinothchandra87@gmail.com)
## Conduct / Contributing / License
- Refer to our contribution guidelines to contribute to this project. See [CONTRIBUTING.md](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/tree/master/CONTRIBUTING.md).
- All contributions must follow our code of conduct. See [CONDUCT.md](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/tree/master/CONDUCT.md).
- This project is licensed under the Apache 2.0 license. See [LICENSE](https://github.com/neiman-marcus/serverless-provisioned-concurrency-autoscaling/tree/master/LICENSE).
## Acknowledgments
- [serverless-dynamodb-autoscaling](https://github.com/sbstjn/serverless-dynamodb-autoscaling) - Original plugin this module is based on.