-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdeploy-4.sh
executable file
·134 lines (107 loc) · 3.54 KB
/
deploy-4.sh
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
#!/usr/bin/env bash
set -e
if [ -z $AWS_ACCOUNT_ID ]; then
echo "AWS_ACCOUNT_ID environment variable is not set."
exit 1
fi
if [ -z $AWS_DEFAULT_REGION ]; then
echo "AWS_DEFAULT_REGION environment variable is not set."
exit 1
fi
if [ -z $ENVOY_IMAGE ]; then
echo "ENVOY_IMAGE environment variable is not set to App Mesh Envoy, see https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html"
exit 1
fi
AWS_CLI_VERSION=$(aws --version 2>&1 | cut -d/ -f2 | cut -d. -f1)
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
PROJECT_NAME="testing-toolkit"
ECR_URL="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com"
ECR_IMAGE_PREFIX=${ECR_URL}/${PROJECT_NAME}
ecr_login() {
if [ $AWS_CLI_VERSION -gt 1 ]; then
aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | \
docker login --username AWS --password-stdin ${ECR_URL}
else
$(aws ecr get-login --no-include-email)
fi
}
deploy_images() {
ecr_login
for app in colorapp feapp; do
aws ecr describe-repositories --repository-name $PROJECT_NAME/$app >/dev/null 2>&1 || aws ecr create-repository --repository-name $PROJECT_NAME/$app >/dev/null
docker build -t ${ECR_IMAGE_PREFIX}/${app} ${DIR}/${app}
docker push ${ECR_IMAGE_PREFIX}/${app}
done
}
deploy_infra() {
stack_name="${PROJECT_NAME}-infra"
aws cloudformation deploy \
--no-fail-on-empty-changeset \
--stack-name $stack_name\
--template-file "${DIR}/infra.yaml" \
--capabilities CAPABILITY_IAM \
--parameter-overrides "ProjectName=${PROJECT_NAME}"
}
deploy_app() {
aws cloudformation deploy \
--no-fail-on-empty-changeset \
--stack-name "${PROJECT_NAME}-app" \
--template-file "${DIR}/app-4.yaml" \
--capabilities CAPABILITY_IAM \
--parameter-overrides "ProjectName=${PROJECT_NAME}" "EnvoyImage=${ENVOY_IMAGE}" "ColorAppImage=${ECR_IMAGE_PREFIX}/colorapp" "FrontAppImage=${ECR_IMAGE_PREFIX}/feapp"
}
delete_cfn_stack() {
stack_name=$1
aws cloudformation delete-stack --stack-name $stack_name
echo 'Waiting for the stack to be deleted, this may take a few minutes...'
aws cloudformation wait stack-delete-complete --stack-name $stack_name
echo 'Done'
}
delete_images() {
for app in colorapp feapp; do
echo "deleting repository..."
aws ecr delete-repository \
--repository-name $PROJECT_NAME/$app \
--force >/dev/null
done
}
confirm_service_linked_role() {
aws iam get-role --role-name AWSServiceRoleForAppMesh >/dev/null
[[ $? -eq 0 ]] ||
(echo "Error: no service linked role for App Mesh" && exit 1)
}
print_endpoint() {
echo "Public endpoint:"
prefix=$(aws cloudformation describe-stacks \
--stack-name="${PROJECT_NAME}-app" \
--query="Stacks[0].Outputs[0].OutputValue" \
--output=text)
echo "${prefix}"
}
deploy_stacks() {
echo "deploy images..."
deploy_images
echo "deploy infra..."
deploy_infra
echo "deploy app..."
deploy_app
confirm_service_linked_role
endpoint=$(print_endpoint)
python3 write_to_excel.py "$endpoint"
print_endpoint
}
delete_stacks() {
echo "delete app..."
delete_cfn_stack "${PROJECT_NAME}-app"
echo "delete infra..."
delete_cfn_stack "${PROJECT_NAME}-infra"
echo "delete images..."
delete_images
echo "all resources from this tutorial have been removed"
}
action=${1:-"deploy"}
if [ "$action" == "delete" ]; then
delete_stacks
exit 0
fi
deploy_stacks