This repository has been archived by the owner on Nov 10, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
136 lines (114 loc) · 6.38 KB
/
Makefile
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
include Makefile.mk
NAME=cfn-waf-provider
S3_BUCKET_PREFIX=binxio-waf-custom-provider
AWS_REGION=eu-west-1
ALL_REGIONS=$(shell printf "import boto3\nprint('\\\n'.join(map(lambda r: r['RegionName'], boto3.client('ec2').describe_regions()['Regions'])))\n" | python | grep -v '^$(AWS_REGION)$$')
help:
@echo 'make - builds a zip file to target/.'
@echo 'make release - builds a zip file and deploys it to s3.'
@echo 'make clean - the workspace.'
@echo 'make test - execute the tests, requires a working AWS connection.'
@echo 'make deploy-provider - deploys the provider.'
@echo 'make delete-provider - deletes the provider.'
@echo 'make demo - deploys the provider and the demo cloudformation stack.'
@echo 'make delete-demo - deletes the demo cloudformation stack.'
deploy: target/$(NAME)-$(VERSION).zip
aws s3 --region $(AWS_REGION) \
cp target/$(NAME)-$(VERSION).zip \
s3://$(S3_BUCKET_PREFIX)-$(AWS_REGION)/lambdas/$(NAME)-$(VERSION).zip
aws s3 --region $(AWS_REGION) cp \
s3://$(S3_BUCKET_PREFIX)-$(AWS_REGION)/lambdas/$(NAME)-$(VERSION).zip \
s3://$(S3_BUCKET_PREFIX)-$(AWS_REGION)/lambdas/$(NAME)-latest.zip
aws s3api --region $(AWS_REGION) \
put-object-acl --bucket $(S3_BUCKET_PREFIX)-$(AWS_REGION) \
--acl public-read --key lambdas/$(NAME)-$(VERSION).zip
aws s3api --region $(AWS_REGION) \
put-object-acl --bucket $(S3_BUCKET_PREFIX)-$(AWS_REGION) \
--acl public-read --key lambdas/$(NAME)-latest.zip
deploy-all-regions: deploy
@for REGION in $(ALL_REGIONS); do \
echo "copying to region $$REGION.." ; \
aws s3 --region $(AWS_REGION) \
cp \
s3://$(S3_BUCKET_PREFIX)-$(AWS_REGION)/lambdas/$(NAME)-$(VERSION).zip \
s3://$(S3_BUCKET_PREFIX)-$$REGION/lambdas/$(NAME)-$(VERSION).zip; \
aws s3 --region $$REGION \
cp \
s3://$(S3_BUCKET_PREFIX)-$$REGION/lambdas/$(NAME)-$(VERSION).zip \
s3://$(S3_BUCKET_PREFIX)-$$REGION/lambdas/$(NAME)-latest.zip; \
aws s3api --region $$REGION \
put-object-acl --bucket $(S3_BUCKET_PREFIX)-$$REGION \
--acl public-read --key lambdas/$(NAME)-$(VERSION).zip; \
aws s3api --region $$REGION \
put-object-acl --bucket $(S3_BUCKET_PREFIX)-$$REGION \
--acl public-read --key lambdas/$(NAME)-latest.zip; \
done
undeploy:
@for REGION in $(ALL_REGIONS); do \
echo "removing lamdba from region $$REGION.." ; \
aws s3 --region $(AWS_REGION) \
rm \
s3://$(S3_BUCKET_PREFIX)-$$REGION/lambdas/$(NAME)-$(VERSION).zip; \
done
do-push: deploy
do-build: target/$(NAME)-$(VERSION).zip
target/$(NAME)-$(VERSION).zip: src requirements.txt
mkdir -p target/content
docker build --build-arg ZIPFILE=$(NAME)-$(VERSION).zip -t $(NAME)-lambda:$(VERSION) -f Dockerfile.lambda . && \
ID=$$(docker create $(NAME)-lambda:$(VERSION) /bin/true) && \
docker export $$ID | (cd target && tar -xvf - $(NAME)-$(VERSION).zip) && \
docker rm -f $$ID && \
chmod ugo+r target/$(NAME)-$(VERSION).zip
venv: requirements.txt
virtualenv -p python3 venv && \
. ./venv/bin/activate && \
pip3 --quiet install --upgrade pip && \
pip3 --quiet install -r requirements.txt
clean:
rm -rf venv target src/*.pyc tests/*.pyc
test: venv
for n in ./cloudformation/*.yaml ; do aws cloudformation validate-template --template-body file://$$n ; done
. ./venv/bin/activate && \
pip --quiet install -r test-requirements.txt && \
cd src && \
PYTHONPATH=$(PWD)/src pytest ../tests/test*.py
autopep:
autopep8 --experimental --in-place --max-line-length 132 src/*.py tests/*.py
deploy-provider: COMMAND=$(shell if aws --region $(AWS_REGION) cloudformation get-template-summary --stack-name $(NAME) >/dev/null 2>&1; then \
echo update; else echo create; fi)
deploy-provider: target/$(NAME)-$(VERSION).zip
aws --region $(AWS_REGION) cloudformation $(COMMAND)-stack \
--capabilities CAPABILITY_IAM \
--stack-name $(NAME) \
--template-body file://cloudformation/cfn-waf-provider.yaml \
--parameters \
ParameterKey=S3BucketPrefix,ParameterValue=$(S3_BUCKET_PREFIX) \
ParameterKey=CFNCustomProviderZipFileName,ParameterValue=lambdas/$(NAME)-$(VERSION).zip
aws --region $(AWS_REGION) cloudformation wait stack-$(COMMAND)-complete --stack-name $(NAME)
delete-provider:
aws --region $(AWS_REGION) cloudformation delete-stack --stack-name $(NAME)
aws --region $(AWS_REGION) cloudformation wait stack-delete-complete --stack-name $(NAME)
demo: deploy-demo-predicates
-COMMAND=$(shell if aws --region $(AWS_REGION) cloudformation get-template-summary --stack-name $(NAME)-demo >/dev/null 2>&1; then \
echo update; else echo create; fi) ; \
aws --region $(AWS_REGION) cloudformation $$COMMAND-stack --stack-name $(NAME)-demo \
--template-body file://cloudformation/demo-stack.yaml --capabilities CAPABILITY_NAMED_IAM
deploy-demo-predicates:
-COMMAND=$(shell if aws --region $(AWS_REGION) cloudformation get-template-summary --stack-name $(NAME)-predicates-demo >/dev/null 2>&1; then \
echo update; else echo create; fi) ; \
aws --region $(AWS_REGION) cloudformation $$COMMAND-stack --stack-name $(NAME)-predicates-demo --template-body file://cloudformation/demo-predicates-stack.yaml --capabilities CAPABILITY_NAMED_IAM
delete-demo: delete-demo-stack
aws --region $(AWS_REGION) cloudformation delete-stack --stack-name $(NAME)-predicates-demo
aws --region $(AWS_REGION) cloudformation wait stack-delete-complete --stack-name $(NAME)-predicates-demo
delete-demo-stack:
aws --region $(AWS_REGION) cloudformation delete-stack --stack-name $(NAME)-demo
aws --region $(AWS_REGION) cloudformation wait stack-delete-complete --stack-name $(NAME)-demo
complete-demo:
COMMAND=$(shell if aws --region $(AWS_REGION) cloudformation get-template-summary --stack-name $(NAME)-complete-demo >/dev/null 2>&1; then \
echo update; else echo create; fi) ; \
aws --region $(AWS_REGION) cloudformation $$COMMAND-stack --stack-name $(NAME)-complete-demo \
--template-body file://cloudformation/complete-demo-stack.yaml --capabilities CAPABILITY_NAMED_IAM ;\
aws --region $(AWS_REGION) cloudformation wait stack-$$COMMAND-complete --stack-name $(NAME)-complete-demo
delete-complete-demo:
aws --region $(AWS_REGION) cloudformation delete-stack --stack-name $(NAME)-complete-demo
aws --region $(AWS_REGION) cloudformation wait stack-delete-complete --stack-name $(NAME)-complete-demo