1. 소개
Google Cloud Run Functions는 이벤트 기반 서버리스 컴퓨팅 플랫폼입니다. Cloud Run 함수를 사용하면 리소스 프로비저닝이나 요구사항 변경에 맞춰 확장하는 데 대한 걱정 없이 코드를 작성할 수 있습니다.
Cloud Run Functions에는 다음과 같은 두 가지 유형이 있습니다.
- HTTP 함수는 HTTP 요청에 응답합니다.
- 이벤트 함수는 메시지가 Cloud Pub/Sub에 게시되거나 파일이 Cloud Storage에 업로드되는 등의 이벤트에 의해 트리거됩니다.
이 Codelab에서는 C#으로 Cloud Run 함수를 만드는 방법을 알아봅니다. 더 구체적으로 말하면 다양한 Google Cloud 소스의 HTTP 및 CloudEvents에 응답하는 C# 함수를 배포합니다.
학습할 내용
- .NET용 Functions 프레임워크
- HTTP 함수를 작성하는 방법
- Cloud Storage 이벤트에 응답하는 이벤트 트리거 함수를 작성하는 방법
- Cloud Pub/Sub 이벤트에 응답하는 이벤트 트리거 함수를 작성하는 방법
- 모든 유형의 이벤트에 응답하는 이벤트 트리거 함수를 작성하는 방법
2. 설정 및 요구사항
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID(일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. 시작하기 전에
Cloud Shell에서 다음 명령어를 실행하여 필요한 서비스를 사용 설정합니다.
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
그런 다음 리전을 설정합니다.
REGION=<YOUR_REGION>
이 Codelab에서는 Cloud Storage에서 이벤트를 수신하고 Cloud Run 함수를 호출하는 데 필요한 Eventarc 권한과 Cloud Run 호출자 역할이 있는 서비스 계정을 만듭니다.
먼저 서비스 계정을 만듭니다.
PROJECT_ID=$(gcloud config get-value core/project) 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. .NET용 함수 프레임워크
.NET용 Functions 프레임워크는 이식 가능한 .NET 함수를 작성하기 위한 오픈소스 FaaS (서비스로서의 기능) 프레임워크로, Google Cloud Functions팀에서 제공합니다.
함수 프레임워크를 사용하면 다음을 포함한 여러 다양한 환경에서 실행되는 가벼운 함수를 만들 수 있습니다.
- Google Cloud Run 함수
- 로컬 개발 머신
- Cloud Run 및 GKE의 Cloud Run
- Knative 기반 환경
이 Codelab에서는 .NET용 Functions 프레임워크와 템플릿을 사용하여 C#로 Cloud Functions를 만들고 배포합니다.
Cloud Shell에서 다음 명령어를 실행하여 dotnet
용 Cloud Functions 템플릿을 설치합니다.
dotnet new install Google.Cloud.Functions.Templates
이렇게 하면 dotnet
용 템플릿 3개가 설치됩니다. 각 템플릿은 C#, F#, VB로 제공됩니다 (단, 이 실습에서는 C#만 사용하겠습니다). 다음을 실행하여 템플릿이 설치되었는지 확인할 수 있습니다.
dotnet new list Templates Short Name ----------------------------------------------------------------------- Google Cloud Functions CloudEvent Function gcf-event Google Cloud Functions CloudEvent Function (Untyped) gcf-untyped-event Google Cloud Functions HttpFunction gcf-http
5. HTTP 함수
HTTP 요청에 응답하는 HTTP 함수를 만들고 배포합니다.
gcf-http
템플릿을 사용하여 HTTP 함수를 만듭니다.
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
이렇게 하면 프로젝트와 HTTP 요청에 응답하는 Function.cs
파일이 생성됩니다.
.csproj
파일에서 타겟 프레임워크를 net8.0
로 변경합니다.
<TargetFramework>net8.0</TargetFramework>
Cloud Run 함수를 Cloud Run에 직접 배포하려면 다음 명령어를 실행합니다.
gcloud beta run deploy hello-http-function \ --source . \ --function HelloHttp.Function \ --base-image dotnet8 \ --region $REGION \ --allow-unauthenticated
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용합니다.
gcloud functions deploy hello-http-function \ --allow-unauthenticated \ --entry-point HelloHttp.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-http
함수가 배포되면 다음 curl 명령어를 사용하여 함수를 호출할 수 있습니다.
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. CloudEvent 함수 - GCS
Google Cloud Storage(GCS) 이벤트에 응답하는 CloudEvent 함수를 만들고 배포합니다.
먼저 Cloud Storage 버킷을 만듭니다. 나중에 이벤트를 수신 대기할 버킷입니다.
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}" gsutil mb -l us-central1 gs://${BUCKET_NAME}
gcf-event
템플릿을 사용하여 CloudEvent 함수를 만듭니다.
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
이렇게 하면 프로젝트와 CloudEvent
요청에 응답하는 Function.cs
파일이 생성됩니다. 또한 CloudEvent
의 데이터를 StorageObjectData
로 파싱합니다.
.csproj
파일에서 타겟 프레임워크를 net8.0
로 변경합니다.
<TargetFramework>net8.0</TargetFramework>
Cloud Run 함수를 Cloud Run에 직접 배포하려면 먼저 함수를 배포한 다음 함수의 트리거를 만듭니다.
gcloud beta run deploy hello-gcs-function \ --source . \ --function HelloGcs.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
이제 Cloud Run 함수의 트리거를 만듭니다.
BUCKET_REGION=$REGION gcloud eventarc triggers create hello-gcs-function-trigger \ --location=$REGION \ --destination-run-service=hello-gcs-function \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하여 trigger-event
및 trigger-resource
플래그로 함수를 배포할 수 있습니다.
gcloud functions deploy hello-gcs-function \ --allow-unauthenticated \ --entry-point HelloGcs.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-event google.storage.object.finalize \ --trigger-resource ${BUCKET_NAME} \ --service-account=$SERVICE_ACCOUNT_ADDRESS
몇 분 후 Cloud 콘솔에 함수가 표시됩니다.
스토리지 버킷에 파일을 업로드하여 함수를 트리거합니다.
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
로그를 읽어 함수가 트리거되었는지 확인합니다.
Cloud Run 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2세대 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud functions logs read hello-gcs-function \ --gen2 \ --region us-central1
7. CloudEvent 함수 - Pub/Sub
Cloud Pub/Sub 이벤트에 응답하는 CloudEvent 함수를 만들고 배포합니다.
먼저 이벤트를 내보낼 Cloud Pub/Sub 주제를 만듭니다.
TOPIC_NAME=cloud-functions-topic gcloud pubsub topics create ${TOPIC_NAME}
gcf-event
템플릿을 사용하여 CloudEvent 함수를 만듭니다.
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
이렇게 하면 프로젝트와 CloudEvent
요청에 응답하는 Function.cs
파일이 생성됩니다. 또한 기본적으로 CloudEvent
의 데이터를 StorageObjectData
로 파싱합니다.
.csproj
파일에서 타겟 프레임워크를 net8.0
로 변경합니다.
<TargetFramework>net8.0</TargetFramework>
StorageObjectData
을 MessagePublishedData
로 변경하여 Pub/Sub 메시지를 파싱합니다. Google.Events.Protobuf.Cloud.Storage.V1
를 Google.Events.Protobuf.Cloud.PubSub.V1
로 변경합니다.
최종적으로 함수는 다음과 같습니다.
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Cloud.PubSub.V1; using System; using System.Threading; using System.Threading.Tasks; namespace HelloPubSub; public class Function : ICloudEventFunction<MessagePublishedData> { public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken) { var nameFromMessage = data.Message?.TextData; var name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage; Console.WriteLine($"Hello {name}"); return Task.CompletedTask; } }
Cloud Run 함수를 Cloud Run에 직접 배포하려면 먼저 함수를 배포한 다음 함수의 트리거를 만듭니다.
gcloud beta run deploy hello-pubsub-function \ --source . \ --function HelloPubSub.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated \ --service-account=$SERVICE_ACCOUNT_ADDRESS
이제 Cloud Run 함수의 트리거를 만듭니다.
gcloud eventarc triggers create my-pubsub-trigger \ --location=$REGION \ --service-account=$SERVICE_ACCOUNT_ADDRESS \ --destination-run-service=hello-pubsub-function \ --destination-run-region=$REGION \ --destination-run-path="/" \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC_NAME
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하여 trigger-topic
플래그를 사용하여 함수를 배포하면 됩니다.
gcloud functions deploy hello-pubsub-function \ --allow-unauthenticated \ --entry-point HelloPubSub.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-topic ${TOPIC_NAME}
몇 분 후 Cloud 콘솔에 함수가 표시됩니다.
주제에 메시지를 게시하여 함수를 트리거합니다.
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
로그를 읽어 함수가 트리거되었는지 확인합니다.
Cloud Run 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
2세대 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud functions logs read hello-pubsub-function \ --gen2 \ --region us-central1
8. CloudEvent 함수 - 유형 없음
CloudEvents를 실험 중이며 아직 커밋할 페이로드 데이터 모델이 없거나 함수가 모든 Cloud 이벤트를 처리할 수 있도록 하려면 유형이 지정되지 않은 CloudEvent 함수를 사용하면 됩니다.
gcf-untyped-event
템플릿을 사용하여 CloudEvent 함수를 만듭니다.
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
이렇게 하면 CloudEvent
의 데이터를 파싱하지 않고도 CloudEvent
요청에 응답하는 프로젝트와 Function.cs
파일이 생성됩니다.
.csproj
파일에서 대상 프레임워크를 net8.0
로 변경합니다.
<TargetFramework>net8.0</TargetFramework>
Cloud Run 함수를 Cloud Run에 직접 배포하려면 먼저 함수를 배포한 다음 함수의 트리거를 만듭니다.
gcloud beta run deploy hello-untyped-function \ --source . \ --function HelloUntyped.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
이제 Cloud Run 함수의 트리거를 만듭니다.
BUCKET_REGION=$REGION gcloud eventarc triggers create hello-untyped-function-trigger \ --location=$REGION \ --destination-run-service=hello-untyped-function \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
Cloud Functions 2세대로 배포하려면 다음 명령어를 사용하여 trigger-event
및 trigger-resource
플래그를 사용하여 함수를 배포할 수 있습니다.
gcloud functions deploy hello-untyped-function \ --allow-unauthenticated \ --entry-point HelloUntyped.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-event google.storage.object.finalize \ --trigger-resource ${BUCKET_NAME}
이 함수는 파일이 스토리지 버킷에 업로드될 때 트리거됩니다.
몇 분 후 Cloud Console에 함수가 표시됩니다.
스토리지 버킷에 파일을 업로드하여 함수를 트리거합니다.
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
로그를 읽어 함수가 트리거되었는지 확인합니다.
Cloud Run 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2세대 함수의 경우 다음 명령어를 실행할 수 있습니다.
gcloud functions logs read hello-untyped-function \ --gen2 \ --region us-central1
9. 축하합니다.
축하합니다. Codelab을 완료했습니다.
학습한 내용
- .NET용 Functions 프레임워크
- HTTP Cloud Functions를 작성하는 방법
- Cloud Storage 이벤트에 응답하는 CloudEvent 함수를 작성하는 방법
- Cloud Pub/Sub 이벤트에 응답하는 CloudEvent 함수를 작성하는 방법
- 모든 이벤트 유형에 응답하는 CloudEvent 함수를 작성하는 방법