Skip to content

Instantly share code, notes, and snippets.

@shollingsworth
Last active August 10, 2022 23:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shollingsworth/53fa5d29dfb62cf1eadb844b55ddecb1 to your computer and use it in GitHub Desktop.
Save shollingsworth/53fa5d29dfb62cf1eadb844b55ddecb1 to your computer and use it in GitHub Desktop.
Scaffold for serverless directory with layer, log retention, and http wildcard http api gateway

Scaffold for serverless directory with layer, log retention, and http wildcard http api gateway

Deploy

  • Run yarn
  • Edit ./config.yaml as needed
  • Edit ./serverless.yml as needed
  • Run make build
  • Run make deploy

Delete

Run make destroy

node_modules
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# Serverless directories
.serverless
layer
source "$(poetry env info -p)/bin/activate"
nvm use --lts
export AWS_PROFILE="cuda-opsdev"
prefix: shollingsworth-lambda-testing
role: some-role-name
version: "3.9"
services:
build_img:
image: stackimg_bs
build:
context: .
dockerfile: Dockerfile
args:
UID: 1000
GID: 1000
volumes:
- ./:/home/docker/working
command: /home/docker/working/gen_layer.sh
FROM python:3.9.13-bullseye
ARG UID
ARG GID
RUN apt update \
&& apt upgrade -y \
&& apt install zip -y
RUN pip3 install --upgrade pip
RUN groupadd -g $GID docker \
&& useradd -m -u $UID -g $GID -G sudo -s /bin/bash docker
RUN pip3 install poetry
RUN mkdir -p /home/docker/working
USER docker
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
cd ~/working
poetry export \
--without-hashes \
-o /tmp/requirements.txt
test -d layer && rm -rfv layer/
mkdir -p layer
pip3 install -r /tmp/requirements.txt -t layer
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""lambda demo."""
import json
import logging
logging.basicConfig()
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.INFO)
def hello(event, _):
LOG.info("Received event: " + json.dumps(event))
source = event.get("source")
if (source == "serverless-plugin-warmup"):
return "Warmup - Lambda is warm!"
body = {
"message": "Go Serverless v3.0! Your function executed successfully!",
"input": event,
}
return {"statusCode": 200, "body": json.dumps(body)}
.DEFAULT_GOAL := help
help:
@echo "Available commands:"
@echo
@cat Makefile | grep '^\w.*:$$' | cut -d ':' -f 1 | grep -v '^help$$'
build:
docker-compose up --build --remove-orphans
deploy:
serverless deploy
destroy:
serverless remove
{
"name": "python-serverless-template",
"version": "1.0.0",
"description": "python serverless template",
"main": "index.js",
"repository": "https://gist.github.com/53fa5d29dfb62cf1eadb844b55ddecb1.git",
"author": "Steven Hollingsworth <shollingsworth@barracuda.com>",
"license": "MIT",
"private": true,
"dependencies": {
"serverless": "^3.21.0"
},
"scripts": {
"clean": "rm -rf node_modules yarn.lock && yarn"
},
"devDependencies": {
"serverless-offline": "^9.1.7",
"serverless-plugin-log-retention": "^2.0.0",
"serverless-plugin-warmup": "^7.3.0"
}
}
[[package]]
name = "certifi"
version = "2022.6.15"
description = "Python package for providing Mozilla's CA Bundle."
category = "main"
optional = false
python-versions = ">=3.6"
[[package]]
name = "charset-normalizer"
version = "2.1.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
python-versions = ">=3.6.0"
[package.extras]
unicode_backport = ["unicodedata2"]
[[package]]
name = "idna"
version = "3.3"
description = "Internationalized Domain Names in Applications (IDNA)"
category = "main"
optional = false
python-versions = ">=3.5"
[[package]]
name = "requests"
version = "2.28.1"
description = "Python HTTP for Humans."
category = "main"
optional = false
python-versions = ">=3.7, <4"
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = ">=2,<3"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<1.27"
[package.extras]
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "urllib3"
version = "1.26.11"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
[package.extras]
brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[metadata]
lock-version = "1.1"
python-versions = ">=3.9,<3.10"
content-hash = "7b03bdb9c6c523b394552b090d0de4c53412e924d80d1ca13222a2a00234f0c9"
[metadata.files]
certifi = []
charset-normalizer = []
idna = [
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
]
requests = []
urllib3 = []
[tool.poetry]
name = "python-serverless-template"
version = "0.1.0"
description = ""
authors = ["Steven Hollingsworth <shollingsworth@barracuda.com>"]
[tool.poetry.dependencies]
python = ">=3.9,<3.10"
requests = "^2.28.1"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
service: ${file(./config.yaml):prefix}
frameworkVersion: '3'
provider:
name: aws
region: us-east-2
memorySize: 128
# iam:
# role: ${file(./config.yaml):role}
runtime: python3.9
custom:
logRetentionInDays: 30
prefix: aws-python-project
warmup:
default:
enabled: true
name: ${file(./config.yaml):prefix}-warmup
verbose: false # Disable the logs
logRetentionInDays: 7
prewarm: true # Run WarmUp immediately after a deploymentlambda
serverless-offline:
host: 0.0.0.0
httpPort: 4000
plugins:
- serverless-offline
- serverless-plugin-log-retention
- serverless-plugin-warmup
layers:
backend:
name: ${file(./config.yaml):prefix}-layer
path: layer
package:
include:
- "**/*"
description: "Dependencies for ${file(./config.yaml):prefix}"
package:
individually: false
patterns:
- handler.py
functions:
hello:
handler: handler.hello
layers:
- { Ref: BackendLambdaLayer }
events:
- httpApi:
method: "*"
path: "/{proxy+}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment