1- name : EC2-REBOOT
1+ name : EC2-RECOVERY
22
33on :
44 workflow_dispatch :
55
66jobs :
7- reboot :
8- name : Reboot EC2 Instance
7+ recover :
8+ name : Recover Server
99 runs-on : ubuntu-latest
1010
1111 steps :
@@ -16,55 +16,70 @@ jobs:
1616 aws-secret-access-key : ${{ secrets.AWS_PROD_SECRET_KEY }}
1717 aws-region : ap-northeast-2
1818
19- - name : Find EC2 instance
20- id : find-ec2
19+ - name : Check IAM identity
2120 run : |
22- echo "=== 모든 EC2 인스턴스 조회 ==="
23- aws ec2 describe-instances \
24- --query "Reservations[].Instances[].[InstanceId, PublicIpAddress, State.Name, Tags[?Key=='Name'].Value | [0]]" \
25- --output table
21+ echo "=== IAM 정보 확인 ==="
22+ aws sts get-caller-identity || echo "STS 호출 실패"
2623
27- echo ""
28- echo "=== Public IP 3.35.195.11 으로 검색 ==="
29- INSTANCE_ID=$(aws ec2 describe-instances \
30- --filters "Name=ip-address,Values=3.35.195.11" \
31- --query "Reservations[].Instances[].InstanceId" \
32- --output text)
24+ - name : Check CodeDeploy deployments
25+ run : |
26+ echo "=== 최근 배포 상태 확인 ==="
27+ aws deploy list-deployments \
28+ --application-name runnect-prod-codedeploy \
29+ --deployment-group-name runnect-prod-codedeploy-group \
30+ --include-only-statuses "Succeeded,Failed,InProgress" \
31+ --query "deployments[:3]" \
32+ --output text || echo "배포 목록 조회 실패"
3333
34- if [ -z "$INSTANCE_ID" ]; then
35- echo "Public IP로 찾지 못함. 실행 중인 모든 인스턴스 확인..."
36- INSTANCE_ID=$(aws ec2 describe-instances \
37- --filters "Name=instance-state-name,Values=running,stopped" \
38- --query "Reservations[].Instances[].InstanceId" \
39- --output text)
40- fi
34+ LATEST=$(aws deploy list-deployments \
35+ --application-name runnect-prod-codedeploy \
36+ --deployment-group-name runnect-prod-codedeploy-group \
37+ --query "deployments[0]" \
38+ --output text 2>/dev/null)
4139
42- echo "INSTANCE_ID=$INSTANCE_ID" >> $GITHUB_OUTPUT
43- echo "찾은 Instance ID: $INSTANCE_ID"
40+ if [ -n "$LATEST" ] && [ "$LATEST" != "None" ]; then
41+ echo ""
42+ echo "=== 최신 배포 상세 ==="
43+ aws deploy get-deployment --deployment-id "$LATEST" \
44+ --query "deploymentInfo.{status:status, createTime:createTime, completeTime:completeTime, errorInfo:errorInformation}" \
45+ --output json
46+ fi
4447
45- - name : Reboot EC2 instance
48+ - name : Trigger new CodeDeploy deployment
4649 run : |
47- INSTANCE_ID="${{ steps.find-ec2.outputs.INSTANCE_ID }}"
48- if [ -n "$INSTANCE_ID" ]; then
49- echo "EC2 리부트 시작: $INSTANCE_ID"
50- aws ec2 reboot-instances --instance-ids $INSTANCE_ID
51- echo "리부트 명령 전송 완료!"
50+ echo "=== 새 CodeDeploy 배포 트리거 ==="
51+ DEPLOYMENT_ID=$(aws deploy create-deployment \
52+ --application-name runnect-prod-codedeploy \
53+ --deployment-group-name runnect-prod-codedeploy-group \
54+ --file-exists-behavior OVERWRITE \
55+ --s3-location bucket=runnect-prod-bucket,bundleType=zip,key=runnect_prod_server.zip \
56+ --region ap-northeast-2 \
57+ --query "deploymentId" \
58+ --output text)
5259
53- echo "60초 대기 후 상태 확인..."
54- sleep 60
60+ echo "Deployment ID: $DEPLOYMENT_ID"
5561
56- aws ec2 describe-instances \
57- --instance-ids $INSTANCE_ID \
58- --query "Reservations[].Instances[].[InstanceId, PublicIpAddress, State.Name]" \
59- --output table
60- else
61- echo "ERROR: 인스턴스를 찾을 수 없습니다!"
62- exit 1
63- fi
62+ echo "배포 완료 대기 (최대 5분)..."
63+ for i in $(seq 1 30); do
64+ STATUS=$(aws deploy get-deployment --deployment-id "$DEPLOYMENT_ID" \
65+ --query "deploymentInfo.status" --output text 2>/dev/null)
66+ echo "[$i/30] Status: $STATUS"
67+
68+ if [ "$STATUS" = "Succeeded" ]; then
69+ echo "배포 성공!"
70+ break
71+ elif [ "$STATUS" = "Failed" ] || [ "$STATUS" = "Stopped" ]; then
72+ echo "배포 실패! 상세 정보:"
73+ aws deploy get-deployment --deployment-id "$DEPLOYMENT_ID" \
74+ --query "deploymentInfo.errorInformation" --output json
75+ break
76+ fi
77+ sleep 10
78+ done
6479
6580 - name : Health check
6681 run : |
67- echo "서버 헬스 체크 시작 (최대 3분 대기)..."
82+ echo "서버 헬스 체크 (최대 3분 대기)..."
6883 for i in $(seq 1 18); do
6984 HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 http://3.35.195.11/actuator/health 2>/dev/null || echo "000")
7085 echo "[$i/18] HTTP: $HTTP_CODE"
7489 fi
7590 sleep 10
7691 done
77- echo "WARNING: 서버가 아직 응답하지 않습니다. EC2는 리부트되었지만 앱 시작에 시간이 더 필요할 수 있습니다."
92+
93+ echo ""
94+ echo "=== 포트별 체크 ==="
95+ for PORT in 80 8081 8082; do
96+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 http://3.35.195.11:$PORT/actuator/health 2>/dev/null || echo "000")
97+ echo "Port $PORT: HTTP $HTTP_CODE"
98+ done
99+ echo "WARNING: 서버가 아직 응답하지 않습니다."
0 commit comments