Skip to content

Commit 59f62ac

Browse files
committed
chore: EC2 복구 워크플로우 - CodeDeploy 재배포
1 parent 7ec068a commit 59f62ac

1 file changed

Lines changed: 64 additions & 42 deletions

File tree

.github/workflows/ec2-reboot.yml

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
name: EC2-REBOOT
1+
name: EC2-RECOVERY
22

33
on:
44
workflow_dispatch:
55

66
jobs:
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"
@@ -74,4 +89,11 @@ jobs:
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

Comments
 (0)