Serverless Framework를 이용한 작업을 진행하던 중, 갑작스럽게 배포가 진행되지 않는 상황이 발생하였다. 특이하게도 Nest.js 프로젝트의 코드 작업을 하지않고, Serverless의 설정값을 변경하던 중 발생하게 된 상황이라 더욱 이상하게 느껴졌다. 어떤 이유로 이런 에러가 발생하였는지 확인해보고, 어떤 해결 방안이 존재하는지 파헤쳐보도록 하겠다.
문제 상황
Nest.js 프로젝트의 코드 작업을 마무리하고, serverless.yml 파일에 정의된 속성값들을 수정하여 Lambda의 경량화를 진행하고 있던 와중 Service를 AWS Lambda에 배포하려 할 때, Stack prac-websocket-dev failed to deploy 라는 에러가 발생하였다.
상세한 에러 메시지를 확인하기 위해 deploy 명령어에 --verbose 옵션을 추가하였고, 위와 같은 에러 메시지가 출력되는 것을 확인하였다. "Creating new change set." 과정 이후 에러가 발생하였는데, 해당하는 에러 메시지로 대략적인 작업 내역은 확인할 수 있었지만, 명확한 작업 내역을 확인하기 힘들었으므로 좀 더 상세하게 배포 과정에 분석이 필요해 보였다.
그렇다면, Serverless가 서비스를 배포할 때 어떤 순서로 프로젝트 파일을 정리하여 AWS Lambda에 서비스를 배포하는지 차근차근 파헤쳐보도록 하겠다.
Serverless Deploy Pipeline
Serverless는 Local 환경에 존재하는 프로젝트 파일을 아래와 같은 순서로 AWS Lambda에 배포한다.
- Serverless를 실행한 대상 프로젝트를 <SERVICE_NAME>.zip 형식으로 압축하고, AWS CloudFormation Template 파일을 Local에 생성한다.
- serverless.yml 파일에 정의된 속성값을 바탕으로 AWS CloudFormation에 Stack을 생성한다.
- AWS CloudFormation에 Stack을 생성한 이후, serverless.yml 파일에 정의된 속성에 따라 AWS Lambda, API Gateway, DynamoDB 등 다양한 AWS 리소스를 Stack Event에 추가하며 생성한다.
- Lambda Function을 생성할 때, serverless.yml 파일에 정의된 속성에 따라 Handler 및 Events 를 관리 및 연결한다.
실제로는 S3를 생성하고, serverless-state 파일과 프로젝트 파일을 업로드하는 등 다양한 작업을 수행하지만, 간략하게 어떤 과정을 거쳐 Lambda가 배포되는지 확인해보았다. 결국 Serverless는 AWS CloudFormation Stack을 이용하여 다양한 리소스를 생성하게 되는데, 어떻게 AWS 리소스들을 생성할 수 있는걸까?
AWS CloudFormation Stack
AWS CloudFormation Stack은 AWS 리소스를 관리하는 단위이다. Stack을 이용하여 AWS 리소스를 생성, 수정, 삭제 등 다양한 리소스를 관리할 수 있게 된다.
Deploy Pipeline에서 본 것과 같이 serverless.yml 파일의 속성값을 바탕으로 AWS CloudFormation의 Stack이 생성된다. Stack은 AWS 리소스를 생성하기 위해 사용되는 것 이므로, 현재 AWS의 어떤 리소스를 생성 중 인지, 수정 중 인지 알 수 있게 될 것이다.
그렇다면, Serverless의 어느 배포 과정에서 오류가 발생하였는지 확인하기 위해 AWS CloudFormation에 생성된 Stack의 상태를 확인하여, 발생한 에러 상황을 더욱 구체화하도록 하자.
REVIEW_IN_PROGRESS 상태는 템플릿 또는 리소스 없이 예상 StackId를 사용하여 하나 이상의 스택을 생성하고 있는 과정이며, Stack의 생성 요청을 검토하는 상태이다. Stack이 정상적으로 생성되지 않은 상태이므로, 내부에는 아무런 소스 데이터를 가지고 있지 않다.
Serverless에서 업로드된 AWS CloudFormation의 Stack을 생성하기 전 초기화하는 과정에서 멈춰 있는 상태로 확인할 수 있다. 즉, serverless.yml 파일에서 설정한 속성값들이 AWS CloudFormation에 업로드되지 않은 상태로 프로젝트가 배포 과정에서 실패했다는 것을 인지할 수 있게 되었다.
발생 원인
Serverless Framework의 프로젝트를 배포하는 과정에서 serverless-cli의 비정상 종료가 발생하게 될 경우, AWS CloudFormation의 Stack이 정상적으로 생성되지 않았고, 다시 배포를 진행하려 할 때, 정상적인 Stack을 참조할 수 없으므로 발생하게 되었다.
해결 방안
AWS CloudFormation Stack을 삭제하거나 "serverless remove" 명령어로 해당 프로젝트의 상태를 초기화한 이후, "serverless deploy"를 실행하여 프로젝트를 다시 배포하도록 한다.
에러 재현하기
발생 원인과 해결 방안을 확인하였지만, 마지막으로 에러 발생의 이유가 생각한 것이 맞는지 검증해보고자 한다.
"serverless deploy" 명령어를 입력하여, Serverless 배포에 가장 많은 시간이 소모되는 "Creating CloudFormation stack" 과정에서 강제로 종료한 이후, 다시 배포를 진행하도록 하겠다.
생각한 것과 동일하게, Stack prac-websocket-dev failed to deploy 에러 메시지가 출력된 것을 확인할 수 있게 되었다.
결론
처음 발생한 문제는 "AWS CloudFormation Stack이 정상적으로 생성되지 않은 문제"이었지만, 결론적으로 "serverless-cli를 배포 중 강제 종료" 하게 되어 발생하게 된 것이 원인이었다. 정말 간단하고, 누구든지 할 수 있는 실수로 인하여 Serverless의 배포 파이프라인을 분석하고, AWS CloudFormation에 대한 개념과 동작 순서를 확인하게 되었다.
'Infrastructure > Serverless Framework' 카테고리의 다른 글
[Serverless] Open Source Contributor의 첫걸음 (0) | 2023.04.09 |
---|