개요
AWS Cloud Service를 사용하면 우리가 직접 물리적 서버를 구축할 필요없이 확장성있고, 탄력적이고 안전한 고가용성 애플리케이션을 구축할수 있다. 이런 편리함 뒤에는 당연히 비용이 있고, 사용하는 만큼 비용을 내야하기 때문에, 서비스 운영으로 사용하는 비용은 당연한 지출이지만, 테스트를 위해서 돈을 추가로 지불하는것에는 부담이 있을것이다. 이러한 니즈를 해결하는 여러 솔루션이 있는데 그중 하나가 LocalStack이다.
LocalStack은 AWS Cloud Service에서 제공하는 기능과 API를 그대로 mocking하여 테스트 및 개발에 활용 가능하도록 한다. 그리고 아래와 같은 개발/테스트/배포 프로세스를 제안한다.
- 개발: 로컬 개발 머신에서 localstack으로 AWS Service를 mooking하여 애플리케이션을 개발하고
- 테스트: 변경사항을 주기적으로 localstack으로 구축한 통합테스트 서버에 반영하여 자동화 테스트를 돌리고
- 배포: 실제 AWS Cloud 에 코드 수정없이 배포한다.
이렇게 되면 배포와 테스트시 AWS Cloud 사용비용을 절감하는 장점을 얻을 수 있어 2017년 첫 출시부터 이미 많은 개발팀에서 통합테스트로 LocalStack을 활용하고 있다고 한다. 검색하다보니 2019년에 우아한형제에서도 사용한다고 블로그에 적혀있었다.
https://techblog.woowahan.com/2638/
그런데 여기서 고려해야할것은 이 LocalStack 도 유료 버전이 있다는 사실이다. (어떤 AWS 서비스를 사용하느냐에 따라 다른데, 월사용료를 내는 유로버전이 더 비쌀수도? ㅋㅋ) https://localstack.cloud/pricing/
제공 기능은 Community Edition, Pro Edition, Enterprise Edition 세 가지 Edition에 따라 다르다.
설치 및 활용
설치 및 실행
도커 컨테이너 기반으로 설치가 편리하다. 참고: https://github.com/localstack/localstack
설치
$ pip install localstack
실행
1. 기본설정 (모든 무료 서비스)으로 실행
$ localstack start // 모든 무료 서비스 실행
$ SERVICES=lambda,s3,dynamodb localstack start // lambda,s3,dynamodb만 실행
2. docker compose 로 실행
docker-compose.yaml 을 작성하여 원하는 설정 값을 관리할수 있다.
version: '2.1'
services:
localstack:
image: localstack/localstack
ports:
- "53:53"
- "443:443"
- "4510-4520:4510-4520"
- "4566-4620:4566-4620"
- "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}" 👈 지금은 Deprecated 된 local web UI 포트
environment:
- LOCALSTACK_API_KEY=... 👈 Pro Edition으로 결제하면 발급받는 API KEY
- SERVICES=serverless,cognito,rds 👈 사용하려는 Service 설정
- DEBUG=1
- DATA_DIR=/tmp/localstack/data 👈 persistent data를 사용하기 위한 설정
- DOCKER_HOST=unix:///var/run/docker.sock
- HOST_TMP_FOLDER=${TMPDIR}
volumes:
- "${TMPDIR:-/tmp/localstack}:/tmp/localstack" 👈 persistent data를 저장하기 위해 mount할 local directory
- "/var/run/docker.sock:/var/run/docker.sock"
$ docker-compose up
활용
aws cli를 그대로 활용하는데, 대신 --endpoint-url에 로컬 머신에 설치된 localstack url 인 http://localhost:4566 을 적는다.
$ pip install localstack
$ localstack start // 모든 무료 서비스 실행
$ SERVICES=lambda,s3,dynamodb localstack start // lambda,s3,dynamodb만 실행
// test1-bucket 하나 만들기
$ aws --endpoint-url=http://localhost:4566 s3 mb s3://test1-bucket
make_bucket: test1-bucket
$ aws --endpoint-url=http://localhost:4566 s3 ls
test1-bucket
awslocal 을 활용하면 매번 --endpoint-url 을 사용하지 않아도 된다. 단, aws cli v1을 사용해야하는 limitation이 있다.
$ awslocal s3 ls
2021-07-16 17:48:06 test1-bucket
2021-07-16 17:49:48 test2-bucket
Persistent Data 설정
default 설정으로 localstack 을 실행하면 data가 사라진다. 테스트를 위한 data를 한번 구축하고 계속 활용하거나, Pro Edition 버전이면 발급받은 API Key caching을 위해서는 storage가 필요하다.
- DATA_DIR 를 /tmp/localstack/data 로 설정
- volumes을 local 파일
docker-compose.yaml
version: '2.1'
services:
localstack:
image: localstack/localstack
ports:
- "53:53"
- "443:443"
- "4510-4520:4510-4520"
- "4566-4620:4566-4620"
environment:
- SERVICES=s3,lambda
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
- DOCKER_HOST=unix:///var/run/docker.sock
- HOST_TMP_FOLDER=./.localstack
volumes:
- "./.localstack:/tmp/localstack" 👈 저장 경로를 ./.localstack으로 지정
- "/var/run/docker.sock:/var/run/docker.sock"
s3 에 my-bucket 을 생성하고 파일을 올려보자
$ awslocal s3 mb s3://my-bucket
make_bucket: my-bucket
$ awslocal s3 cp otel.png s3://my-bucket
upload: ./otel.png to s3://my-bucket/otel.png
저장경로 ./.localstack 에 persistent data 저장을 위한 파일들이 생성되는것을 확인할수 있다. (recorded_api_calls.json에는 s3에 생성한 my-bucket 정보나 저장한 png 파일 정보를 확인할수 있다)
코딩
endpoint url 만 수정하면 기존 코드를 활용할수 있는데, python이나 .net의 경우 이러한 설정을 대신해주는 client library를 제공해주고 있다.
요약
지금까지 AWS Cloud Service를 사용한 프로젝트에서 통합테스트도 당연히 상용버전 환경과 동일한 곳에서 테스트를 진행했다. 넷플릭스에서는 제대로 된 테스트를 위해서는 심지어 실제 운영환경에서 테스트를 진행한다고는 하지만, 개발이나 자동화테스트의 경우는 운영환경 테스트전 로컬환경에서 구축하는것도 좋은 방법인것 같다.
그 솔루션중 하나가 LocalStack 이고 출시 이후 활발하게 운영중에 있어 믿을만하다. slack으로 실시간 이슈 대응도 진행하고 있고, 사용하는 개발자도 많아서 혹시 문제가 있어도 구글 검색으로 금방 해결가능하다.
개인 개발자가 간단하게 테스트하기에는 (물론 사용하는 서비스가 뭐냐에 따라 다르지만) Open Source로 제공하는 기능으로도 충분할것 같다. 하지만 제대로 통합테스트를 구축하려면 한달에 15유로인 Pro Edition으로 하는것이 좋을것 같다.
'자습' 카테고리의 다른 글
Jaeger with Go (1) | 2021.07.20 |
---|---|
Zipkin Go (0) | 2021.07.17 |
React + Gin + Emqx Chat App (0) | 2021.02.27 |
Go OAuth2.0 서버 (0) | 2021.01.31 |
node-forge를 이용한 RSA 암호화, CSR 생성 (0) | 2021.01.16 |