Awesome
serverless-plugin-tables
This Serverless plugin makes adding tables to your service file easy.
Benefits
- Less boilerplate
- Common defaults
- Integrates with existing resources
- Handles deployment limits
Contents
Installation
Install the dependency:
yarn add -D serverless-plugin-tables
Add serverless-plugin-tables
to your serverless.yml
file:
plugins:
- serverless-plugin-tables
Usage
Add a tables
property the resources in your serverless.yml
file and define tables by name according to the provider specs.
service: my-service
plugins:
- serverless-plugin-tables
provider:
...
resources:
tables:
MyTable1:
...
MyTable2:
...
Plugin options
The plugin can be configured by defining a custom tables
object in your serverless.yml
file. Database specific options should be defined as properties under their database type, like dynamo
. See database specs for related options. Example options serverless.yml
:
custom:
tables:
dynamo:
deploymentBatchSize: 5
Providers
Common properties:
Property | Required | Default Value | Description |
---|---|---|---|
name | false | The table key | The name of the table |
type | false | Varies by provider | The database type. Please refer to corresponding provider and database sections below. |
AWS
Common properties:
Property | Required | Default Value | Description |
---|---|---|---|
resourceName | false | '{pascalCase(tableName)}DynamoDbTable' | The CloudFormation resource name. The default runs your table name through a pascal case transformation. |
type | false | 'dynamo' | The database type. Please refer to corresponding database sections below. |
template | false | null | Custom CloudFormation template overrides. This allows you to implement features not covered, override the generated output, or do whatever other crazy stuff you have in mind 😀 |
<a name="aws-example"></a> Example
resources:
tables:
# Simple DynamoDB Table
Music:
partitionKey: Artist
sortKey: SongTitle
indexes:
- name: GenreByTitleIndex
partitionKey: Genre
sortKey: AlbumTitle
# Complex DynamoDB Table
People:
name: ${env:PEOPLE_TABLE_NAME}
resourceName: FavoritePeopleDynamoTable
type: dynamo
partitionKey: personID
sortKey: state
readUnits: 5
writeUnits: 5
indexes:
# Global Secondary Index
- name: EmailIndex
partitionKey: email
projection: all
readUnits: 2
writeUnits: 2
# Local Secondary Index
- name: PersonByCreatedTimeIndex
sortKey:
name: createdTime
type: number
projection: keys
readUnits: 2
writeUnits: 2
# Local Secondary Index with projection
- name: PersonByAgeIndex
sortKey:
name: age
type: number
projection:
- dob
- firstName
- lastName
readUnits: 2
writeUnits: 2
streamType: newItem
ttlKey: expirationTime
encrypted: true
pointInTimeRecovery: true
tags:
STAGE: test
TEAM: backend
template:
# Override the computed CF template
Properties:
ProvisionedThroughput:
ReadCapacityUnits : 1
DynamoDB
Type: dynamo
Note that DynamoDB tables default to using on-demand billing mode.
Options
Property | Default Value | Description |
---|---|---|
deploymentBatchSize | 10 | The deployment batch size. Do not exceed the AWS limits |
Properties:
Property | Required | Description |
---|---|---|
partitionKey | true | The partition key. Refer to keys |
sortKey | false | The sort key. Refer to keys |
readUnits | false <sup>1</sup> | The provisioned read units. Setting this changes the table to provisioned billing mode. |
writeUnits | false <sup>1</sup> | The provisioned write units. Setting this changes the table to provisioned billing mode. |
indexes | false | List of secondary indexes |
streamType | false | The stream type of the table. See Stream Types for valid values. |
ttlKey | false | The Time To Live field |
encrypted | false | Enable encryption |
pointInTimeRecovery | false | Enable Point-in-Time Recovery |
tags | false | Key-value pairs of resource tags |
<a name="footnote-dynamo-provisioned-units">[1]</a>: Both read and write units are required if one is defined
<a name="dynamo-keys"></a> Keys:
Keys can be a string
or an object
. If a string is provided, then that will be the key name and it will be of data type string
.
Property | Required | Description |
---|---|---|
name | true | The name of the key |
type | true | The data type of the key |
<a name="dynamo-data-types"></a> Data Types:
Corresponds to DynamoDB Data Types
Value | Description |
---|---|
string | String |
number | Number |
binary | Binary |
boolean | Boolean |
list | List |
map | Map |
numberSet | Number Set |
stringSet | String Set |
binarySet | Binary Set |
null | Null |
<a name="dynamo-indexes"></a>Indexes:
Indexes can be Global or Local indexes. The difference being that Local indexes share the same partition key as the table. Therefore, to create a Local index, just omit the partitionKey
field.
Property | Required | Description |
---|---|---|
name | true | The name of the index |
partitionKey | false <sup>2</sup> | The partition key. Refer to keys |
sortKey | false <sup>2</sup> | The sort key. Refer to keys |
readUnits | false <sup>3</sup> | The provisioned read units |
writeUnits | false <sup>3</sup> | The provisioned write units |
projection | false | The projected fields. Possible values include:<br>all - [Default] The entire record<br>keys - Only keys<br>A list of fields |
<a name="footnote-dynamo-index-key">[2]</a>: At least one key is required
<a name="footnote-dynamo-index-units">[3]</a>: Required if defined for the table
<a name="dynamo-stream-types"></a> Stream Types:
Corresponds to DynamoDB Stream Types
Value | Description |
---|---|
newItem | Enable stream with new item/image only |
oldItem | Enable stream with old item/image only |
both | Enable stream with new and old items |
keys | Enable stream with keys only |
Others
If your provider or database isn't supported, open an issue to request it!