Cloud Functions
Last updated
Last updated
이번에는 Cloud Functions 에 대해서 살펴보는 시간을 갖도록 한다. 기능은 단어 그대로 클라우드 위에 함수를 등록하고 트리거 ( Trigger )를 걸고 사용하는 개념이 되겠다. 쉽게 이야기해서 이벤트가 발생되면 등록해놓은 함수가 동작하는 방식이겠다. 이제 더 이상 작은 모듈을 위해 GCE 를 운영할 필요가 없겠다. Cloud Functions 은 서버리스로 동작하니까. AWS 에서는 Lambda 가 같은 개념이 되겠다. 아무튼, 서비스목록에서 Cloud Functions 를 선택해서 기능을 직접 사용해보도록 하자. 한국어로 봤을 때는 "Cloud 기능" 을 확인하면 된다. ( 근데 왜 아직도 베타인지? 는 아래쪽에서 추측해보도록 하자. )
Cloud Functions 메뉴에 최초 진입시에는 lAPI 사용 설정을 통해 기능을 활성화 시키도록 한다. 잠시 후 기능이 활성화 되고 아래와 같은 화면을 확인할 수 있게 된다. 아직 등록된 함수가 없기 때문에 별도로 출력되는 리스트가 없다. 함수 만들기를 선택해서 본격적으로 Cloud Functions 을 사용해보도록 하자.
GCE 를 생성할 때와 마찬가지로 여러가지 옵션을 선택할 수 있는데 하나씩 천천히 살펴보도록 하자. 이것들은 앞으로 등록하게되는 함수가 동작하게 되는 환경에 대한 설정이라고 이해하면 된다. 서버리스라고는 하지만 실제 함수를 동작하기 위한 서버가 일시적으로 기동된다. 사용자가 굳이 이런 시스템에 대해 알고 있을 필요는 없지만 그런 배경에 대해서 숙지하지 못하면 내가 등록한 함수가 최상의 퍼포먼스를 내는데 불편함을 감수해야 할 것이다. 혹은 불편한 비용 문제를 겪을지도 ( 불필요하게 높은 사양은 필요 없다 )
함수 이름을 등록하고 할당 메모리를 지정하도록 한다. 함수 이름을 선택할 때는 아래와 같은 규칙을 따른다.
이름은 문자로 시작해야 합니다. 이어서 최대 62자(영문 기준)의 문자, 숫자 또는 하이픈이 와야 하며 하이픈으로 끝나서는 안 됩니다
메모리는 128MB, 256MB, 512MB, 1GB, 2GB 중에 선택해서 사용할 수 있다. 이 글의 등록일 기준이기 때문에 훗날 변경될 수 있는 부분이겠다. 등록하는 함수의 복잡도와 역할에 따라 적당한 메모리를 선택하도록 하자. 등록후에 함수를 모니터링하며 언제든지 적절한 메모리로 수정할 수 있는 부분이기 때문에 부담 없이 선택해도 되겠다. ( 선택하는 메모리에 따라 할당되는 CPU 의 종류가 바뀐다. 즉, 확연한 성능차이를 가져온다. )
트리거는 아래처럼 총 세가지 중에 선택해서 사용하면 되겠다. HTTP 는 지정된 URL 에 이벤트가 들어오면 응답하는 방식이고, Cloud Pub/Sub 은 해당 기능을 활성화해서 사용해야 한다. Cloud Storage 는 저장소에 특정 이벤트( 생성/삭제 등 )가 발생했을 때 수행되는 방식이겠다. 여기서는 가장 기본이 되는 HTTP 를 통해 예제를 진행하도록 한다.
HTTP 를 트리거로 선택하면 URL 을 할당받게된다. 해당 URL 에 이벤트가 발생하면 모듈이 동작하는 방식이 되겠다. 메서드( get, post, put, delete 등 )에 대한 별도의 구분이 없기 때문에 코드 내부적으로 분기해서 사용하면 되겠다. ( 주의: *URL* 노출로 인한 과다 트래픽 발생 비용 문제는 개인에게 있습니다
)
이제 코드를 등록하면 되는데 아래처럼 네 가지 방식을 지원한다. 제일 심플하게는 콘솔 내부에서 직접 코드를 작성하는 인라인 편집기 방식이 있겠다. 그리고 로컬에서 개발한 내용을 업로드 해서 사용하는 ZIP 업로드, Cloud Storage 의 ZIP 방식이 있고 소스 저장소 기능을 활용한 Cloud 소스 저장소 방식이 있다. 아래는 기본으로 들어가는 코드인데 알 수 있듯이 Node.js 로 되어 있다. AWS 에 Lambda 가 Python, Node, c# 등 여러가지 언어를 지원하는 반면에 Cloud Functions 은 아직 다양한 runtime 을 지원하지는 않는다. 베타라서 그런걸까? 차차 다른 언어에 대한 지원도 기대해본다.
함수의 이름은 코드 내에 있는 모듈의 이름으로 이해하면 된다. 동일한 소스 코드를 여러개의 Cloud Functions 에 등록하고 실행할 함수 이름만 다르게 해서 사용하는 것도 가능하다는 이야기다.
고급 옵션을 펼쳐서 보면 지역과 제한시간, 환경 변수를 설정할 수 있다. 하나씩 보면 지역의 경우 해당 함수가 동작하게 될 지역을 나타내게 되는데 실제 함수가 서비스 되는 지역을 선택해서 latency 를 최소화(자체 광케이블을 사용한다고는 하지만) 하는게 좋다. 제한 시간은 Cloud Functions 이 서버리스기 때문에 보이지 않는 서버를 항상 띄워둘 수 없다. 제한된 시간을 초과해서 사용이 필요한 경우에는 GCE 등 다른 서비스를 고려하는 것이 좋겠다. Cloud Functions 에서 제한시간은 기본이 60초이고 최대 9분까지 사용 가능한 부분이다.
환경변수의 경우에는 말 그대로 함수가 실행되는 환경에 설정되는 변수인데 KEY - VALUE 형태로 입력된다. 노드 코드상에서는 process.env.foo 형태로 참조가 가능하겠다. 국내 서비스의 경우 TZ 을 Asia/Seoul 로 설정해두는 것이 팁이라면 팁일 수 있겠다.
여기까지 진행되었으면 이제 모든 설정을 마쳤다. "만들기" 버튼으로 함수를 생성하도록 하자. 함수가 생성되면 이제 Cloud Functions 메뉴에 리스트 형태로 생성한 함수가 보이게 된다. 현재 생성중인 상태이기 때문에 함수 이름 옆에 progress bar 가 돌고 있는 모습이다. 여기 리스트에서는 함수의 개략적인 내용을 살펴볼 수 있으며 삭제/복사 등의 작업을 할 수 있다. 함수 수정을 위해서는 이름을 클릭하면 되겠다.
함수 이름을 클릭하고 들어가면 제일먼저 보이는 화면이 호출에 대한 모니터이다. 여기서 다른 부분은 다 이해가 어렵지 않은데 상단에 버전과 배포 시간
이 눈에 띈다. 새롭게 코드를 수정하고 저장하게 되면 실제 코드가 반영된 시간과 버전이 노출되게 된다. Lambda 의 경우 ZIP 형태로 코드를 수정해놓고도 잠시 깜빡하는 경우가 생겨서 여러번 소스 코드를 업로드 하는 경우가 생기는데 이런 일을 미연에 방지할 수 있겠다.
함수의 우측 상단을 보면 로그 보기 메뉴가 있는데 Cloud Functions 의 모든 로그는 스택드라이버에 남게 된다. 해당 부분은 GCP 의 남다른 자랑인 만큼 추후에 별도의 포스팅을 통해 다시 살펴보도록 하자.
자, 여기까지 Google Cloud Patform 의 서버리스 서비스 중 하나인 Cloud Functions 에 대해 살펴보았다. 하지만 많은 사람들이 걱정하는 부분인 가격 정책에 대해서는 언급하지 않았는데 아래 링크에서 이미 상세히 소개되고 있으니 참고 하도록 하자.
https://cloud.google.com/functions/pricing-summary/
여기서 간략하게 첨언하자면 이미 상당량의 콜이 무료로 제공되며, 1,000만 콜이 월 $14.08 이라는 기적에 가까운 가격정책
을 펼치고 있다. 잘 이해가 안된다고? 부담없이 사용하자는 이야기다.