Awesome
Serverless S3 Sync
A plugin to sync local directories and S3 prefixes for Serverless Framework :zap: .
Use Case
- Static Website (
serverless-s3-sync
) & Contact form backend (serverless
) . - SPA (
serverless
) & assets (serverless-s3-sync
) .
Install
Run npm install
in your Serverless project.
$ npm install --save serverless-s3-sync
Add the plugin to your serverless.yml file
plugins:
- serverless-s3-sync
Compatibility with Serverless Framework
Version 2.0.0 is compatible with Serverless Framework v3, but it uses the legacy logging interface. Version 3.0.0 and later uses the new logging interface.
serverless-s3-sync | Serverless Framework |
---|---|
v1.x | v1.x, v2.x |
v2.0.0 | v1.x, v2.x, v3.x |
≥ v3.0.0 | v3.x |
Setup
custom:
s3Sync:
# A simple configuration for copying static assets
- bucketName: my-static-site-assets # required
bucketPrefix: assets/ # optional
localDir: dist/assets # required
# An example of possible configuration options
- bucketName: my-other-site
localDir: path/to/other-site
deleteRemoved: true # optional, indicates whether sync deletes files no longer present in localDir. Defaults to 'true'
acl: public-read # optional
followSymlinks: true # optional
defaultContentType: text/html # optional
params: # optional
- index.html:
CacheControl: 'no-cache'
- "*.js":
CacheControl: 'public, max-age=31536000'
bucketTags: # optional, these are appended to existing S3 bucket tags (overwriting tags with the same key)
tagKey1: tagValue1
tagKey2: tagValue2
# This references bucket name from the output of the current stack
- bucketNameKey: AnotherBucketNameOutputKey
localDir: path/to/another
# ... but can also reference it from the output of another stack,
# see https://www.serverless.com/framework/docs/providers/aws/guide/variables#reference-cloudformation-outputs
- bucketName: ${cf:another-cf-stack-name.ExternalBucketOutputKey}
localDir: path
# Setting the optional enabled field to false will disable this rule.
# Referencing other variables allows this rule to become conditional
- bucketName: DisabledSync
localDir: path
enabled: false
resources:
Resources:
AssetsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-static-site-assets
OtherSiteBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-other-site
AccessControl: PublicRead
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: error.html
AnotherBucket:
Type: AWS::S3::Bucket
Outputs:
AnotherBucketNameOutputKey:
Value: !Ref AnotherBucket
Usage
Run sls deploy
, local directories and S3 prefixes are synced.
Run sls remove
, S3 objects in S3 prefixes are removed.
Run sls deploy --nos3sync
, deploy your serverless stack without syncing local directories and S3 prefixes.
Run sls remove --nos3sync
, remove your serverless stack without removing S3 objects from the target S3 buckets.
sls s3sync
Sync local directories and S3 prefixes.
Offline usage
If also using the plugins serverless-offline
and serverless-s3-local
, sync can be supported during development by placing the bucket configuration(s) into the buckets
object and specifying the alterate endpoint
(see below).
custom:
s3Sync:
# an alternate s3 endpoint
endpoint: http://localhost:4569
buckets:
# A simple configuration for copying static assets
- bucketName: my-static-site-assets # required
bucketPrefix: assets/ # optional
localDir: dist/assets # required
# ...
As per serverless-s3-local's instructions, once a local credentials profile is configured, run sls offline start --aws-profile s3local
to sync to the local s3 bucket instead of Amazon AWS S3
bucketNameKey
will not work in offline mode and can only be used in conjunction with valid AWS credentials, usebucketName
instead.
run sls deploy
for normal deployment
Always disable auto sync
custom:
s3Sync:
# Disable sync when sls deploy and sls remove
noSync: true
buckets:
# A simple configuration for copying static assets
- bucketName: my-static-site-assets # required
bucketPrefix: assets/ # optional
localDir: dist/assets # required
# ...
Sync on other hooks
custom:
s3Sync:
hooks:
# This hook will run after the deploy:finalize hook
- after:deploy:finalize
buckets:
# A simple configuration for copying static assets
- bucketName: my-static-site-assets # required
bucketPrefix: assets/ # optional
localDir: dist/assets # required
# ...