-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
112 lines (96 loc) · 4.51 KB
/
Makefile
File metadata and controls
112 lines (96 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# Load .env if present
ifneq (,$(wildcard .env))
include .env
export $(shell sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=.*/\1/p' .env)
endif
# Defaults (can be overridden via .env)
APP_NAME ?= lambda-python-basic
AWS_REGION ?= us-west-2
AWS_PROFILE ?= default
ECR_REPO_NAME ?= $(APP_NAME)
IMAGE_TAG ?= v0
ARCH ?= linux/arm64
STACK_INFRA ?= $(APP_NAME)-infra
STACK_APP ?= $(APP_NAME)-app
IMAGE_LOCAL ?= $(APP_NAME):$(IMAGE_TAG)
# Derived at runtime via AWS CLI (requires SSO login/valid creds)
ECR_URI := $(shell aws cloudformation describe-stacks --stack-name $(STACK_INFRA) --query "Stacks[0].Outputs[?OutputKey=='EcrRepoUri'].OutputValue" --output text --region $(AWS_REGION) --profile $(AWS_PROFILE) 2>/dev/null)
ROLE_ARN := $(shell aws cloudformation describe-stacks --stack-name $(STACK_INFRA) --query "Stacks[0].Outputs[?OutputKey=='LambdaRoleArn'].OutputValue" --output text --region $(AWS_REGION) --profile $(AWS_PROFILE) 2>/dev/null)
IMAGE_REMOTE ?= $(ECR_URI):$(IMAGE_TAG)
.PHONY: help
help:
@echo "Common targets:"
@echo " make build - Build ARM64 image"
@echo " make run-lambda-local - Run Lambda locally on :9000 with RIE"
@echo " make invoke-local - Invoke local Lambda"
@echo " make run-api - Run FastAPI service on :8000"
@echo " make cfn-up-infra - Deploy ECR repo + IAM role"
@echo " make ecr-login - Docker login to ECR"
@echo " make push - Build/tag/push image to ECR"
@echo " make cfn-up-app - Deploy Lambda (container image) + Function URL"
@echo " make invoke-aws - Invoke deployed Lambda via AWS CLI"
@echo " make show-url - Print Function URL"
@echo " make teardown - Delete both stacks"
.PHONY: build
build:
docker buildx build --platform $(ARCH) -t $(IMAGE_LOCAL) .
.PHONY: run-lambda-local
run-lambda-local:
# Starts RIE inside the Lambda base image; listens on :9000 (proxies to :8080 in container)
docker run --rm -p 9000:8080 \
--env EXAMPLE_MESSAGE="$(EXAMPLE_MESSAGE)" \
$(IMAGE_LOCAL)
.PHONY: invoke-local
invoke-local:
curl -s -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" \
-d '{"ping":"pong"}' | python3 -m json.tool
.PHONY: run-api
run-api:
# Same image, different entrypoint: start the tiny FastAPI app
docker run --rm -p 8000:8000 \
--env EXAMPLE_MESSAGE="$(EXAMPLE_MESSAGE)" \
--entrypoint python \
$(IMAGE_LOCAL) -m uvicorn app.service:app --host 0.0.0.0 --port 8000
.PHONY: cfn-up-infra
cfn-up-infra:
aws cloudformation deploy \
--stack-name $(STACK_INFRA) \
--template-file cfn/infra.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides AppName=$(APP_NAME) EcrRepoName=$(ECR_REPO_NAME) \
--region $(AWS_REGION) --profile $(AWS_PROFILE)
.PHONY: ecr-login
ecr-login:
aws ecr get-login-password --region $(AWS_REGION) --profile $(AWS_PROFILE) | \
docker login --username AWS --password-stdin $$(aws sts get-caller-identity --query 'Account' --output text --profile $(AWS_PROFILE)).dkr.ecr.$(AWS_REGION).amazonaws.com
.PHONY: push
push: build ecr-login
@if [ -z "$(ECR_URI)" ]; then echo "ECR_URI empty; run 'make cfn-up-infra' first."; exit 1; fi
docker tag $(IMAGE_LOCAL) $(IMAGE_REMOTE)
docker push $(IMAGE_REMOTE)
.PHONY: cfn-up-app
cfn-up-app:
@if [ -z "$(ROLE_ARN)" ]; then echo "ROLE_ARN empty; run 'make cfn-up-infra' first."; exit 1; fi
@if [ -z "$(ECR_URI)" ]; then echo "ECR_URI empty; run 'make cfn-up-infra' first."; exit 1; fi
aws cloudformation deploy \
--stack-name $(STACK_APP) \
--template-file cfn/app.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides FunctionName=$(APP_NAME) ImageUri=$(IMAGE_REMOTE) RoleArn=$(ROLE_ARN) ExampleMessage="$(EXAMPLE_MESSAGE)" \
--region $(AWS_REGION) --profile $(AWS_PROFILE)
.PHONY: invoke-aws
invoke-aws:
aws lambda invoke --function-name $(APP_NAME) \
--payload '{"from":"make"}' \
--cli-binary-format raw-in-base64-out \
/tmp/out.json \
--region $(AWS_REGION) --profile $(AWS_PROFILE) >/dev/null && cat /tmp/out.json && echo && rm /tmp/out.json
.PHONY: show-url
show-url:
aws cloudformation describe-stacks --stack-name $(STACK_APP) \
--query "Stacks[0].Outputs[?OutputKey=='FunctionUrl'].OutputValue" --output text \
--region $(AWS_REGION) --profile $(AWS_PROFILE)
.PHONY: teardown
teardown:
aws cloudformation delete-stack --stack-name $(STACK_APP) --region $(AWS_REGION) --profile $(AWS_PROFILE) || true
aws cloudformation delete-stack --stack-name $(STACK_INFRA) --region $(AWS_REGION) --profile $(AWS_PROFILE) || true