Cloud Functions (2세대) 시작하기

1. 소개

Cloud Run 함수를 작성하려면 다음 Codelab을 사용하면 됩니다.

그렇지 않은 경우 이 Codelab에서는 Cloud Functions (2세대)를 만드는 방법을 안내합니다.

개요

Cloud Functions (2세대)는 Google Cloud의 서비스로서의 기능 제품인 Google Cloud Functions의 차세대 버전입니다. 이 새로운 버전은 고급 기능 집합과 함께 제공되며 이제 Cloud RunEventarc를 기반으로 하여 성능 및 확장성에 대한 고급 제어, 함수 런타임 및 90개가 넘는 이벤트 소스의 트리거에 대한 추가 제어를 제공합니다.

이 Codelab에서는 HTTP 호출에 응답하고 Pub/Sub 메시지 및 Cloud 감사 로그에 의해 트리거되는 Cloud Functions를 만드는 방법을 알아봅니다.

새로운 기능

이 새로운 Cloud Functions 버전은 Cloud Run, Cloud Build, Artifact Registry, Eventarc로 지원되는 향상된 FaaS 환경을 제공합니다.

향상된 인프라

  • 더 긴 요청 처리: Cloud Functions를 기본값인 5분보다 더 오래 실행하여 Cloud Storage 또는 BigQuery에서 대용량 데이터 스트림 처리와 같은 더 긴 요청 워크로드를 더 쉽게 실행할 수 있습니다. HTTP 함수의 경우 최대 60분입니다. 이벤트 기반 함수의 경우 현재 최대 10분입니다.
  • 대용량 인스턴스: Cloud Functions에서 최대 16GB의 RAM과 4개의 vCPU를 활용하여 대용량 인메모리, 컴퓨팅 집약적 워크로드, 병렬 워크로드를 지원할 수 있습니다.
  • 동시 실행: 단일 함수 인스턴스로 최대 1, 000개의 동시 요청을 처리하여 콜드 스타트를 최소화하고 확장 시 지연 시간을 개선합니다.
  • 최소 인스턴스: 실행 상태로 대기 중인 인스턴스를 제공하여 콜드 스타트를 줄이고 애플리케이션의 부트스트랩 시간이 애플리케이션 성능에 영향을 주지 않도록 합니다.
  • 트래픽 분할: 여러 버전의 함수를 지원하고, 여러 버전 간에 트래픽을 분할하고, 함수를 이전 버전으로 롤백합니다.

포괄적인 이벤트 지원 범위와 CloudEvents 지원

  • Eventarc 통합: 이제 Cloud Functions에 Eventarc에 대한 네이티브 지원이 포함되어 Cloud 감사 로그 (BigQuery, Cloud SQL, Cloud Storage 등)를 사용하는 90개가 넘는 이벤트 소스를 제공합니다. 물론 Cloud Functions는 Cloud Pub/Sub에 직접 게시하여 맞춤 소스의 이벤트도 계속 지원합니다.
  • CloudEvent 형식: 모든 이벤트 기반 함수는 소스에 관계없이 업계 표준 CloudEvents ( cloudevents.io)를 준수하여 일관된 개발자 환경을 보장합니다. 페이로드는 cloudevent.data 페이로드로 구성된 CloudEvent를 통해 전송되며 CloudEvent 표준을 구현합니다.

학습할 내용

  • Cloud Functions (2세대) 개요
  • HTTP 호출에 응답하는 함수를 작성하는 방법
  • Pub/Sub 메시지에 응답하는 함수를 작성하는 방법
  • Cloud Storage 이벤트에 응답하는 함수를 작성하는 방법
  • Cloud 감사 로그에 응답하는 함수를 작성하는 방법
  • 두 버전 간에 트래픽을 분할하는 방법
  • 최소 인스턴스로 콜드 스타트를 제거하는 방법
  • 동시 실행을 설정하는 방법

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

55efc1aaa7a4d3ad.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

7ffe5cbb04455448.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.

gcloud 설정

Cloud Shell에서 프로젝트 ID가 설정되고 PROJECT_ID 변수에 저장되었는지, REGIONus-west1로 설정되어 있는지 확인합니다.

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
REGION=us-west1

API 사용 설정

필요한 모든 서비스를 사용 설정합니다.

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. HTTP 함수

첫 번째 함수의 경우 HTTP 요청에 응답하는 인증된 Node.js 함수를 만들어 보겠습니다. 10분의 제한 시간을 사용하여 함수가 HTTP 요청에 응답하는 데 더 많은 시간을 가질 수 있는 방법을 살펴보겠습니다.

만들기

앱 폴더를 만들고 폴더로 이동합니다.

mkdir ~/hello-http && cd $_

HTTP 요청에만 응답하는 index.js 파일을 만듭니다.

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});

package.json 파일을 만들어 종속 항목을 지정합니다.

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

배포

함수를 배포합니다.

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --timeout 600s

이 단계에서 반드시 필요한 것은 아니지만 600초라는 제한 시간에 유의하세요. 이렇게 하면 함수가 HTTP 요청에 응답하는 시간 제한을 더 길게 설정할 수 있습니다.

함수가 배포되면 Cloud Console의 Cloud Functions 섹션에서 확인할 수 있습니다.

7541800e1e3f299f.png

테스트

다음 명령어를 사용하여 함수를 테스트합니다.

gcloud functions call nodejs-http-function \
  --gen2 --region $REGION

HTTP with Node.js in GCF 2nd gen! 메시지가 응답으로 표시됩니다.

4. Pub/Sub 함수

두 번째 함수의 경우 특정 주제에 게시된 Pub/Sub 메시지에 의해 트리거되는 Python 함수를 만들어 보겠습니다.

Pub/Sub 인증 토큰 설정

2021년 4월 8일 이전에 Pub/Sub 서비스 계정을 사용 설정한 경우 Pub/Sub 서비스 계정에 iam.serviceAccountTokenCreator 역할을 부여합니다.

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

만들기

샘플에 사용할 Pub/Sub 주제를 만듭니다.

TOPIC=cloud-functions-gen2-topic
gcloud pubsub topics create $TOPIC

앱 폴더를 만들고 폴더로 이동합니다.

mkdir ~/hello-pubsub && cd $_

CloudEvent ID가 포함된 메시지를 로깅하는 main.py 파일을 만듭니다.

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])

다음 콘텐츠로 requirements.txt 파일을 만들어 종속 항목을 지정합니다.

functions-framework==3.*

배포

함수를 배포합니다.

gcloud functions deploy python-pubsub-function \
  --gen2 \
  --runtime python39 \
  --entry-point hello_pubsub \
  --source . \
  --region $REGION \
  --trigger-topic $TOPIC

함수가 배포되면 Cloud Console의 Cloud Functions 섹션에서 확인할 수 있습니다.

107029714c32baff.png

테스트

주제에 메시지를 전송하여 함수를 테스트합니다.

gcloud pubsub topics publish $TOPIC --message="Hello World"

로그에 수신된 CloudEvent가 표시되어야 합니다.

gcloud functions logs read python-pubsub-function \
  --region $REGION --gen2 --format "value(log)"

5. Cloud Storage 함수

다음 함수로 Cloud Storage 버킷의 이벤트에 응답하는 Node.js 함수를 만들어 보겠습니다.

설정

Cloud Storage 함수를 사용하려면 Cloud Storage 서비스 계정에 pubsub.publisher IAM 역할을 부여하세요.

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

만들기

앱 폴더를 만들고 폴더로 이동합니다.

mkdir ~/hello-storage && cd $_

Cloud Storage 이벤트에만 응답하는 index.js 파일을 만듭니다.

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});

package.json 파일을 만들어 종속 항목을 지정합니다.

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

배포

먼저 Cloud Storage 버킷을 만들거나 이미 가지고 있는 기존 버킷을 사용합니다.

​​export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

함수를 배포합니다.

gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloStorage \
  --source . \
  --region $REGION \
  --trigger-bucket $BUCKET \
  --trigger-location $REGION

함수가 배포되면 Cloud 콘솔의 Cloud Functions 섹션에서 확인할 수 있습니다.

테스트

버킷에 파일을 업로드하여 함수를 테스트하세요.

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

로그에 수신된 CloudEvent가 표시되어야 합니다.

gcloud functions logs read nodejs-storage-function \
  --region $REGION --gen2 --limit=100 --format "value(log)"

6. Cloud 감사 로그 함수

다음 함수에서는 Compute Engine VM 인스턴스가 생성될 때 Cloud 감사 로그 이벤트를 수신하는 Node.js 함수를 만들어 보겠습니다. 이에 따라 새로 만든 VM에 VM 생성자를 지정하는 라벨이 추가됩니다.

새로 생성된 Compute Engine VM 확인하기

Compute Engine은 VM이 생성될 때 감사 로그 2개를 내보냅니다.

첫 번째는 VM 생성 시작 시 내보내지며 다음과 같이 표시됩니다.

8d394a481644c4b6.png

두 번째는 VM 생성 후에 내보내지며 다음과 같이 표시됩니다.

ee0e221d82887cd1.png

first: truelast: true 값이 있는 작업 필드를 확인합니다. 두 번째 감사 로그에는 인스턴스에 라벨을 지정하는 데 필요한 모든 정보가 포함되어 있으므로 last: true 플래그를 사용하여 Cloud Functions에서 인스턴스를 감지합니다.

설정

Cloud 감사 로그 함수를 사용하려면 Eventarc에 감사 로그를 사용 설정해야 합니다. 또한 eventarc.eventReceiver 역할이 있는 서비스 계정을 사용해야 합니다.

  1. Compute Engine API에 대한 관리자 읽기, 데이터 읽기, 데이터 쓰기 로그 유형을 Cloud 감사 로그를 사용 설정합니다.

76b7417ea4071241.png

  1. 기본 Compute Engine 서비스 계정에 eventarc.eventReceiver IAM 역할을 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

코드 가져오기

애플리케이션이 포함된 저장소를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

앱 디렉터리로 이동합니다.

cd eventarc-samples/gce-vm-labeler/gcf/nodejs

index.js 파일에는 CloudEvent로 래핑된 감사 로그를 수신하는 애플리케이션 코드가 포함되어 있습니다. 그런 다음 Compute Engine VM 인스턴스 세부정보를 추출하고 VM 인스턴스에 라벨을 설정합니다. index.js에 대해 자세히 알아보세요.

배포

이전과 같이 gcloud를 사용하여 함수를 배포할 수 있습니다. 함수가 --trigger-event-filters 플래그를 사용하여 Compute Engine 삽입에 대한 감사 로그를 필터링하는 방식을 확인합니다.

gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs16 \
  --entry-point labelVmCreation \
  --source . \
  --region $REGION \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location us-central1

Google Cloud 콘솔에서 함수를 배포하고 Eventarc 트리거를 추가할 수도 있습니다.

먼저 Cloud Functions 섹션으로 이동하여 2세대 환경으로 함수를 만듭니다.

8ba79a12ee152d8.png

Add Eventarc Trigger 버튼을 클릭합니다.

655346320a5e3631.png

그러면 오른쪽에 사이드 패널이 열리며 여기에서 Eventarc 트리거에 사용할 다양한 이벤트 제공자와 이벤트를 선택할 수 있습니다.

적절한 이벤트 제공업체와 이벤트를 선택한 다음 Save Trigger 아이콘을 클릭합니다.

7d24325ff06c9b05.png

마지막으로 다음 페이지에서 GitHub의 index.jspackage.json 파일을 index.jspackage.json 파일로 업데이트하고 Deploy 버튼을 클릭합니다.

f2e338eed2ccf5a2.png

테스트

감사 로그 함수를 테스트하려면 Cloud 콘솔에서 Compute Engine VM을 만들어야 합니다. gcloud로 VM을 만들 수도 있지만 감사 로그가 생성되지 않는 것 같습니다.

Cloud Console의 Compute Engine > VM 인스턴스 섹션으로 이동하여 새 VM을 만듭니다. VM 생성이 완료되면 기본 정보 섹션이나 다음 명령어를 사용하여 Cloud Console의 VM에 추가된 creator 라벨이 표시됩니다.

gcloud compute instances describe YOUR_VM_NAME

다음 예와 같이 출력에 라벨이 표시됩니다.

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

7. 트래픽 분할

Cloud Functions (2세대)는 함수의 여러 버전을 지원하여 여러 버전 간에 트래픽을 분할하고 함수를 이전 버전으로 롤백할 수 있습니다. 이는 2세대 함수가 내부적으로 Cloud Run 서비스이기 때문에 가능합니다.

이 단계에서는 함수의 두 버전을 배포한 다음 두 버전 간에 트래픽을 50-50으로 분할합니다.

만들기

앱 폴더를 만들고 폴더로 이동합니다.

mkdir ~/traffic-splitting && cd $_

색상 환경 변수를 읽고 해당 배경색으로 Hello World로 응답하는 Python 함수가 포함된 main.py 파일을 만듭니다.

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

배포

주황색 배경이 있는 함수의 첫 번째 버전을 배포합니다.

COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

이 시점에서 브라우저에서 HTTP 트리거 (위 배포 명령어의 URI 출력)를 보고 함수를 테스트하면 주황색 배경의 Hello World가 표시됩니다.

36ca0c5f39cc89cf.png

노란색 배경이 있는 두 번째 버전을 배포합니다.

COLOR=yellow
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

이는 최신 버전이므로 함수를 테스트하면 노란색 배경의 Hello World가 표시됩니다.

391286a08ad3cdde.png

트래픽 50-50 분할

주황색과 노란색 버전 간의 트래픽을 분할하려면 기본 Cloud Run 서비스의 버전 ID를 찾아야 합니다. 다음은 버전 ID를 확인하는 명령어입니다.

gcloud run revisions list --service hello-world-colored \
  --region $REGION --format 'value(REVISION)'

출력은 다음과 유사해야 합니다.

hello-world-colored-00001-man
hello-world-colored-00002-wok

이제 다음과 같이 두 버전 간의 트래픽을 분할합니다 (버전 이름에 따라 X-XXX 업데이트).

gcloud run services update-traffic hello-world-colored \
  --region $REGION \
  --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50

테스트

공개 URL을 방문하여 함수를 테스트합니다. 그 절반에는 주황색 버전이, 나머지 절반에는 노란색 버전이 표시됩니다.

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

자세한 내용은 롤백, 점진적 출시, 트래픽 마이그레이션을 참고하세요.

8. 최소 인스턴스

Cloud Functions (2세대)에서는 요청을 처리할 준비가 되어 있고 웜 상태로 유지할 최소 함수 인스턴스 수를 지정할 수 있습니다. 이는 콜드 스타트 수를 제한하는 데 유용합니다.

이 단계에서는 느린 초기화가 포함된 함수를 배포합니다. 콜드 스타트 문제를 살펴봅니다. 그런 다음 최소 인스턴스 값을 1로 설정하여 함수를 배포하여 콜드 스타트를 제거합니다.

만들기

앱 폴더를 만들고 해당 폴더로 이동합니다.

mkdir ~/min-instances && cd $_

main.go 파일을 만듭니다. 이 Go 서비스에는 긴 초기화를 시뮬레이션하기 위해 10초 동안 절전 모드로 전환되는 init 함수가 있습니다. HTTP 호출에 응답하는 HelloWorld 함수도 있습니다.

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}

배포

기본 최소 인스턴스 값이 0인 함수의 첫 번째 버전을 배포합니다.

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated

다음 명령어를 사용하여 함수를 테스트합니다.

gcloud functions call slow-function \
  --gen2 --region $REGION

첫 번째 호출에서 10초의 지연 (콜드 스타트)이 발생한 후 메시지가 표시됩니다. 후속 호출은 즉시 반환되어야 합니다.

최소 인스턴스 설정

첫 번째 요청에서 콜드 스타트를 제거하려면 다음과 같이 --min-instances 플래그를 1로 설정하여 함수를 다시 배포합니다.

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

테스트

함수를 다시 테스트합니다.

gcloud functions call slow-function \
  --gen2 --region $REGION

첫 번째 요청에서 더 이상 10초 지연이 표시되지 않습니다. 최소 인스턴스 덕분에 오랜 시간 사용하지 않은 후 첫 번째 호출 시 발생하는 콜드 스타트 문제가 사라졌습니다.

자세한 내용은 최소 인스턴스 사용을 참고하세요.

9. 동시 실행

Cloud Functions (2세대)에서 함수 인스턴스는 기본적으로 동시 요청 1개를 처리하지만 인스턴스에서 동시에 처리할 수 있는 동시 요청 수를 지정할 수 있습니다. 이는 동시 요청마다 새 함수 인스턴스를 만들 필요가 없으므로 콜드 스타트를 방지하는 데에도 유용할 수 있습니다.

이 단계에서는 이전 단계에서 느린 초기화로 함수를 사용합니다. 10개의 요청을 보내고 요청을 처리하기 위해 새 함수 인스턴스를 만들어야 하므로 콜드 스타트 문제를 다시 관찰합니다.

콜드 스타트 문제를 해결하기 위해 동시 실행 값이 100인 다른 함수를 배포합니다. 이제 10개의 요청이 콜드 스타트 문제를 일으키지 않으며 단일 함수 인스턴스가 모든 요청을 처리할 수 있습니다.

동시 실행이 없는 테스트

함수의 URL을 가져옵니다.

SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

hey라는 오픈소스 벤치마킹 도구를 사용하여 느린 함수에 동시 요청 10개를 보냅니다. hey는 Cloud Shell에 이미 설치되어 있습니다.

hey -n 10 -c 10 $SLOW_URL

hey의 출력에서 일부 요청이 시간이 오래 걸리는 것을 확인할 수 있습니다.

Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

요청을 처리하기 위해 더 많은 함수 인스턴스가 생성되기 때문입니다. 함수의 활성 인스턴스 수를 확인하면 어느 시점에 두 개 이상의 인스턴스가 생성되어 콜드 스타트 문제가 발생한 것을 확인할 수 있습니다.

9f5c6877836d62fb.png

배포

이전 함수와 동일한 새 함수를 배포합니다. 배포가 완료되면 동시 실행을 늘립니다.

gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

동시 실행 설정

함수의 기본 Cloud Run 서비스의 동시 실행을 100으로 설정합니다 (최대 1,000까지 가능). 이렇게 하면 단일 함수 인스턴스에서 최소 100개의 요청을 처리할 수 있습니다.

gcloud run services update slow-concurrent-function \
  --concurrency 100 \
  --cpu 1 \
  --region $REGION 

동시 실행으로 테스트

함수의 URL을 가져옵니다.

SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

그런 다음 hey를 사용하여 동시 요청 10개를 전송합니다.

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

hey의 출력에서 모든 요청이 빠르게 처리되는 것을 확인할 수 있습니다.

Summary:
  Total:        0.2164 secs
  Slowest:      0.2163 secs
  Fastest:      0.0921 secs
  Average:      0.2033 secs
  Requests/sec: 46.2028

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.092 [1]     |■■■■
  0.105 [0]     |
  0.117 [0]     |
  0.129 [0]     |
  0.142 [0]     |
  0.154 [0]     |
  0.167 [0]     |
  0.179 [0]     |
  0.191 [0]     |
  0.204 [0]     |
  0.216 [9]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

동시 실행 증가 덕분에 단일 함수 인스턴스가 모든 요청을 처리할 수 있었고 콜드 스타트 문제가 사라졌습니다.

자세한 내용은 동시 실행을 참고하세요.

10. 축하합니다.

Codelab을 완료했습니다. 축하합니다.

학습한 내용

  • Cloud Functions (2세대) 개요
  • HTTP 호출에 응답하는 함수를 작성하는 방법
  • Pub/Sub 메시지에 응답하는 함수를 작성하는 방법
  • Cloud Storage 이벤트에 응답하는 함수를 작성하는 방법
  • Cloud 감사 로그에 응답하는 함수를 작성하는 방법
  • 두 버전 간에 트래픽을 분할하는 방법
  • 최소 인스턴스로 콜드 스타트를 제거하는 방법
  • 동시 실행을 설정하는 방법