This repository has been archived on 2024-07-19. You can view files and clone it, but cannot push or open issues or pull requests.
lambda-boilerplate/tasks.py
Marc Cataford f27200b29c
ci: base (#2)
* ci: base

* ci: missing bit

* ci: pyenv via action

* ci: typos

* ci: deps

* ci: typo

* ci: temp rm black

* ci: py ver

* ci: use builtin py

* ci: typo

* ci: setuptools

* ci: without subshell

* chore: normalize titles

* chore: lint

* ci: validate and lint flows

* ci: job name

* ci: pipx as module

* ci: missing dep

* ci: missing dep

* ci: pipx module

* docs: add badge
2020-09-26 11:40:18 -04:00

89 lines
2.2 KiB
Python

from invoke import task, Collection
import boto3
import os
from pathlib import Path
import hashlib
#####################
# Stack invocations #
#####################
@task(name="teardown-app")
def teardown_app(ctx):
with ctx.cd("infrastructure"):
ctx.run("sceptre delete app/app.yaml -y")
@task(name="teardown-bootstrap")
def teardown_bootstrap(ctx):
with ctx.cd("infrastructure"):
ctx.run("sceptre delete bootstrap/bootstrap.yaml -y")
@task(name="deploy")
def stack_deploy(ctx):
path = Path(__file__).parent
with ctx.cd("infrastructure"):
ctx.run("sceptre launch bootstrap/bootstrap.yaml -y")
ctx.run("zip lambda_function.zip src/*")
with open("lambda_function.zip", "rb") as src:
srchash = hashlib.md5(src.read()).hexdigest()
new_archive_name = f"lambda_function_{srchash}.zip"
ctx.run(f"mv lambda_function.zip {new_archive_name}")
ctx.run(
f"aws s3 cp {new_archive_name} s3://mcat-dev-test-bucket-artifacts-2 && rm {new_archive_name}"
)
with ctx.cd("infrastructure"):
ctx.run(f"sceptre --var source_key={new_archive_name} launch app/app.yaml -y")
#####################
# Local invocations #
#####################
@task(name="start")
def app_start(ctx):
ctx.run("docker-compose up -d --build")
@task(name="stop")
def app_stop(ctx):
ctx.run("docker-compose down")
@task(
name="invoke-function",
help={
"function_name": "Name of the Lambda to invoke locally (as defined in the Cloudformation template)",
"payload": "JSON payload to include in the trigger event",
},
)
def app_invoke_function(ctx, function_name, payload):
ctx.run(
f"aws lambda invoke --endpoint http://localhost:9001 --no-sign-request --function-name {function_name} --log-type Tail --payload {payload} {function_name}_out.json"
)
ns = Collection()
# Stack invocations manage the Clouformation flows
stack = Collection("stack")
stack.add_task(stack_deploy)
stack.add_task(teardown_app)
stack.add_task(teardown_bootstrap)
# App invocations manage local containers
app = Collection("app")
app.add_task(app_start)
app.add_task(app_stop)
app.add_task(app_invoke_function)
ns.add_collection(stack)
ns.add_collection(app)