본문 바로가기
Book/스프링 부트와 AWS 웹 서비스

[AWS] 배포 자동화 중 발생한 문제 해결

by 달의 조각 2023. 3. 2.

🤔 CodeDeploy에서 배포가 실패될 때

Github Actions와 S3, CodeDeploy를 연동하고 배포하는 과정에서 발생한 문제다.

Github Actions에서 빌드가 정상적으로 잘 수행되었고, S3에 파일이 잘 담기는 것을 확인했는데 CodeDeploy를 확인해 보면 아래와 같이 실패라고 확인됐다. 😧

상새 내용을 보니 아래와 같이 배포가 실패되었다는 안내가 떴다.

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

검색을 해 보니 이럴 때 로그를 확인하면 원인을 파악하기 쉽대서 AWS 공식 문서를 참고해서 로그 데이터를 찾았다.

[ec2-user@apupu /]$ cd var/log/aws/codedeploy-agent
[ec2-user@apupu codedeploy-agent]$ ll
total 192
-rw-r--r-- 1 root root 89685 Feb 28 16:10 codedeploy-agent.log
-rw-r--r-- 1 root root     0 Feb 28 13:49 codedeploy-agent.log.age
[ec2-user@apupu codedeploy-agent]$ vim codedeploy-agent.log

아래 로그를 보면 The specified key does not exist라는 에러 메시지를 확인할 수 있다.

2023-02-28 16:15:13 INFO  [codedeploy-agent(10311)]: [Aws::CodeDeployCommand::Client 200 0.030923 0 retries] put_host_command_complete(command_status:"Failed",diagnostics:{format:"JSON",payload:"{\"error_code\":5,\"script_name\":\"\",\"message\":\"The specified key does not exist.\",\"log\":\"\"}"},host_command_identifier:"eyJiYXRjaElkIjoiMDNmODk4OTVhNDhlZDdiYjM2N2VlZTNkMjg0YTk2NGMvcHVibGljMDAzIiwiZGVwbG95bWVudElkIjoiQ29kZURlcGxveS9hcC1ub3J0aGVhc3QtMi9wcm9kL29ycGhldXM6cHVibGljMDA1LzM3Nzc5NzY0OTY0ODpkLUNCUURXWUxUOSIsImhvc3RJZCI6ImFybjphd3M6ZWMyOmFwLW5vcnRoZWFzdC0yOjM3Nzc5NzY0OTY0ODppbnN0YW5jZS9pLTA2Y2U1NzI2YzM4MDkxYWRjIiwiY29tbWFuZElkIjoiQXBvbGxvRGVwbG95Q29udHJvbFNlcnZpY2V8YXJuOmF3czplYzI6YXAtbm9ydGhlYXN0LTI6Mzc3Nzk3NjQ5NjQ4Omluc3RhbmNlL2ktMDZjZTU3MjZjMzgwOTFhZGN8MnwwIiwiY29tbWFuZE5hbWUiOiJEb3dubG9hZEJ1bmRsZSIsImNvbW1hbmRJbmRleCI6MiwiYXR0ZW1wdEluZGV4IjoxfQ==")

검색을 해 보니 S3 버킷과의 연동 문제인 듯 싶어서 S3에 빌드 파일이 잘 들어가 있는지, 해당 파일에 하위 파일들이 잘 존재하는지 확인해 봤다. 이 부분에서는 문제가 없어서 main.yml 파일을 살펴 봤다.

마지막 라인에서 key=$S3_BUCKET_NAME/practice-deploy.zip을 경로까지 표시해서 생기는 문제였다. key=practice-deploy.zip로 수정했을 때에도 실패한 경우가 있었는데 yml 특성상 띄어쓰기 하나에도 문제가 되는 경우가 많았으므로 비슷한 이유가 아니었는지 생각이 든다. 그래서 한 줄로 코드를 변경하고 다시 push를 해 보니 배포에 성공했다! 🥰

    # 배포 그룹으로 애플리케이션 전송
    - name: Code Deploy
      run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME
          --deployment-config-name CodeDeployDefault.AllAtOnce
          --deployment-group-name $CODE_DEPLOY_GROUP_NAME
          --s3-location bucket=$S3_BUCKET_NAME, bundleType=zip, key=practice-deploy.zip
          --s3-location bucket=$S3_BUCKET_NAME, bundleType=zip, key=$S3_BUCKET_NAME/practice-deploy.zip
# 배포 그룹으로 애플리케이션 전송
- name: Code Deploy
  run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name $CODE_DEPLOY_GROUP_NAME --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=practice-deploy.zip

 

🤔 배포 자동화 시 CodeDeploy에서 배포 실패

위와 동일한 방법으로 로그를 확인해 보면 다음과 같은 에러 메시지를 확인할 수 있다. Script does not exist at specified location 잘못된 위치를 명시했다는 의미로 보여서 다시 꼼꼼하게 스크립트 파일을 살폈다.

문제는 Github Actions 설정을 담당하는 main.yml에서 필요한 파일들만 압축할 때, 프로젝트명.zip 파일로 압축을 했는데 배포 시에는 존재하지도 않는 다른 이름의 압축 파일을 열도록 해서 문제가 되었던 것이다. 동일하게 프로젝트명.zip으로 통일해서 해결했다!

2023-03-01 13:12:36 INFO  [codedeploy-agent(10311)]: [Aws::CodeDeployCommand::Client 200 0.028681 0 retries] put_host_command_complete(command_status:"Failed",diagnostics:{format:"JSON",payload:"{\"error_code\":5,\"script_name\":\"\",\"message\":\"Script does not exist at specified location: /opt/codedeploy-agent/deployment-root/759aa3b8-d4f0-4ab2-bad8-ac28f7aaad32/d-1OZR7LD4M/deployment-archive/deploy.sh\",\"log\":\"\"}"},host_command_identifier:"eyJiYXRjaElkIjoiYjBiZjQ4YThiNDY2N2VlNjlkM2I5YWVkZTdmMDNkNzQvcHVibGljMDAzIiwiZGVwbG95bWVudElkIjoiQ29kZURlcGxveS9hcC1ub3J0aGVhc3QtMi9wcm9kL29ycGhldXM6cHVibGljMDA0LzM3Nzc5NzY0OTY0ODpkLTFPWlI3TEQ0TSIsImhvc3RJZCI6ImFybjphd3M6ZWMyOmFwLW5vcnRoZWFzdC0yOjM3Nzc5NzY0OTY0ODppbnN0YW5jZS9pLTA2Y2U1NzI2YzM4MDkxYWRjIiwiY29tbWFuZElkIjoiQXBvbGxvRGVwbG95Q29udHJvbFNlcnZpY2V8YXJuOmF3czplYzI6YXAtbm9ydGhlYXN0LTI6Mzc3Nzk3NjQ5NjQ4Omluc3RhbmNlL2ktMDZjZTU3MjZjMzgwOTFhZGN8NXwwIiwiY29tbWFuZE5hbWUiOiJBZnRlckluc3RhbGwiLCJjb21tYW5kSW5kZXgiOjUsImF0dGVtcHRJbmRleCI6MX0=")

 

🤔 배포 자동화가 되지 않는 문제

배포 자동화 구성을 완료하고 정말 배포가 자동으로 되는지 화면 요소 하나를 수정한 뒤 push를 해 봤다. 그런데 바뀌지 않아서 로그를 확인해 보니 아래와 같이 이미 포트가 사용 중이라며 서버가 실행되지 않았다.

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

이 글을 참조하여 구동 중이었던 애플리케이션이 종료되지 않았다는 의미가 맞는지 아래 명령어를 통해 구동 중인 프로세스를 확인했다.

$ netstat -ntlp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -
tcp6       0      0 :::8080                 :::*                    LISTEN      1511/java
tcp6       0      0 :::22                   :::*                    LISTEN      -
$ pgrep -fl Apupu | grep java
1511 java

jar 파일이 아닌 java 파일이 실행 중인 것을 보니 배포 시 구동 중인 애플리케이션을 종료하는 코드가 잘못된 것이므로 deploy.sh 파일을 살폈다. 아래 코드의 두 번째 라인을 보면 구동 중인 jar 파일을 찾는다. java 파일로 애플리케이션이 동작 중이었으므로 이 부분을 잠시 java 파일을 바꾸었더니 배포 자동화가 정상적으로 이뤄졌다. 이후 해당 부분을 다시 jar로 변경했다.

왜 java 파일로 구동 중이었던 것인지는 더 찾아봐야겠다.

# 수행 중인 애플리케이션 프로세스 ID => 구동 중이면 종료하기 위함
CURRENT_PID=$(pgrep -fl $PROJECT_NAME | grep jar | awk '{print $1}')

echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi

echo "> 새 어플리케이션 배포"

댓글