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-composedocker-compose.yml
version: "3.7"
services:
  localstack:
    image: localstack/localstack
    ports:
      - "4569:4569"
      - "4572:4572"
    environment:
      - SERVICES=dynamodb,s3sbt-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 dockerComposeUpSpin up docker:
Create AWS resources
> brew install awscli
> aws s3api 
    create-bucket
    --endpoint-url=http://localhost:4572 
    --bucket ConfigAWSTemplateFormatVersion: "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
- 895