EMD Blog

GCP Cloud Functions 본문

Public Cloud/GCP

GCP Cloud Functions

EmaDam 2022. 9. 3. 10:10

Cloud Functions 사용 전 알고 있으면 좋은 내용들 정리해 보았음.

실행환경

  • Node.js, Python, Java, .NET, Ruby, PHP 등 다양한 런타임을 제공하고 있다. 각 런타임은 고유 ID를 가지고 있어 SDK나 Terraform 사용시 이 ID를 통해 런타임을 지정할 수 있다. 이 런타임은 자동으로 업데이트 되며, 이외에도 운영체제 및 포함되어 있는 패키지와 같이 실행 환경 내 다른 구성요소도 업데이트 가능하다. 참고로 모든 런타임에는 시스템 패키지 집합을 포함하고 있어 코드 작성 시 참고하는 것이 좋다.
  • 이전 호출에서 설정한 인메모리 상태를 유지하지 않는다. 하지만 종종 성능 최적화를 위해 전역 변수를 사용하여 객체를 재사용할 수 있다. - 도움말 및 유용한 정보 | Cloud Functions 문서 | Google Cloud
  • 수신 받은 요청을 함수의 인스턴스에 할당하여 처리하는 데 요청 양에 따라 인스턴스 개수가 자동 확장 되며, **확장 가능한 최대 인스턴스 개수를 제한**할 수도 있다.

만약에 트래픽이 급격하게 증가하면서 간헐적으로 500에러가 발생한다면 인스턴스가 생성되는 동안 요청이 타임아웃되는 것이다. 이 경우 트래픽을 점진적으로 늘리도록 워크로드를 구성해 해결 가능하다.

Cloud Functions 문제 해결  |  Cloud Functions 문서  |  Google Cloud

  • 새로 함수를 배포하거나 새로운 함수 인스턴스가 자동으로 생성되어 부하에 맞게 수직 확장되는 경우, 간혹 기존 인스턴스를 대체하는 경우 콜드 스타트가 적용된다. 콜드 스타트의 경우 인스턴스를 시작하고 런타임과 코드를 로드해야하기 때문에 기존 함수 인스턴스에 대한 요청보다 느리다.
  • 오류 처리에 따라 재시작 여부가 갈리기도 한다. 반드시 재시작해야 하는 것이 아니라면 오류를 잘 처리해 콜드 스타트를 방지 할 수 있다. - Cloud Functions 실행 환경 | Cloud Functions 문서 | Google Cloud
  • 최소 인스턴스 수를 설정하는 것도 콜드 스타트를 방지할 수 있다. - 최소 인스턴스 사용 | Cloud Functions 문서 | Google Cloud
  • 함수 실행시간은 기본 1분으로 설정되어 있으며 이는 9분까지 연장 가능하다.

이벤트

Cloud Functions는 이벤트 발생 시 실행되도록 설정할 수 있다. 이벤트를 지원하는 환경은 다음과 같다.

HTTP - HTTP 트리거  |  Cloud Functions 문서  |  Google Cloud

  • 함수 배포시 --trigger-http 옵션을 사용해 HTTP 엔드 포인트를 생성할 수 있다. 이 엔드 포인트를 통해 함수를 동기식으로 호출할 수 있다.

Cloud Storage - Google Cloud Storage 트리거  |  Cloud Functions 문서

  • 객체 생성, 삭제, 보관, 메타데이터 업데이트와 같이 버킷 내에서 발생하는 다양한 이벤트로 트리거 될 수 있다. 단, 같은 Cloud Functions와 Cloud Storage가 같은 Project에 존재해야한다.

Cloud Pub/Sub - Google Cloud Pub/Sub 트리거  |  Cloud Functions 문서

  • Pub/Sub 주제에 게시되는 메세지로 트리거 될 수 있다. 단, 같은 프로젝트에 속해 있어야 한다.
  • 구독 ID가 gcf-{cloud function name}-{region}-{topic}로 고정된다. 이 ID는 사용자가 지정할 수 없다. (조직의 네이밍 룰을 준수할 수 없음. 주의할 것)

Cloud Firestore - Google Cloud Firestore 트리거  |  Cloud Functions 문서

  • Firestore API 및 클라이언트 라이브러리를 사용해 이러한 이벤트 응답으로 Cloud Firestore를 읽거나 업데이트 가능하다. 단, 같은 프로젝트에 속해 있어야한다.

Firebase

Cloud Logging - Cloud Logging으로 2차 트리거  |  Cloud Functions 문서  |  Google Cloud

  • 로그를 필터링 하고 싱크를 사용해 Pub/Sub 주제로 전달 가능하다.

Cloud Scheduler - Pub/Sub를 사용하여 Cloud 함수 트리거  |  Cloud Scheduler 문서  |  Google Cloud

Cloud 함수 실행을 트리거하면 연관된 데이터가 함수의 매개변수로 전달이 된다. 이 매개변수는 이벤트 유형에 따라 달라지며, HTTP 요청은 HTTP 함수를 트리거하고 다른 이벤트는 이벤트 기반 함수를 트리거한다. 여기서 이벤트 기반 함수는 백그라운드 함수CloudEvent 함수로 나뉜다. - 이벤트 및 트리거  |  Cloud Functions 문서  |  Google Cloud

보안

Cloud Functions IAM - Cloud Functions IAM Roles  |  Cloud Functions Documentation  |  Google Cloud

HTTP 기반으로 트리거 할 경우 기본적을 호출자를 인증해야 한다. 호출자를 인증하지 않고 호출하려면 함수 배포시 아래의 옵션을 추가하면 된다.

  • -allow-unauthenticated

만약에 배포가 된 상태라면 아래 명령어로 허용해 줄 수 있다.

gcloud functions add-iam-policy-binding <FUNCTION_NAME> \\
 --member="allUsers" \\
 --role="roles/cloudfunctions.invoker"

테스트 용도거나 오픈 API를 서비스 할 경우에는 위처럼 인증을 없이 배포하면 되지만, 일반적인 경우는 인증을 거치는 것이 보안적으로 좋다. 만약에 로컬에서 직접 함수를 호출하면서 테스트 하고 싶다하면 사용자 계정에 cloudfunctions.functions.invoke 권한을 부여해 모든 함수를 호출하면 된다.

curl <https://asia-northeast3-vntg-gw-dev-324106.cloudfunctions.net/> \\
  -H "Authorization: bearer $(gcloud auth print-identity-token)"

gcloud auth print-identity-token 명령어 - gcloud auth print-identity-token  |  Google Cloud CLI Documentation

하지만 테스트가 목적이 아니라면 모든 함수에 접근할 수 있게 하는 것은 보안적으로 위험하다. 그렇게 때문에 함수 별로 권한을 관리할 수 있다. 이렇게 하면 사용자 및 서비스 계정이 특정 함수에만 접근 할 수 있게 된다. 특정 함수에 대한 호출 권한을 부여하는 명령어는 아래와 같다.

$ gcloud functions add-iam-policy-binding <FUNCTION_NAME> \\
  --member='<ACCOUMT_TYPE>:<ACCOUNT>' \\
  --role='roles/cloudfunctions.invoker' \\
  --region=asia-northeast3

위 명령어는 FUNCTION_NAME 함수가 ACCOUNT에게 자신을 호출할 수 있도록 역할을 부여한다는 뜻이다.

gcloud functions add-iam-policy-binding 명령어 - gcloud functions add-iam-policy-binding  |  Google Cloud CLI Documentation

참고로 이 방식 또한 권한을 부여받은 계정이 토큰을 만들어야 하기 때문에 토큰을 생성할 수 있는 권한이 추가로 필요하다. (roles/iam.serviceAccountTokenCreator)

토큰을 만드는 방법에는 여러가지가 존재하는데 Pub/Sub같은 경우는 서비스 계정만 설정해주면 알아서 토큰을 만든 뒤 요청에 포함시킨다. 만약에 Cloud 함수를 호출하는 API를 만들었다고 한다면 프로그래매틱 방식을 사용해 토큰을 생성할 수도 있다.

프로그래매틱 방식을 이용한 토큰 생성 - Authenticating for invocation  |  Cloud Functions Documentation  |  Google Cloud

만약에 위 방식(자동, 프로그래매틱)들로 토큰을 생성할 수 없는 상황이라면 수동으로 토큰을 생성할 수 있다.

수동으로 토큰 생성 - Authenticating for invocation  |  Cloud Functions Documentation  |  Google Cloud

'Public Cloud > GCP' 카테고리의 다른 글

비공개 Uptime Check 구성  (0) 2022.09.03
GCP GCS 커스텀 도메인 적용  (0) 2022.09.03
GCP Pub/Sub  (0) 2022.09.03
GCP Filestore  (0) 2022.09.03
[GCP] Compute Engine에 대해 알아보자(5) - 스테이트풀 MIG/메타데이터 및 IP  (0) 2022.03.01