Skip to content

Commit bc920bf

Browse files
committed
first commit
0 parents  commit bc920bf

31 files changed

+6362
-0
lines changed

.circleci/config.yml

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
version: 2
2+
executors:
3+
default:
4+
working_directory: ~/workspace
5+
docker:
6+
- image: lambci/lambda:build-python3.7
7+
references:
8+
commands:
9+
install_sls: &install_sls
10+
name: Install Serverless
11+
command: |
12+
#apt-get install curl
13+
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
14+
yum install -y nodejs
15+
npm install npm@latest -g
16+
npm install
17+
install_dependencies: &install_dependencies
18+
name: Install dependencies
19+
command: |
20+
python3 -m venv venv
21+
. venv/bin/activate
22+
pip install -r requirements.txt
23+
24+
jobs:
25+
setup:
26+
executor:
27+
name: default
28+
steps:
29+
- checkout
30+
- run: *install_sls
31+
- run: *install_dependencies
32+
- persist_to_workspace:
33+
root: ~/workspace
34+
paths:
35+
- ./*
36+
lint:
37+
executor:
38+
name: default
39+
steps:
40+
- attach_workspace:
41+
at: ~/workspace
42+
- run:
43+
name: Lint
44+
command: yarn lint
45+
46+
workflows:
47+
version: 2
48+
build-deploy-flow:
49+
jobs:
50+
- setup:
51+
filters:
52+
tags:
53+
only: /.*/
54+
- lint:
55+
requires:
56+
- setup
57+
filters:
58+
tags:
59+
only: /.*/

.envrc.sample

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export PYTHONPATH=$PWD
2+
export AWS_DEFAULT_REGION=us-east-1
3+
export AWS_ACCESS_KEY_ID=xxxxxx
4+
export AWS_SECRET_ACCESS_KEY=yyyyyy
5+
export STAGE=dev

.gitignore

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Distribution / packaging
2+
.Python
3+
env/
4+
build/
5+
develop-eggs/
6+
dist/
7+
downloads/
8+
eggs/
9+
.eggs/
10+
lib64/
11+
parts/
12+
sdist/
13+
var/
14+
*.egg-info/
15+
.installed.cfg
16+
*.egg
17+
venv
18+
node_modules
19+
.DS_Store
20+
__pycache__
21+
.envrc
22+
23+
# Serverless directories
24+
.serverless

layer/layer.yml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
service: python-layer
2+
3+
provider:
4+
name: aws
5+
region: ${file(serverless-common.yml):region}
6+
stage: ${file(serverless-common.yml):stage}
7+
runtime: ${file(serverless-common.yml):runtime}
8+
memorySize: ${file(serverless-common.yml):memorySize.${self:provider.stage}, file(serverless-common.yml):memorySize.default}
9+
deploymentBucket:
10+
name: ${file(serverless-common.yml):appname}.${file(serverless-common.yml):deploymentBucketPath.${self:provider.stage}, file(serverless-common.yml):deploymentBucketPath.default}.${self:provider.region}.deploys
11+
12+
custom:
13+
dockerizePipDefault: false
14+
pythonRequirements:
15+
layer:
16+
name: ${self:provider.stage}-python-requirements
17+
description: Python requirements lambda layer
18+
compatibleRuntimes:
19+
- ${self:provider.runtime}
20+
fileName: layer/requirements.txt
21+
dockerizePip: ${opt:dockerizePip, self:custom.dockerizePipDefault}
22+
23+
layers:
24+
lib:
25+
path: lib
26+
name: ${self:provider.stage}-lib
27+
description: libraries for this project
28+
compatibleRuntimes:
29+
- ${self:provider.runtime}
30+
31+
plugins:
32+
- serverless-python-requirements

layer/requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jeffy==0.1.4

lib/utils.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""utility functions."""
2+
import json
3+
import decimal
4+
5+
6+
def load_body(body):
7+
"""Load request body."""
8+
return json.loads(body)
9+
10+
11+
def response_builder(status_code, body={}):
12+
"""Generate api response."""
13+
return {
14+
'statusCode': status_code,
15+
'headers': {
16+
'Content-Type': 'application/json; charset=utf-8',
17+
'Access-Control-Allow-Origin': '*'
18+
},
19+
'body': json.dumps(body, cls=DecimalEncoder)
20+
}
21+
22+
23+
class DecimalEncoder(json.JSONEncoder):
24+
"""JSON encoder."""
25+
26+
def default(self, obj):
27+
"""encoding."""
28+
if isinstance(obj, decimal.Decimal):
29+
return int(obj)
30+
return super(DecimalEncoder, self).default(obj)

package.json

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"devDependencies": {
3+
"serverless": "^1.68.0",
4+
"serverless-iam-roles-per-function": "^2.0.2",
5+
"serverless-pseudo-parameters": "^2.5.0",
6+
"serverless-python-requirements": "^5.1.0",
7+
"serverless-step-functions": "^2.18.0"
8+
},
9+
"scripts": {
10+
"lint": "flake8 ./",
11+
"print:layer": "serverless print --config layer/layer.yml",
12+
"package:layer": "serverless package --config layer/layer.yml",
13+
"deploy:layer": "serverless deploy --config layer/layer.yml",
14+
"remove:layer": "serverless deploy --config layer/layer.yml",
15+
"print:db": "serverless print --config resources/dynamodb.yml",
16+
"package:db": "serverless package --config resources/dynamodb.yml",
17+
"deploy:db": "serverless deploy --config resources/dynamodb.yml",
18+
"remove:db": "serverless deploy --config resources/dynamodb.yml",
19+
"print:s3": "serverless print --config resources/s3.yml",
20+
"package:s3": "serverless package --config resources/s3.yml",
21+
"deploy:s3": "serverless deploy --config resources/s3.yml",
22+
"remove:s3": "serverless remove --config resources/s3.yml",
23+
"print:ssm": "serverless print --config resources/ssm.yml",
24+
"package:ssm": "serverless package --config resources/ssm.yml",
25+
"deploy:ssm": "serverless deploy --config resources/ssm.yml",
26+
"remove:ssm": "serverless remove --config resources/ssm.yml",
27+
"print:api": "serverless print --config services/api/serverless.yml",
28+
"package:api": "serverless package --config services/api/serverless.yml",
29+
"deploy:api": "serverless deploy --config services/api/serverless.yml",
30+
"remove:api": "serverless remove --config services/api/serverless.yml",
31+
"print:workflow": "serverless print --config services/workflow-service/serverless.yml",
32+
"package:workflow": "serverless package --config services/workflow-service/serverless.yml",
33+
"deploy:workflow": "serverless deploy --config services/workflow-service/serverless.yml",
34+
"remove:workflow": "serverless remove --config services/workflow-service/serverless.yml",
35+
"print:stream": "serverless print --config services/stream-service/serverless.yml",
36+
"package:stream": "serverless package --config services/stream-service/serverless.yml",
37+
"deploy:stream": "serverless deploy --config services/stream-service/serverless.yml",
38+
"remove:stream": "serverless remove --config services/stream-service/serverless.yml",
39+
"print:message": "serverless print --config services/message-service/serverless.yml",
40+
"package:message": "serverless package --config services/message-service/serverless.yml",
41+
"deploy:message": "serverless deploy --config services/message-service/serverless.yml",
42+
"remove:message": "serverless remove --config services/message-service/serverless.yml",
43+
"test:unit": "pytest tests/unit_tests -s",
44+
"test:workflow": "pytest tests/integration_tests/workflow_service -s",
45+
"test:api": "pytest tests/integration_tests/api -s"
46+
},
47+
"name": "python"
48+
}

requirements-dev.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
flake8==3.7.9
2+
pytest==5.4.1
3+
requests==2.22.0

resources/dynamodb.yml

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
service: db
2+
3+
provider:
4+
name: aws
5+
region: ${file(serverless-common.yml):region}
6+
stage: ${file(serverless-common.yml):stage}
7+
deploymentBucket:
8+
name: ${file(serverless-common.yml):appname}.${file(serverless-common.yml):deploymentBucketPath.${self:provider.stage}, file(serverless-common.yml):deploymentBucketPath.default}.${self:provider.region}.deploys
9+
10+
custom:
11+
deploy:
12+
prod: prod
13+
default: dev
14+
15+
resources:
16+
Parameters:
17+
ExampleTableName:
18+
Type: String
19+
Default: Example-${self:provider.stage}
20+
Resources:
21+
ExampleTable:
22+
Type: AWS::DynamoDB::Table
23+
Properties:
24+
TableName: !Ref ExampleTableName
25+
AttributeDefinitions:
26+
- AttributeName: ID
27+
AttributeType: S
28+
- AttributeName: Name
29+
AttributeType: S
30+
KeySchema:
31+
- AttributeName: ID
32+
KeyType: HASH
33+
- AttributeName: Name
34+
KeyType: RANGE
35+
BillingMode: PAY_PER_REQUEST
36+
PointInTimeRecoverySpecification:
37+
PointInTimeRecoveryEnabled: true
38+
StreamSpecification:
39+
StreamViewType: NEW_AND_OLD_IMAGES
40+
Outputs:
41+
ExampleTableName:
42+
Value: !Ref ExampleTable
43+
Export:
44+
Name: ExampleTableName-${self:provider.stage}
45+
ExampleTableArn:
46+
Value: !GetAtt ExampleTable.Arn
47+
Export:
48+
Name: ExampleTableArn-${self:provider.stage}
49+
ExampleTableStreamArn:
50+
Value: !GetAtt ExampleTable.StreamArn
51+
Export:
52+
Name: ExampleTableStreamArn-${self:provider.stage}

resources/s3.yml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
service: s3
2+
3+
provider:
4+
name: aws
5+
region: ${file(serverless-common.yml):region}
6+
stage: ${file(serverless-common.yml):stage}
7+
deploymentBucket:
8+
name: ${file(serverless-common.yml):appname}.${file(serverless-common.yml):deploymentBucketPath.${self:provider.stage}, file(serverless-common.yml):deploymentBucketPath.default}.${self:provider.region}.deploys
9+
10+
resources:
11+
Resources:
12+
ExampleBucket:
13+
Type: AWS::S3::Bucket
14+
Properties:
15+
BucketName: slsopsexample-bucket-${self:provider.stage}
16+
Outputs:
17+
ExampleBucketName:
18+
Value: !Ref ExampleBucket
19+
Export:
20+
Name: ExampleBucketName-${self:provider.stage}

resources/ssm.yml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
service: ssm
2+
3+
provider:
4+
name: aws
5+
region: ${file(serverless-common.yml):region}
6+
stage: ${file(serverless-common.yml):stage}
7+
deploymentBucket:
8+
name: ${file(serverless-common.yml):appname}.${file(serverless-common.yml):deploymentBucketPath.${self:provider.stage}, file(serverless-common.yml):deploymentBucketPath.default}.${self:provider.region}.deploys
9+
10+
resources:
11+
Resources:
12+
ExampleSecretValue:
13+
Type: AWS::SSM::Parameter
14+
Properties:
15+
Name: example-${self:provider.stage}
16+
Description: An example secret value
17+
Type: String
18+
Value: ${env:EXAMPLE_SECRET_VALUE, ''}

serverless-common.yml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
appname: myapp
2+
runtime: python3.8
3+
logRetentionInDays:
4+
prod: 90 # 90 days in [prod] stage
5+
default: 3 # 3 days in other stages
6+
memorySize:
7+
prod: 512
8+
default: 128
9+
stage: ${env:STAGE}
10+
region: ${env:AWS_DEFAULT_REGION}
11+
deploymentBucketPath:
12+
prod: prod
13+
default: dev

services/api/hello.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Hello Lambda function."""
2+
import json
3+
4+
5+
def handler(event, context):
6+
"""Hello Lambda function."""
7+
body = {
8+
"message": "Go Serverless v1.0! Your function executed successfully!",
9+
"input": event
10+
}
11+
12+
response = {
13+
"statusCode": 200,
14+
"body": json.dumps(body)
15+
}
16+
17+
return response
18+
19+
# Use this code if you don't use the http event with the LAMBDA-PROXY
20+
# integration
21+
"""
22+
return {
23+
"message": "Go Serverless v1.0! Your function executed successfully!",
24+
"event": event
25+
}
26+
"""

0 commit comments

Comments
 (0)