Tips and Tricks for Local AWS
Maria Livia Chiorean
Software Developer @ Sky
@MariaLiviaCh
Problem
(Story Time)
The Developer ^-^
A
B
C
Account 1
Account 2
-
Credentials for account 1;
-
Credentials for account 2;
-
Create testing resources for 2 DynamoDB tables, 2 S3 buckets and 1 Kinesis;
-
Add some test data;
-
Start app C;
-
Start app B;
-
Start app A.
Steps
Solution
Localstack
Docker container
with Localstack image
...
Application
Prerequisites
> brew cask install docker
> brew install docker-compose
docker-compose.yml
version: "3.7"
services:
localstack:
image: localstack/localstack
ports:
- "4569:4569"
- "4572:4572"
environment:
- SERVICES=dynamodb,s3
sbt-docker-compose plugin
addSbtPlugin("com.tapad" % "sbt-docker-compose" % "1.0.34")
lazy val root = (project in file("."))
.enablePlugins(DockerComposePlugin)
.settings(
name := "localstack-example"
)
Or simply run:
> docker-compose -d up
> sbt dockerComposeUp
Spin up docker:
Create AWS resources
> brew install awscli
> aws s3api
create-bucket
--endpoint-url=http://localhost:4572
--bucket Config
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ConfigBucket:
DeletionPolicy: "Retain"
Type: "AWS::S3::Bucket"
Properties:
BucketName: "Config"
Update AWS Client
import software.amazon.awssdk.core.sync.RequestBody
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.model.PutObjectRequest
val client = S3Client.builder()
.endpointOverride(URI.create("http://localhost:4572"))
.build()
val request = PutObjectRequest.builder()
.bucket("Config")
.key("application")
.build()
client.putObject(request, RequestBody.fromString("config data"))
Start application
Can we do better?
Write a plugin to do it for you!
Old World :(
-
Install Docker and Docker Compose
-
Write docker-compose.yml
-
Spin up Docker
-
Create resources
-
Update client to use endpoint-url
-
Run app
New World :)
-
Install Docker and Docker Compose
-
Run plugin command
-
Update client to use endpoint-url
-
Run app
The sbt-local-aws plugin
-
Spins up a docker container with localstack running.
-
Only starts up the requested AWS services.
-
Automatically creates AWS CLI resource creation commands form available cloudformation.
-
Performs cloudformation substitutions.
-
Commands for start, stop and printing out the commands.
The sbt-local-aws plugin
-
At the moment only works with DynamoDB resources.
-
Only supports yml cloudformation.
Demo
Resources
-
Localstack: https://github.com/localstack/localstack
-
sbt-local-aws: https://github.com/marialivia16/sbt-local-aws
-
Slides: @MariaLiviaCh on Twitter
Special thanks to @OscarTheLargeCat (Instagram)
Copy of Tips and Tricks for Running AWS Dependencies Locally
By Maria Livia
Copy of Tips and Tricks for Running AWS Dependencies Locally
Sphere.it 2019
- 754