-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·259 lines (232 loc) · 7.01 KB
/
deploy.sh
File metadata and controls
executable file
·259 lines (232 loc) · 7.01 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
#!/usr/bin/env bash
set -e
# Helper functions
function print_usage() {
echo "Usage: $0 [OPTIONS]"
echo "Options:"
echo " --deployment-mode MODE Set deployment mode (monolith|microservices)"
echo " --deployment-pattern PATTERN Set deployment pattern (single_instance|multi_az|multi_region)"
echo " --aws-region REGION Set AWS region"
echo " --instance-type TYPE Set EC2 instance type"
echo " --key-name KEY Set SSH key name for EC2 instances"
echo " --certificate-path PATH Path to custom TLS certificate (optional)"
echo " --private-key-path PATH Path to custom TLS private key (optional)"
echo " --github-token TOKEN GitHub Personal Access Token for private repository access"
echo " --ssh-key-path PATH Path to SSH private key for instance access"
echo " --help Print this help message"
}
function generate_ssh_key() {
local key_dir="$1"
local key_name="$2"
mkdir -p "$key_dir"
ssh-keygen -t rsa -b 4096 -f "${key_dir}/${key_name}" -N "" -C "flappygo-deployment-key"
chmod 600 "${key_dir}/${key_name}"
chmod 644 "${key_dir}/${key_name}.pub"
echo "${key_dir}/${key_name}"
}
function check_existing_ssh_key() {
local key_path="$(dirname "$0")/certs/ssh_key"
if [[ -f "$key_path" ]]; then
echo "$key_path"
return 0
fi
return 1
}
# Default values
DEPLOYMENT_MODE="monolith"
DEPLOYMENT_PATTERN="single_instance"
AWS_REGION="us-east-1"
USE_LOAD_BALANCER=false
INSTANCE_TYPE="t2.micro"
KEY_NAME=""
DOMAIN_NAME=""
CERTIFICATE_PATH=""
PRIVATE_KEY_PATH=""
USE_OWN_CERTIFICATES=false
GITHUB_TOKEN=""
SSH_KEY_PATH=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
--deployment-mode)
DEPLOYMENT_MODE="$2"
shift 2
;;
--deployment-pattern)
DEPLOYMENT_PATTERN="$2"
shift 2
;;
--aws-region)
AWS_REGION="$2"
shift 2
;;
--instance-type)
INSTANCE_TYPE="$2"
shift 2
;;
--key-name)
KEY_NAME="$2"
shift 2
;;
--certificate-path)
CERTIFICATE_PATH="$2"
USE_OWN_CERTIFICATES=true
shift 2
;;
--private-key-path)
PRIVATE_KEY_PATH="$2"
USE_OWN_CERTIFICATES=true
shift 2
;;
--github-token)
GITHUB_TOKEN="$2"
shift 2
;;
--ssh-key-path)
SSH_KEY_PATH="$2"
shift 2
;;
--help)
print_usage
exit 0
;;
*)
echo "Unknown option: $1"
print_usage
exit 1
;;
esac
done
# Validate deployment mode
if [[ "$DEPLOYMENT_MODE" != "monolith" && "$DEPLOYMENT_MODE" != "microservices" ]]; then
echo "Error: Deployment mode must be 'monolith' or 'microservices'"
exit 1
fi
# Validate deployment pattern
if [[ "$DEPLOYMENT_PATTERN" != "single_instance" && "$DEPLOYMENT_PATTERN" != "multi_az" && "$DEPLOYMENT_PATTERN" != "multi_region" ]]; then
echo "Error: Deployment pattern must be 'single_instance', 'multi_az', or 'multi_region'"
exit 1
fi
# Check terraform is installed
if ! command -v terraform &> /dev/null; then
echo "Error: Terraform is not installed"
exit 1
fi
# Initialize terraform
cd "$(dirname "$0")/terraform"
terraform init
# Check for existing SSH key or generate new one
if [[ -z "$SSH_KEY_PATH" ]]; then
if FOUND_KEY=$(check_existing_ssh_key); then
echo "Found existing SSH key at: $FOUND_KEY"
SSH_KEY_PATH="$FOUND_KEY"
else
echo "No SSH key provided or found, generating one..."
CERTS_DIR="$(dirname "$0")/certs"
mkdir -p "$CERTS_DIR"
SSH_KEY_PATH=$(generate_ssh_key "$CERTS_DIR" "ssh_key")
fi
KEY_NAME="flappygo-key2"
fi
# Validate SSH key
if [[ ! -f "$SSH_KEY_PATH" ]]; then
echo "Error: SSH key file not found: $SSH_KEY_PATH"
exit 1
fi
if [[ "$(stat -c %a "$SSH_KEY_PATH")" != "600" ]]; then
echo "Warning: SSH key file permissions should be 600. Fixing..."
chmod 600 "$SSH_KEY_PATH"
fi
# Generate tfvars file
cat > terraform.tfvars << EOF
deployment_mode = "$DEPLOYMENT_MODE"
deployment_pattern = "$DEPLOYMENT_PATTERN"
aws_region = "$AWS_REGION"
instance_type = "$INSTANCE_TYPE"
use_own_certificates = $USE_OWN_CERTIFICATES
github_token = "${GITHUB_TOKEN}"
ssh_private_key_path = "${SSH_KEY_PATH}"
EOF
# Add key name if provided
if [[ -n "$KEY_NAME" ]]; then
echo "key_name = \"$KEY_NAME\"" >> terraform.tfvars
fi
# Add certificate paths if provided
if [[ -n "$CERTIFICATE_PATH" ]]; then
echo "certificate_path = \"$CERTIFICATE_PATH\"" >> terraform.tfvars
fi
# Add certificate path if provided
if [[ -n "$CERTIFICATE_PATH" ]]; then
echo "certificate_path = \"$CERTIFICATE_PATH\"" >> terraform.tfvars
fi
# Add private key path if provided
if [[ -n "$PRIVATE_KEY_PATH" ]]; then
echo "private_key_path = \"$PRIVATE_KEY_PATH\"" >> terraform.tfvars
fi
# Print deployment summary
echo "Deploying FlappyGo! with the following configuration:"
echo " Deployment Mode: $DEPLOYMENT_MODE"
echo " Deployment Pattern: $DEPLOYMENT_PATTERN"
echo " AWS Region: $AWS_REGION"
echo " Instance Type: $INSTANCE_TYPE"
if [[ -n "$KEY_NAME" ]]; then
echo " SSH Key Name: $KEY_NAME"
fi
if [[ "$USE_OWN_CERTIFICATES" == true ]]; then
echo " Using Custom Certificates: Yes"
echo " Certificate Path: $CERTIFICATE_PATH"
echo " Private Key Path: $PRIVATE_KEY_PATH"
else
echo " Using Custom Certificates: No (will generate self-signed)"
fi
if [[ -n "$GITHUB_TOKEN" ]]; then
echo " Using GitHub Token: Yes"
fi
if [[ -n "$CERTIFICATE_PATH" ]]; then
echo " Certificate Path: $CERTIFICATE_PATH"
fi
if [[ -n "$PRIVATE_KEY_PATH" ]]; then
echo " Private Key Path: $PRIVATE_KEY_PATH"
fi
if [[ -n "$SSH_KEY_PATH" ]]; then
if [[ "$SSH_KEY_PATH" == *"/certs/ssh_key" ]]; then
echo " SSH Key: Auto-generated (saved to $SSH_KEY_PATH)"
else
echo " SSH Key Path: $SSH_KEY_PATH"
fi
fi
# Confirm deployment
read -p "Proceed with deployment? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Deployment cancelled."
exit 0
fi
# Run terraform plan
terraform plan -var-file=terraform.tfvars -out=tfplan
# Confirm terraform plan
read -p "Apply the above plan? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Deployment cancelled."
exit 0
fi
# Write the deploy time to a file
DEPLOY_TIME_FILE="deploy_time.txt"
echo $(date +"%Y%m%d_%H%M%S") > "$DEPLOY_TIME_FILE"
echo "Deployment time recorded in $DEPLOY_TIME_FILE"
# write deploy type to a file
DEPLOY_TYPE_FILE="deploy_type.txt"
echo "${DEPLOYMENT_MODE}_${DEPLOYMENT_PATTERN}" > $DEPLOY_TYPE_FILE
# Apply terraform plan
terraform apply tfplan
# Show outputs
echo "============================================================"
echo "Deployment completed successfully!"
echo "Note: It may take a few minutes for the instances to be fully initialized."
echo "Service endpoints:"
terraform output -json service_endpoints
echo "============================================================"
echo "To connect to instances using SSH:"
echo "ssh -i \"$SSH_KEY_PATH\" ec2-user@<instance_public_dns>"
echo "============================================================"