이벤트 기반 Cloud Run 함수 시작하기

1. 소개

개요

Cloud Run 함수는 익숙한 GCF 이벤트 패러다임과 함수 서명을 사용하여 워크로드를 배포하는 새로운 방법입니다. 독자적인 빌드 프로세스와 배포 구성을 사용하는 대신 Cloud Run 함수를 사용하면 Cloud Run에서 만든 기본 서비스를 직접 제어할 수 있습니다.

Cloud Run 함수로 Cloud Run 소스 배포의 간단한 UX를 제공하므로 개발자가 Cloud Run 구성을 사용하여 워크로드를 완벽하게 제어할 수 있습니다.

이 섹션에서는 Node. Google Cloud Storage 버킷에서 객체가 완료될 때마다 트리거되는 함수를 배포합니다.

이 Codelab에서는 아래 예시의 Nodejs 샘플을 사용합니다. 하지만 원하는 언어로 Cloud Functions 2세대 코드 샘플을 사용할 수 있습니다.

학습할 내용

  • 객체가 GCS 버킷에 업로드될 때마다 트리거되는 이벤트 기반 Cloud Run 함수를 배포하는 방법
  • Cloud Storage에서 이벤트를 수신하고 Cloud Run 함수를 호출하기 위해 적절한 역할로 서비스 계정을 만드는 방법

2. 환경 변수 설정 및 API 사용 설정

gcloud CLI 업데이트

이 Codelab을 실행하려면 최신 버전의 gcloud CLI가 설치되어 있어야 합니다. 다음 명령어를 실행하여 CLI를 업데이트할 수 있습니다.

gcloud components update

API 사용 설정

이 Codelab을 사용하기 전에 먼저 사용 설정해야 하는 API가 몇 가지 있습니다. 이 Codelab에서는 다음 API를 사용해야 합니다. 다음 명령어를 실행하여 이러한 API를 사용 설정할 수 있습니다.

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

환경 변수 설정

이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. 스토리지 버킷 및 서비스 계정 만들기

스토리지 버킷 만들기

다음 명령어를 실행하여 Cloud Storage 버킷을 만들 수 있습니다.

gsutil mb -l us-central1 gs://$BUCKET_NAME

서비스 계정 만들기

이 예시에서는 Cloud Storage에서 이벤트를 수신하고 Cloud Run 함수를 호출하는 데 필요한 EventArc 권한과 Cloud Run 호출자 역할이 있는 서비스 계정을 만듭니다.

먼저 서비스 계정을 만듭니다.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

다음으로, 트리거가 이벤트 제공자의 이벤트를 수신할 수 있도록 Eventarc 트리거와 연결된 서비스 계정에 프로젝트에 대한 Eventarc 이벤트 수신자 역할 (roles/eventarc.eventReceiver)을 부여합니다.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

그런 다음 함수를 호출할 수 있도록 서비스 계정에 Cloud Run 호출자 역할을 부여합니다.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. 함수 만들기 및 배포

먼저 소스 코드용 디렉터리를 만들고 해당 디렉터리로 cd하세요.

mkdir ../$SERVICE_NAME && cd $_

그런 다음, 다음 콘텐츠로 package.json 파일을 만듭니다.

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

다음으로, 다음 내용으로 index.js 파일을 만듭니다.

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

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

이제 다음 명령어를 실행하여 Cloud Run 함수를 배포할 수 있습니다.

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

다음 사항을 참고하세요.

  • –source 플래그는 Cloud Run에 실행 가능한 컨테이너 기반 서비스에 함수를 빌드하도록 지시하는 데 사용됩니다.
  • –function 플래그 (신규)는 호출하려는 함수 서명으로 새 서비스의 진입점을 설정하는 데 사용됩니다.
  • (선택사항) 함수가 공개적으로 호출되지 않도록 하는 –no-allow-unauthenticated

다음 명령어를 실행하여 새 서비스 crf-nodejs-event를 볼 수 있습니다.

gcloud beta run services describe $SERVICE_NAME

5. 이벤트 만들기

Google Cloud Storage에서 객체가 완료될 때마다 함수로 메시지를 전송하는 Eventarc 트리거를 만들 수 있습니다.

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

다음 사항을 참고하세요.

  • gcs-function-trigger는 트리거의 이름입니다.
  • crf-nodejs-event는 함수가 배포된 Cloud Run 서비스의 이름입니다.
  • –event-filters 플래그의 경우 버킷 이름에 gs:// 프리픽스를 사용하지 마세요.

Eventarc를 사용하여 Cloud Storage에서 트리거 서비스를 설정하는 방법에 대한 자세한 튜토리얼은 Cloud Run 문서(https://cloud.google.com/run/docs/tutorials/eventarc)에서 확인할 수 있습니다.

6. 함수 테스트

배포가 완료되면 서비스 URL이 표시됩니다. 함수를 호출하려면 아래와 같이 ID 토큰 또는 Cloud Run 호출자 역할이 있는 주 구성원 ID 토큰과 함께 인증된 요청을 전송해야 합니다.

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

함수를 배포하고 트리거를 만들었으므로 이제 함수를 호출할 수 있습니다.

파일을 만들어 Cloud Storage 버킷에 업로드합니다. Cloud 콘솔 웹 인터페이스 또는 gsutil CLI 도구(예:

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

파일이 업로드되면 이벤트가 생성되고 함수가 객체에 대한 몇 가지 기본 정보를 출력합니다. 예: 파일 이름 이 출력은 Cloud 콘솔의 함수에 대한 로그 항목에서 찾을 수 있습니다. 또는 gcloud CLI를 사용하여 이 출력을 쿼리할 수 있습니다.

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

다음과 같은 출력이 표시됩니다.

"textPayload": "File: test.txt"

7. 축하합니다.

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

Cloud Run 함수 문서를 검토하는 것이 좋습니다.

학습한 내용

  • 객체가 GCS 버킷에 업로드될 때마다 트리거되는 이벤트 기반 Cloud Run 함수를 배포하는 방법
  • Cloud Storage에서 이벤트를 수신하고 Cloud Run 함수를 호출하기 위해 적절한 역할로 서비스 계정을 만드는 방법

8. 삭제

실수로 인한 요금 청구를 방지하려면(예: 이 Cloud Run 서비스가 무료 등급의 월별 Cloud Run 호출 할당보다 실수로 더 많이 호출되는 경우) Cloud Run 서비스를 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.

Cloud Run 서비스를 삭제하려면 Cloud Run Cloud 콘솔(https://console.cloud.google.com/run/)으로 이동하여 이 Codelab에서 만든 crf-event-codelab 서비스를 삭제합니다.

전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택한 후 삭제를 선택하면 됩니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하면 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.