1- name : EC2-RECOVERY
1+ name : EC2-DIAGNOSTIC
22
33on :
44 workflow_dispatch :
55
66jobs :
7- recover :
8- name : Recover Server
7+ diagnose :
8+ name : Diagnose EC2 Instance
99 runs-on : ubuntu-latest
1010
1111 steps :
@@ -16,84 +16,81 @@ jobs:
1616 aws-secret-access-key : ${{ secrets.AWS_PROD_SECRET_KEY }}
1717 aws-region : ap-northeast-2
1818
19- - name : Check IAM identity
19+ - name : Check IAM identity and permissions
2020 run : |
21- echo "=== IAM 정보 확인 ==="
22- aws sts get-caller-identity || echo "STS 호출 실패"
21+ echo "=== IAM 정보 ==="
22+ aws sts get-caller-identity 2>&1 || true
2323
24- - name : Check CodeDeploy deployments
24+ echo ""
25+ echo "=== IAM 정책 확인 ==="
26+ ACCOUNT=$(aws sts get-caller-identity --query Account --output text 2>/dev/null)
27+ USER_NAME=$(aws sts get-caller-identity --query Arn --output text 2>/dev/null | awk -F'/' '{print $NF}')
28+ echo "Account: $ACCOUNT"
29+ echo "User: $USER_NAME"
30+
31+ echo ""
32+ echo "=== Attached Policies ==="
33+ aws iam list-attached-user-policies --user-name "$USER_NAME" 2>&1 || echo "IAM 정책 조회 권한 없음"
34+
35+ echo ""
36+ echo "=== Inline Policies ==="
37+ aws iam list-user-policies --user-name "$USER_NAME" 2>&1 || echo "IAM 인라인 정책 조회 권한 없음"
38+
39+ - name : CodeDeploy deployment group info
2540 run : |
26- echo "=== 최근 배포 상태 확인 ==="
27- aws deploy list-deployments \
41+ echo "=== 배포 그룹 상세 ==="
42+ aws deploy get-deployment-group \
2843 --application-name runnect-prod-codedeploy \
2944 --deployment-group-name runnect-prod-codedeploy-group \
30- --include-only-statuses "Succeeded,Failed,InProgress" \
31- --query "deployments[:3]" \
32- --output text || echo "배포 목록 조회 실패"
45+ --output json 2>&1 || echo "배포 그룹 조회 실패"
3346
47+ - name : Latest deployment details
48+ run : |
49+ echo "=== 최근 배포 목록 ==="
3450 LATEST=$(aws deploy list-deployments \
3551 --application-name runnect-prod-codedeploy \
3652 --deployment-group-name runnect-prod-codedeploy-group \
3753 --query "deployments[0]" \
3854 --output text 2>/dev/null)
55+ echo "Latest deployment: $LATEST"
3956
4057 if [ -n "$LATEST" ] && [ "$LATEST" != "None" ]; then
4158 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
59+ echo "=== 배포 상세 ==="
60+ aws deploy get-deployment --deployment-id "$LATEST" --output json 2>&1
61+
62+ echo ""
63+ echo "=== 배포 인스턴스 목록 ==="
64+ aws deploy list-deployment-instances --deployment-id "$LATEST" --output json 2>&1 || echo "인스턴스 목록 조회 실패"
65+
66+ echo ""
67+ echo "=== 배포 타겟 상세 ==="
68+ INSTANCE_IDS=$(aws deploy list-deployment-instances --deployment-id "$LATEST" --query "instancesList" --output text 2>/dev/null)
69+ for INST in $INSTANCE_IDS; do
70+ echo "--- Instance: $INST ---"
71+ aws deploy get-deployment-instance --deployment-id "$LATEST" --instance-id "$INST" --output json 2>&1 || echo "조회 실패"
72+ done
4673 fi
4774
48- - name : Trigger new CodeDeploy deployment
75+ - name : Check SSM access
4976 run : |
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)
59-
60- echo "Deployment ID: $DEPLOYMENT_ID"
61-
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
79-
80- - name : Health check
77+ echo "=== SSM 인스턴스 목록 ==="
78+ aws ssm describe-instance-information --output json 2>&1 || echo "SSM 권한 없음"
79+
80+ - name : Try EC2 describe (may fail)
8181 run : |
82- echo "서버 헬스 체크 (최대 3분 대기)..."
83- for i in $(seq 1 18); do
84- 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")
85- echo "[$i/18] HTTP: $HTTP_CODE"
86- if [ "$HTTP_CODE" = "200" ]; then
87- echo "서버 복구 완료!"
88- exit 0
89- fi
90- sleep 10
91- done
82+ echo "=== EC2 인스턴스 조회 시도 ==="
83+ aws ec2 describe-instances --output json 2>&1 || echo "EC2 권한 없음"
9284
9385 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: 서버가 아직 응답하지 않습니다."
86+ echo "=== Elastic IP 조회 시도 ==="
87+ aws ec2 describe-addresses --public-ips 3.35.195.11 2>&1 || echo "Elastic IP 조회 실패"
88+
89+ echo ""
90+ echo "=== 보안 그룹 조회 시도 ==="
91+ aws ec2 describe-security-groups 2>&1 || echo "보안 그룹 조회 실패"
92+
93+ - name : Check S3 bucket
94+ run : |
95+ echo "=== S3 버킷 확인 ==="
96+ aws s3 ls s3://runnect-prod-bucket/ 2>&1 || echo "S3 접근 실패"
0 commit comments