[AWS 활용하기] AWS SAM(Serverless Application Model) 로컬 디버깅 환경 구축하기

2023. 4. 12. 19:26개발을 파헤치다/서버 인프라

반응형

 

AWS SAM은 특별히 서버를 관리하지 않아도 되기 때문에 굉장히 편리합니다. 하지만 API 로직을 개발할 때 테스트 및 디버그가 상당히 곤란한데요. 이런 부분을 보완하기 위해 AWS에서는 Toolkit이라는 플러그인을 지원합니다.
Jetbrain사의 IDE 대부분을 지원하니 플러그인을 찾아 설치만 하면 됩니다.

AWS Toolkit은 SAM 어플리케이션을 로컬 환경에서 테스트 및 디버깅할 수 있도록 도와줍니다.
이를 위해 내부적으로 Docker를 사용하는데요. 그래서 Docker가 필수적으로 설치가 되어있어야 합니다.





https://docs.docker.com/desktop/install/mac-install/


위 링크를 통해 Docker Desktop을 설치해 줍니다.

 

Docker를 통해 SAM의 template.yaml에 정의된 환경을 구성하게 되는데요.
SAM을 빌드하는 과정에서 빌드 디렉터리를 Docker에서 사용할 수 있도록 마운트 하는 과정이 존재합니다.
이때 호스트와 파일 공유가 되어있지 않으면 마운트 에러가 발생할 수 있는데요. 이것을 방지하기 위해 Docker의 File Sharing 설정에 Application을 추가해 줍니다.


이제 PyCharm의 설정 > Plugins에서 aws toolkit을 검색한 뒤 설치해 줍니다.


기존에 AWS 인증 관련 설정이 되어있으면 위에서 보는 것과 같이 리전과 인증정보(액세스 키 정보)가 자동으로 설정됩니다.




Toolkit을 활용하면 Lambda 함수를 로컬환경에서 실행 / 디버깅을 할 수 있습니다.
SAM 프로젝트의 template.yaml 파일로 이동하면 AWS::Serverless::Function으로 정의된 부분에 위와 같이 초록색 화살표가 뜨는 것을 확인할 수 있습니다. 이것을 누르면 Run/Debug 두 가지 메뉴가 나옵니다.
둘 중 하나를 누르게 되면 환경 설정창이 나오게 됩니다.

SAM 빌드와 event관련 내용을 설정할 수 있습니다.
Configuration > From template을 선택하면 자동으로 SAM 프로젝트의 template.yaml 파일이 설정됩니다.
아래에 Input 부분에 테스트를 원하는 값을 지정해 줍니다.
API 요청에 대한 Lambda 함수 로직을 테스트하기 때문에 AWS API Gatewya Proxy 템플릿을 선택한 뒤
알맞은 Method와 Parameter, Body 값을 적용하면 됩니다.

 

 

makefile을 통한 Custom Build 구성

 

SAM 프로젝트에서 외부 패키지를 쓰기 위해서는 Lambda Layer를 활용하면 됩니다.
하지만 프로젝트 구조상 Lambda 함수들에 공통적으로 사용되는 Utility 클래스들 같은 경우 따로 관리하는 경우가 많습니다. 이럴 때에는 Lambda 함수가 빌드될 때 해당 Utility 클래스들도 포함시켜줘야 합니다. 그렇지 않으면 존재하지 않는 모듈 에러가 발생하게 됩니다. 로컬 환경이 빌드될 때 이 작업을 해줘야 정상적으로 Lambda 함수가 동작하는데요. makefile을 활용해서 이 문제를 해결할 수 있습니다.

빌드할 때 makefile로 특정 로직을 처리해 주려면 SAM 프로젝트의 template.yaml을 위와 같이 수정해줘야 합니다.
실행/디버그 하려는 Lambda 함수의 Properties > Runtime이 설정되어있어야 하고 Metadata의 BuildMethod에 makefile이라고 명시해 줍니다.

Makefile이 정상적으로 실행되려면 반드시 Lambda 함수의 CodeUri에 해당되는 디렉터리에 파일이 존재해야 합니다. 위에서 보이는 것처럼 Makefile을 올바른 위치에 생성해 줍니다.

이제 Makefile에 필요한 명령어를 작성하면 되는데요. 그 이전에 해줘야 할 것이 있습니다.
명령어를 작성한 뒤 실행해 보면 SAM 빌드과정에 아래와 같이 에러가 발생합니다.
이 에러는 Makefile에 tab이 아닌 space를 썼을 때 발생하는 에러인데요. 이 에러가 발생하는 이유는 PyCharm에서 기본적으로 Makefile 형식을 지원하지 않기 때문입니다. 따라서 올바른 Makefile 작성을 위해 플러그인을 설치해줘야 합니다.

설정 > Plugins에서 makefile을 검색한 뒤 Jetbrain에서 공식으로 제공하는 플러그인을 설치합니다. 

이제 Makefile을 작성합니다.

build-[template.yaml에 정의된 타겟명]:
    # 빌드하려는 Lambda Function의 FunctionName으로 지정해줘야 함
    $(eval $@TARGET_FUNC_NAME = [lambda function이 위치한 디렉토리 이름])

    # Lambda Function이 빌드되는 디렉토리 위치
    $(eval $@BUILD_DIR = $(ARTIFACTS_DIR))
    # 현재 프로젝트의 Root 디렉토리 위치
    $(eval $@PROJECT_DIR = $(PWD)/../)

    # Build된 Lambda 함수에 LIFIT Common 파일들 import를 위해 dir 생성 및 파일 복사
    mkdir $($@BUILD_DIR)/lifit_common
    cp -r $($@PROJECT_DIR)/lifit_common/* $($@BUILD_DIR)/lifit_common
    # 타겟 API의 Lambda Function 파일을 AWS SAM 빌드 디렉토리로 복사
    cp $($@PROJECT_DIR)/aws_lambdas/$($@TARGET_FUNC_NAME)/lambda_function.py $($@BUILD_DIR)

Makefile을 생성할 때에는 먼저 build-타깃명을 적어줘야 합니다. 여기에서 타깃명은 template.yaml에 정의된 이름을 얘기합니다. 위의 Makefile은 특정 위치에 있는 라이브러리 클래스 파일들과 테스트할 Lambda 함수 파일을 빌드한 Lambda 함수 디렉터리에 복사하는 작업을 수행합니다. 

프로젝트에 많은 Lambda 함수들이 존재할 텐데 해당 함수들을 테스트하기 위해서는 이렇게 Makefile을 만들어줘야 합니다. 그리고 Makefile에 정의된 변수들에 알맞은 값을 넣어줘야 합니다.




이렇게 설정한 뒤 실행/디버깅을 누르면 SAM 어플리케이션이 빌드됩니다. 빌드된 후 해당 Lambda 함수가 빌드된 디렉터리에 함수 실행을 위한 코드들이 모두 복사됩니다. 그리고 나서는 설정된 input값으로 이벤트가 들어가고 정상적으로 실행/디버깅을 진행할 수 있습니다.

반응형