Skip to content

Integrating with the Serverless Frameworkยป

In order to use the Serverless Framework in an AWS CloudFormation Stack you'll need to do a few things: create a Docker image with the Serverless Framework included, invoke the serverless CLI in before_init hook, sync your artifacts with Amazon S3, and make sure the serverless config has your template bucket configured as the artifact location.

The first one can be done using a Dockerfile akin to this one:

1
2
3
4
5
6
7
FROM public.ecr.aws/spacelift/runner-terraform
USER root
WORKDIR /home/spacelift
RUN apk add --update --no-cache curl nodejs npm
RUN npm install -g serverless
RUN serverless --version
USER spacelift

You should build it, push it to a repository and set it as the Runner Image of your Stack.

You'll also have to invoke the serverless CLI in order to generate raw CloudFormation files. You can do this by adding the following to your before initialization hooks:

serverless package --region ${CF_METADATA_REGION}

You can add the following script as a mounted file:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

set -eu
set -o pipefail

STATE_FILE=.serverless/serverless-state.json
S3_PREFIX=$(jq -r '.package.artifactDirectoryName' < "$STATE_FILE")
ARTIFACT=$(jq -r '.package.artifact' < "$STATE_FILE")

aws s3 cp .serverless/$ARTIFACT s3://$CF_METADATA_TEMPLATE_BUCKET/$S3_PREFIX/$ARTIFACT

and invoke it in your before initialization hooks: sh sync.sh

Finally, specify the S3 bucket for artifacts in your serverless.yml configuration file:

1
2
provider:
  deploymentBucket: your-s3-bucket

When creating the CloudFormation Stack, make sure that you set the entry template file to .serverless/cloudformation-template-update-stack.json, which is the file generated by the serverless package command.