Cloud Function은 GCP의 Serverless function 서비스입니다. Cloud Function을 통해서 우리는
인프라 걱정 없이 코드의 제공만으로 함수를 실행할 수 있는 FaaS(Function as a Service)를 이용할 수 있습니다.
하지만 개인적으로 Cloud Function을 이용하면서 불편했던 점은,
코드를 deploy하고 서버가 뜰때까지 기다려야 하기 때문에 코드를 테스트하는 과정에 너무 많은 시간이 소요된다는 것이었습니다.
Local 환경이었다면 코드를 이용해서 서버를 세우고 응답을 받기까지 매우 짧은 시간이면 충분했지만 Cloud function은 원격지의 리소스를 사용하는 Cloud 서비스이기 때문에 코드를 deploy하고 요청을 보내서 응답을 받는 과정이 길어질 수 밖에 없는 것입니다.
저는 이 같은 불편함을 GCP에서 제공하는 Function framework를 사용함으로써 해결할 수 있었습니다.
Function Framework란?
Function framework는 Cloud function를 그대로 local로 가져올 수 있는 Emulator 기능의 오픈소스 라이브러리입니다.
현재 Cloud Function은 위와 같은 추상화 계층으로 구성되어 있습니다.
여기서 Function Framework 계층을 Local 환경에서 사용하는 것이기 때문에 기존 Cloud function에서 동작하는 환경과 동일한 환경을 구성할 수 있습니다.
Function framework를 이용함으로써 다음과 같은 이점을 얻을 수 있습니다.
- Local 개발 환경을 신속하게 구축할 수 있다.
- 실제 Cloud Function에서 invoke되는 환경을 그대로 구성할 수 있다.
- Cloud run 등 다양한 Serverless platform과 호환이 가능하다.
요약하자면 코드를 테스트할 때 Cloud function 서버가 올라올 때까지 기다릴 필요 없이 Local 환경에서 함수를 실행하고 테스트할 수 있어 훨씬 더 빠른 테스트 프로세스를 진행할 수 있습니다.
이를 통해 Cloud function 코드의 디버깅, 테스트 시간을 절약해 전체적인 개발 프로세스를 확연하게 단축시킬 수 있습니다.
현재(21-07-24) Function framework가 지원하는 runtime 환경은 다음과 같습니다.
Function Framework 활용
개념을 알아보았으니 이제 실제 Function framework를 이용해서 local 개발 환경을 구성해보겠습니다.
nodejs 환경에서 http 요청을 받아 응답을 반환하는 간단한 함수를 local에서 실행해보겠습니다.
다른 runtime 환경에서의 설정은 위 "지원하는 runtime 환경" 리스트 요소를 클릭하면 링크에서 볼 수 있습니다.
1. npm init
원하는 디렉토리에서 다음 명령어를 입력해 package.json를 생성합니다.
이후 다음 명령어를 실행해 package.json에 funciton framework 라이브러리를 설치합니다.
1
|
npm install @google-cloud/functions-framework
|
cs |
3. index.js 생성
같은 디렉토리에 index.js 파일 생성 후 원하는 함수를 넣습니다.
위 코드는 구글 chat 메세지를 받아 메세지 body를 분석 후 적절한 결과값을 반환하는 onMessage() 함수를 넣었습니다.
간단하게 Function framework를 이용해보고 싶다면 아래와 같은 간단한 Hello world 함수를 이용할 수도 있습니다.
1
2
3
|
exports.helloWorld = (req, res) => {
res.send('Hello, World');
};
|
cs |
4. script 작성
"npm start" 명령어만으로 쉽게 서버를 세우기 위해 package.json 파일에 아래 스크립트를 넣습니다.
1
2
3
|
"scripts": {
"start": "functions-framework --target=onMessage"
}
|
cs |
--target은 Cloud function에서 실행할 함수를 지정하는 플래그입니다. 위 스크립트 외에도 함수에 필요한 라이브러리를 package.json에 입력합니다.
저의 최종적인 package.json은 아래와 같습니다.
5. 실행
이제 함수를 local에서 실행할 준비가 끝났습니다. 개발 머신의 Terminal에서 "npm start" 명령어를 입력해 서버를 실행합니다.
정상적으로 실행돼었다면 아래와 같이 http://localhost:8080/ 으로 함수를 받고 있다는 메세지가 출력됩니다.
이제 http://localhost:8080/ 주소로 요청을 보내면 함수 코드에 명시한 응답을 받을 수 있습니다.
제 onMessage() 함수는 Google chat 메세지 payload를 받아서 응답하도록 구성되어 있으므로 POST 메소드로 동일한 요청을 보내보겠습니다.
Thunder client를 사용해서 POST 요청을 보내본 결과 의도된 값을 반환하고 있습니다.
이로써 함수가 적절하게 동작한다는 것을 확인할 수 있습니다.
이제 동일한 함수를 그대로 Cloud Function에 이식하면 동일한 결과를 받을 수 있습니다.
기존의 Cloud Function을 이용했다면 서버의 배포시간 + logging 활성화시간 때문에 응답을 받아보기까지 많은 시간이 걸렸지만 이렇게 local 환경에서 실행하는 함수는 배포가 훨씬 빨라지기 때문에 응답을 받기까지 시간을 단축할 수 있습니다.
+. 디버깅
vs code를 사용한다면 node inspector를 이용해 쉽게 디버깅을 진행할 수 있습니다.
vs code에서(window 환경) ctrl+shift+p를 누른 뒤 "auto attach" 항목을 클릭합니다.
아래와 같이 Only With Flag 항목을 클릭합니다.
이후 아래와 같은 명령어를 입력하면 node inspector를 실행해 vs code에서 디버깅 모드를 활성화할 수 있습니다.
1
|
node --inspect node_modules/@google-cloud/functions-framework --target=onMessage
|
cs |
디버깅 모드를 활성화하면 line마다 break point를 찍어 요청을 받을 때 어떻게 코드가 진행되는지 확인할 수 있습니다.
이렇게 Local환경에서는 쉽게 디버깅도 진행할 수 있기 때문에 테스트 프로세스가 훨씬 빨라집니다.
![](https://blog.kakaocdn.net/dn/baWT1o/btraptSqN3s/oNQSut02VjTPJxKIwTTQpk/img.png)
마무리
지금까지 Function Framework를 사용해 Local에서 함수를 테스트할 수 있는 환경을 구성해봤습니다.
이번 포스팅에서는 Function framework를 사용해서 HTTP 요청을 받는 함수를 Local에서 실행해봤지만 Pub/sub이나 Cloud event같은 다양한 요청에 응답할 수 있는 환경도 구성할 수 있습니다.
추가적으로 실제 Cloud Function은 Function framework 계층 위에 build pack을 이용한 container 계층도 포함하기 때문에 Function framework로 구성한 함수를 컨테이너화해서 사용할 수도 있습니다.
이번 포스팅을 통해서 Cloud function을 이용하시는 많은 분들이 더욱 편리하고 효율적으로 코드를 배포할 수 있었으면 합니다.
'GCP' 카테고리의 다른 글
Google Cloud의 Cloud Deploy로 자동화된 CI/CD Pipeline 구성하기 (0) | 2021.11.05 |
---|---|
GCP Cloud armor의 DDoS protection 기능 사용 및 검증 (0) | 2021.10.07 |
GCP DNS Forwarding으로 원격지 DNS 서버에 질의하기(+DNS Peering) (0) | 2021.07.14 |
GKE CNI Performance benchmark(2021-06-10) (0) | 2021.06.10 |
GCP Compute Engine에 Gitlab 서버 구축 + VS Code 연동하기 (0) | 2021.05.19 |