sls-with-cdk
This example combines a serverless framework project with an AWS CDK project. It applies
the principle of least privilege for granting permissions.
- serverless framework is used to develop/deploy a few simple AWS Lambda functions.
This code is based on Python 3.x - AWS CDK is used to develop/deploy the AWS infrastructure required by the serverless framework.
This code is based on Typescript
Background
My impression is that many developers tend to use admin privileged AWS IAM users (๐ฑ) for working
with serverless technologies. Simply because it is the easy way and "it just works".
This project doesn't do that. Instead it attempts to apply the principle of least privilege: It
uses AWS (IAM) groups granted only permissions with the least privileges necessary in order to work.
Where possible, it also attempts to scope the permissions to the most specific AWS resources
necessary.
Examine this repository, because:
-
You want to see what permissions serverless framework requires. Then use this as inspiration for
configuring it in your own project -
You want to see what infrastructure code with AWS CDK looks like.
It is possible to narrow the privileges a bit more (for S3 for example). Ping me on
Twitter/Email if you have some ideas for improving this. Or better yet; create a PR.
About the code
Serverless framework application code
-
./hello-handler.pyand./hello2-handler.py- these are 2 x "Hello World"(ish) AWS Lambda
functions -
./serverless.yml- the serverless framework specific configuration file
Infrastructure code
The infrastructure code is based on AWS CDK and implemented with Typescript. The AWS CDK
is then used to generate normal AWS CloudFormation templates.
-
./infra/bin/infra.ts- the main infrastructure script defining which AWS CloudFormation stacks
gets installed -
./infra/lib/serverless-stack.ts- defines an AWS CloudFormation stack which creates the AWS
S3 bucket used by serverless framework. It also creates an AWS IAM group containing a few
basic permissions required by serverless framework - these permissions are not specific to the
concrete serverless framework project -
./infra/lib/infra-stack.ts- defines an AWS CloudFormation stack which creates the AWS IAM
group specific to the serverless framework project. The group is assigned specific AWS IAM
permissions (not admin power ๐ฑ). The code is dynamic: it adapts the infrastructure to the
configuration in serverless.yml. It uses information such as the service name and the function
names when generating the infrastructure. A remarkable difference to traditional declarative
approaches, such as AWS CloudFormation or Terraform.
Assign the generated IAM groups to your favorite AWS IAM User (app user). You can then use that user
for working with the serverless framework tool.
Try it (only 2 super simple steps ๐)
Complete the following to steps in order to test this.
Prerequisites
Firstly, ensure that you have the following tools installed:
npm- the node package manager etc. (used by the AWS CDK implementation in this project)sls- the serverless framework tool (this is the framework used for working with the AWS
Lambda functions in this project)
Step 1) Install the infrastructure
This step requires a privileged user (admin for example).
- From the
infradirectory, runcdk synthto generate the AWS CloudFormation template - Install the generated
./infra/cdk.out/*.template.jsonCloudFormation templates into your AWS account.
Can be done with the AWS CDK toolcdk, the AWS CLI toolaws, the AWS Web console, etc. - Create an IAM user and add it to the IAM Groups.
- Use that IAM user when working with the serverless CLI.
Step 2) Play with serverless
Use the IAM user you configured in the previous step. Notice that this user has the least privileges
necessary in order for it to operate on the current serverless service. This is the cool part ๐คฉ**.
From the root directory (the one containing this document):
- Run
sls deployto deploy the serverless service (it produces and installs an AWS CloudFormation template) - Run
sls invoke -f helloto run the AWS Lambda function calledhello - Run
sls logs -f helloto show the logs for the current function (logs can be a bit delayed in AWS CloudWatch Logs) - Run
sls removeto undeploy the serverless service (it uninstalls the AWS CloudFormation template)
** Cool? Well the idea is that AWS credentials can be leaked (like any other credentials) ... if that
happens, then the leaked credentials only contains permissions to manage the current service. Not
admin permissions (which can be misused to a much higher degree).
TODO
- pylint
- infra: removed hardcoded environment (in infra.ts)
- infra: implement unit tests