구글의 클라우드 플랫폼(Google Cloud Platform)에서 지원하는 서버리스 서비스인 Cloud Functions에 대해서 간단하게 정리해보려 한다.
내가 AWS의 Lambda를 써보질 않아서 얼마나 비슷한 지 모르겠지만 여하튼 같은 서버리스 서비스니까 어느정도는 비슷할 것 같다.
별 거 없었다. 현재 사용중인 STT 서비스가 구글의 STT 였기 때문에 이미 구글 API에 대한 계정이 준비되어 있었고, 굳이 다른 플랫폼을 사용하는 것 보다는 동일한 플랫폼 내부의 서비스를 사용하는게 나중에 기능을 통합할 때 더 편할 거란 생각이 있었다.
https://www.youtube.com/watch?v=d90B0tupHrE
처음 시작하는데 정말 큰 도움이 된 유튜브 영상이다. 현재 테스트 용도로 사용중인 AWS EC2 인스턴스의 성능이 매우 부족하기도 해서 가능한 많은 부분을 서버리스화 하고 싶었다.
현재 회사에서 진행 중인 업무에서 서버리스화하려는 파트는 총 2가지이다.
- Librosa 라이브러리를 사용한 오디오 분석
- 오디오를 STT에 적용해서 텍스트 추출
먼저 시도해 본 건 REST API 방식이었는데 뭐가 좀 안되서 위에 있는 영상을 참고해서 GCP의 Storage 에 파일이 생성되는 것을 트리거로 하는 Cloud Funtions를 만들어 보았다.
이미 존재하는 두 Functions는 현재 사용중인 Functions들이다.
특정 스토리지에 파일이 업로드 되는 것을 트리거로 하는 기본적인 설정이다.
함수 이름, 리전은 본인의 마음대로 정해주면 된다.
트리거 설정의 기본 설정은 HTTP의 트리거 유형으로 잡혀있을 텐데 이를 Cloud Storage 로 변경해주면 Event Type를 정해줄 수 있다.
완료/생성 말고도 삭제 같은 이벤트도 사용할 수 있다.
마지막 버킷에서 어떤 Cloud Storage 의 버킷을 기준으로 할 지 정해줄 수 있는데 미리 버킷을 만들어 둔 버킷을 사용한다.
버킷의 경우는 현재 프로젝트의 Storage 에 생성되어 있는 버킷들에 접근이 가능하다.
버킷 선택이 완료되면 만들기를 종료해도 큰 상관은 없지만 남아있는 설정을 한번 살펴보자.
할당 메모리의 경우 최대 4GiB까지 할당이 가능하다. 본인이 구현할 Functions가 성능이 필요한 경우라면 경우에 맞게 잡아주자.
시간제한의 경우 무한하지 않다. 최대 540초로 제한된다.
런타임 서비스 계정은 나도 확실하게 아는 것은 아닌데 현재 플랫폼의 다른 API, 서비스들에 접근할 수 있는 권한과 관련된 기능이다.
나머지는 공식문서를 통한 이해가 더 빠를 것 같아서 스킵
다음으로 넘어갈 때 다음 버튼이 활성화가 안되있다면 기본 사항의 저장 버튼을 눌러주자.
이제 편집기를 통해서 원하는 로직을 작성하면 된다.
런타임 자체는 다양하게 있으나 나는 파이썬을 쓰니까 파이썬으로 설정한다.
진입점의 경우는 일종의 main함수라고 이해하면 편할 것 같다. 작성하는 Functions의 최초 실행 함수명을 적어주면 된다.
main.py의 경우는 복잡하게 볼 것 없이 로직을 작성하면 된다. requirements.txt의 경우 추가적인 설치가 필요한 라이브러리를 적어주면 해당 라이브러리를 main.py 에서 import 해 사용이 가능하다.
import requests
import json
def function_audio(event, context):
file_name = event['name']
bucket_name = event['bucket']
URL = "<SERVER_ADDRESS>/test/gcp/functions"
data = {
'bucket_name' : bucket_name,
'file_name' : file_name
}
res = requests.post(URL, data = json.dumps(data))
간단하게 현재 Functions 가 추적중인 버킷에 업로드된 파일의 이름과 버킷 이름을 전송하는 기능을 하는 코드이다.
단순한 코드이니 굳이 코드 설명은 하지 않는다.
코드를 잘 작성했으면 배포를 눌러서 배포를 진행한다.
배포가 문제 없이 진행되면 아래와 같은 아이콘이 표시된다. 딜레이가 어느정도 있는 편이니 마음에 여유를 가지고 기다려보자.
배포가 잘 완료되서 아이콘이 잘 표시되었다면 이제 테스트를 진행해보자.
Functions 코드에 명시한 주소로 테스트용 서버를 하나 열어놓은 후에, Storage 탭으로 이동해서 테스트용 파일을 하나 업로드한다.
업로드가 완료되면 테스트 진행을 위한 서버 로그를 확인하면?
버킷 이름과 파일 이름을 확인할 수 있다.
결론
GCP의 Cloud Functions를 통해서 서버리스에 대해서 처음 접하고 직접 사용도 해보았는데 생각보다 간단하다는 생각이 들었다.
그렇지만 조금 어려운 점도 많았는데, 간단하게 정리하면
- 디버그가 불편하다.
- Timeout 제한 9분이 은근 짧게 느껴졌다.
타임 아웃 문제는 내가 다루는 데이터가 조금 크다 보니 발생하는 문제라고 볼 수 있다. 1시간짜리 무손실 음원 처리의 서버리스화는 조금 무리가 있었다.
그런데 디버그의 불편은 내가 부주의한 점도 있겠지만 코드에서 오타 같은 간단한 오류를 수정하려면 수정 -> 재배포의 과정을 거쳐야 한다.
나같은 경우 한 함수를 배포하는데 버전이 30이 넘어가는데 실질적인 기능 개선 또는 수정보다는 오타 수정이 90퍼센트는 차지하는 느낌이다.
배포 자체도 완전 느린건 아니지만 그렇다고해서 완전 빠르지도 않기 때문에 작성 자체를 신중하게 하던가 기본적으로 지원되는 테스트 기능에 대한 이해가 필요할 것 같다.
'프로그래밍 > 기타' 카테고리의 다른 글
JWT - 1 (0) | 2022.03.02 |
---|---|
CORS - 1 (0) | 2022.02.18 |
자주 쓰는 psql 명령어 정리 (0) | 2021.10.08 |