본문 바로가기
AWS/Lambda

AWS SAM Local Testing 시 Docker desktop이 아닌 'minikube' 사용하기 (macOS 기준)

by 내꿈은한량 2023. 2. 1.

SAM 배포(deploy)를 하기 전에 개발중인 Lambda 나 API Gateway에 대한 테스트를 local에서 하고 싶을때는 다음과 같이 가능합니다.

# API Gateway, Lambda 실행
$ sam local start-api

# Lambda 함수를 지정해 한번 호출
$ sam local invoke "함수이름"

이와 같이 sam local 명령어를 이용할 때에는 docker가 구동상태에서 사용을 해야 하는데, Docker desktop이 지난 2021년 8월에 회사내 사용자는 유료구매후에 사용해야 한다고 라이센스 정책을 변경했습니다.

사용자들이 지속적으로 aws sam 개발팀에게 docker 대안으로 minikube를 사용할 수 있도록 요청하고 있던 상태에서 github의 mmidenhall 이라는 분이 aws sam local 명령어를 docker desktop이 아닌 minikube로 사용할 수 있도록 팁을 올려주어 관련 내용을 정리했습니다.

1. Docker Desktop 삭제

만약 homebrew cask로 Docker Desktop을 설치했었다면, 삭제해 줍니다.

$ brew uninstall docker

만약, Docker.dmg 로 직접 설치를 했다면 다음의 순서로 삭제해 줍니다.

  1. docker 를 실행한 후, 메뉴 막대에서 docker 아이콘을 클릭한 후 “Preferences”를 선택합니다.
  2. troubleshooting 아이콘을 클릭합니다.
  3. “Uninstall”을 클릭합니다.
  4. “응용 프로그램(applications)” 폴더안의 Docker 앱을 삭제(휴지통으로 이동)합니다.

* 이후 과정은 homebrew가 설치된 상태에서 진행해야 합니다.

2. ‘hyperkit’, ‘minikube’, ‘docker cli’ 설치

$ brew install hyperkit minikube docker​

3. minikube 시작

  • 개발중인 Lambda 코드에 접근하려면 minikube가 실행될 때 해당 코드가 위치하는 디렉토리를 마운트해주도록 합니다.
  • minikube를 이용해 kubernetes를 실행하지만, 실행 후에는 minikube pause 명령어를 이용하여, kubernetes는 멈추게하고 docker engine 만 실행을 유지한 상태로 사용할 수 있습니다.

아래 “my-repos” 부분은 여러분들의 sam project 위치로 변경해 주세요.

# minikube 시작
$ minikube start \
   --mount \
   --mount-string "my-repos:my-repos"
   
# docker 환경 정보를 적용
$ eval $(minikube docker-env)

# kubernetes 잠시 중지
$ minikube pause

참고로, minikube docker-env 명령어를 직접 실행하면 다음과 같은 내용이 출력됩니다.

$ minikube docker-env

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.205.7:2376"
export DOCKER_CERT_PATH="/Users/yulisys/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"
 

4. sam local start-api / sam local invoke 실행해 보기

sam local 명령어를 실행하여 local에서 api gateway를 실행하거나, Lambda 함수를 직접 실행해 볼 수 있습니다.

이를 위해 sam local 명령어에 2가지 추가 CLI 옵션을 추가해야 합니다.

  1. --container-host <minikube ip>
  2. --container-host-interface 0.0.0.0

다음은 sam local start-api 를 실행하는 명령어지만, sam local invoke 명령을 사용할 때도 동일한 옵션을 사용할 수 있습니다.

$ sam local start-api --container-host $(minikube ip) --container-host-interface 0.0.0.0 ...

Troubleshooting

  1. Container runtime이 docker가 아닌 다른 것(containerd, cri-o 등)으로 구동될 경우.

만약, container runtime을 docker가 아닌 다른 runetime(containerd 혹은 cri-o)를 사용했었다면, --container-runtime 옵션을 이용하여 다시 docker로 변경해 주어야 합니다.

$ minikube start \
   --mount \
   --mount-string "my-repos:my-repos"
   --container-runtime docker

2. minikube가 정상 구동이 안될 경우.

알수 없는 이유로 minikube 구동이 안된다면, 로컬 kubernetes 클러스터를 삭제한 후 다시 시도해 보세요.

# 로컬 kubernetes 클러스터 삭제
$ minikube delete