Cloud Run 함수 (2세대)를 사용한 확장
Cloud Run 함수를 사용하면 Firestore 데이터베이스의 변경으로 트리거되는 이벤트를 처리하는 코드를 배포할 수 있습니다. 이렇게 하면 자체 서버를 실행하지 않고도 서버 측 기능을 추가할 수 있습니다.
Cloud Run Functions (2세대)로 Firestore 확장
Cloud Run 함수 (2세대)는 Firestore 이벤트에 연결된 핸들러를 만들 수 있도록 다음 Firestore 이벤트 트리거를 지원합니다.
이벤트 유형 | 트리거 |
---|---|
google.cloud.firestore.document.v1.created |
문서를 처음으로 기록할 때 트리거됩니다. |
google.cloud.firestore.document.v1.updated |
이미 존재하는 문서에서 값이 변경되었을 때 트리거됩니다. |
google.cloud.firestore.document.v1.deleted |
문서가 삭제될 때 트리거됩니다. |
google.cloud.firestore.document.v1.written |
created , updated 또는 deleted 가 트리거될 때 트리거됩니다. |
google.cloud.firestore.document.v1.created.withAuthContext |
created 와 동일하지만 인증 정보를 추가합니다. |
google.cloud.firestore.document.v1.updated.withAuthContext |
updated 와 동일하지만 인증 정보를 추가합니다. |
google.cloud.firestore.document.v1.deleted.withAuthContext |
deleted 와 동일하지만 인증 정보를 추가합니다. |
google.cloud.firestore.document.v1.written.withAuthContext |
written 와 동일하지만 인증 정보를 추가합니다. |
Firestore 이벤트는 문서 변경 시에만 트리거됩니다. 데이터가 변경되지 않는 Firestore 문서를 업데이트(노옵스(no-ops) 쓰기)할 때에는 업데이트 또는 쓰기 이벤트가 생성되지 않습니다. 특정 필드에 이벤트를 추가할 수 없습니다.
이벤트에 인증 컨텍스트 포함
이벤트에 대한 추가 인증 정보를 포함하려면 withAuthContext
확장자가 포함된 이벤트 트리거를 사용합니다. 이 확장자는 이벤트를 트리거한 주 구성원에 대한 추가 정보를 제공합니다. 기본 이벤트에 반환된 정보 외에도 authtype
및 authid
속성을 추가합니다. 속성 값에 대한 자세한 내용은 authcontext
참조를 확인하세요.
Firestore 트리거 함수 작성
Firestore 이벤트에 응답하는 함수를 작성하려면 배포 중에 다음을 지정할 수 있도록 준비합니다.
- 트리거 이벤트 유형
- 함수와 연관된 문서를 선택하는 트리거 이벤트 필터
- 실행할 함수 코드
트리거 이벤트 필터
이벤트 필터를 지정할 때 정확한 문서 일치 또는 경로 패턴을 지정할 수 있습니다. 경로 패턴을 사용하여 와일드 카드 *
또는 **
와 여러 문서를 일치시킵니다.
예를 들어 다음 문서의 변경사항에 응답할 수 있습니다.
users/marie
와일드 카드(*
또는 **
)를 사용하여 패턴과 일치하는 문서의 변경사항에 응답합니다. 와일드 카드 *
는 단일 세그먼트와 일치하고, 다중 세그먼트 와일드 카드 **
는 패턴의 0개 이상의 세그먼트와 일치합니다.
단일 세그먼트 일치(*
)이 경우 명명된 캡처 그룹을 사용할 수도 있습니다. 예를 들면 users/{userId}
입니다.
예를 들면 다음과 같습니다.
패턴 | 설명 |
---|---|
/users/* 또는 /users/{userId} |
/users 컬렉션의 모든 문서와 일치합니다. /users/marie/messages/33e2IxYBD9enzS50SJ68 과 같은 하위 컬렉션의 문서와 일치하지 않습니다. |
/users/** |
/users 컬렉션의 모든 문서 및 /users/marie/messages/33e2IxYBD9enzS50SJ68 과 같은 하위 컬렉션의 문서를 일치시킵니다. |
경로 패턴에 대한 자세한 내용은 Eventarc 경로 패턴을 참조하세요.
와일드 카드를 사용할 때도 트리거는 항상 문서를 가리켜야 합니다.
예를 들어 {messageCollectionId=*}
는 컬렉션이므로 users/{userId=*}/{messageCollectionId=*}
는 유효하지 않습니다. 그러나 {messageId=*}
가 항상 문서를 가리키므로 users/{userId=*}/{messageCollectionId}/{messageId=*}
는 유효합니다.
예제 함수
다음 샘플에서는 Firestore 이벤트를 수신하는 방법을 보여줍니다.
이벤트와 관련된 문서 데이터로 작업하려면 value
및 old_value
필드를 확인하세요.
value
: 사후 작업 문서 스냅샷을 포함하는Document
객체입니다. 삭제 이벤트의 경우 이 필드가 채워지지 않습니다.old_value
: 사전 작업 문서 스냅샷을 포함하는Document
객체입니다. 이 필드는 업데이트 및 삭제 이벤트에 대해서만 채워집니다.
Go
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
protobufjs를 사용하여 이벤트 데이터를 디코딩합니다. 소스에google.events.cloud.firestore.v1
data.proto
를 포함합니다.
Python
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
다음 예에서는 영향을 받는 문서의 original
필드에 추가된 문자열을 대문자로 변환하고 새 값을 동일한 문서에 작성합니다.
Go
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
protobufjs를 사용하여 이벤트 데이터를 디코딩합니다. 소스에google.events.cloud.firestore.v1
data.proto
를 포함합니다.
Python
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Firestore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
소스에 proto 종속 항목 포함
함수의 소스 디렉터리에 Firestore data.proto
파일을 포함해야 합니다. 이 파일은 소스 디렉터리에 포함해야 하는 다음 proto를 가져옵니다.
종속 항목에 동일한 디렉터리 구조를 사용합니다. 예를 들어 struct.proto
를 google/protobuf
내에 배치합니다.
이러한 파일은 이벤트 데이터를 디코딩하기 위해 필요합니다. 함수 소스에 이러한 파일이 포함되지 않으면 실행 시 오류가 반환됩니다.
이벤트 속성
각 이벤트에는 이벤트가 트리거된 시간과 같은 이벤트 정보가 포함된 데이터 속성이 포함됩니다. Firestore는 이벤트와 관련된 데이터베이스 및 문서에 대한 추가 데이터를 추가합니다. 다음과 같이 이러한 속성에 액세스할 수 있습니다.
자바
logger.info("Function triggered by event on: " + event.getSource()); logger.info("Event type: " + event.getType()); logger.info("Event time " + event.getTime()); logger.info("Event project: " + event.getExtension("project")); logger.info("Event location: " + event.getExtension("location")); logger.info("Database name: " + event.getExtension("database")); logger.info("Database document: " + event.getExtension("document")); // For withAuthContext events logger.info("Auth information: " + event.getExtension("authid")); logger.info("Auth information: " + event.getExtension("authtype"));
Node.js
console.log(`Function triggered by event on: ${cloudEvent.source}`); console.log(`Event type: ${cloudEvent.type}`); console.log(`Event time: ${cloudEvent.time}`); console.log(`Event project: ${cloudEvent.project}`); console.log(`Event location: ${cloudEvent.location}`); console.log(`Database name: ${cloudEvent.database}`); console.log(`Document name: ${cloudEvent.document}`); // For withAuthContext events console.log(`Auth information: ${cloudEvent.authid}`); console.log(`Auth information: ${cloudEvent.authtype}`);
Python
print(f"Function triggered by change to: {cloud_event['source']}") print(f"Event type: {cloud_event['type']}") print(f"Event time: {cloud_event['time']}") print(f"Event project: {cloud_event['project']}") print(f"Location: {cloud_event['location']}") print(f"Database name: {cloud_event['database']}") print(f"Document: {cloud_event['document']}") // For withAuthContext events print(f"Auth information: {cloud_event['authid']}") print(f"Auth information: {cloud_event['authtype']}")
함수 배포
Cloud Run 함수 배포 사용자에게는 Cloud Run 함수 개발자 IAM 역할 또는 동일 권한을 포함하는 역할이 있어야 합니다. 또한 배포 추가 구성을 참조하세요.
gcloud CLI 또는 Google Cloud 콘솔을 사용하여 함수를 배포할 수 있습니다. 아래 예시는 gcloud CLI를 사용한 배포를 보여줍니다. Google Cloud 콘솔을 사용한 배포에 대한 자세한 내용은 Cloud Run 함수 배포를 참고하세요.
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
gcloud functions deploy
명령어를 사용하여 함수를 배포합니다.gcloud functions deploy YOUR_FUNCTION_NAME \ --gen2 \ --region=FUNCTION_LOCATION \ --trigger-location=TRIGGER_LOCATION \ --runtime=YOUR_RUNTIME \ --source=YOUR_SOURCE_LOCATION \ --entry-point=YOUR_CODE_ENTRYPOINT \ --trigger-event-filters="type=EVENT_FILTER_TYPE" \ --trigger-event-filters="database=DATABASE" \ --trigger-event-filters-path-pattern="document=DOCUMENT" \
첫 번째 인수인
YOUR_FUNCTION_NAME
은 배포된 함수의 이름입니다. 함수 이름은 문자로 시작해야 합니다. 이어서 최대 62자(영문 기준)의 문자, 숫자, 하이픈, 밑줄이 와야 하며 문자나 숫자로 끝나야 합니다.--gen2
플래그는 Cloud Run 함수(2세대)에 배포하도록 지정합니다. 이 플래그를 생략하면 Cloud Run 함수(1세대)에 배포됩니다.--region
플래그는 함수를 배포할 리전을 지정합니다.근접성을 극대화하려면 Firestore 데이터베이스와 가까운 리전으로 설정합니다. Firestore 데이터베이스가 멀티 리전 위치에 있는 경우
nam5
의 데이터베이스에 대해us-central1
로 설정하고eur3
의 데이터베이스에 대해europe-west4
로 설정합니다. 리전 Firestore 위치의 경우 동일한 리전으로 설정합니다.--trigger-location
플래그는 트리거 위치를 지정합니다. 이 플래그를 Firestore 데이터베이스의 위치로 설정해야 합니다.--runtime
플래그는 함수에 사용되는 언어 런타임을 지정합니다. Cloud Run Functions는 여러 런타임을 지원합니다. 자세한 내용은 런타임을 참조하세요.--source
플래그는 함수 소스 코드의 위치를 지정합니다. 세부정보는 다음 단계를 참조하세요.--entry-point
플래그는 소스 코드에서 함수의 진입점을 지정합니다. 이것은 함수가 실행될 때 수행되는 코드입니다. 이 플래그의 값은 소스 코드에 있는 함수 이름 또는 정규화된 클래스 이름이어야 합니다. 자세한 내용은 함수 진입점을 참조하세요.EVENT_FILTER_TYPE
: Firestore는 다음 이벤트 유형을 지원합니다.google.cloud.firestore.document.v1.created
: 문서를 처음으로 작성하면 이벤트가 전송됩니다.google.cloud.firestore.document.v1.updated
: 문서가 이미 존재하고 값이 변경되면 이벤트가 전송됩니다.google.cloud.firestore.document.v1.deleted
: 문서가 삭제되면 이벤트가 전송됩니다.google.cloud.firestore.document.v1.written
: 문서가 생성, 업데이트 또는 삭제되면 이벤트가 전송됩니다.google.cloud.firestore.document.v1.created.withAuthContext
: 문서가 처음 기록되고 이벤트에 추가 인증 정보가 포함되면 이벤트가 전송됩니다.google.cloud.firestore.document.v1.updated.withAuthContext
: 문서가 이미 존재하고 값이 변경되면 이벤트가 전송됩니다. 추가 인증 정보가 포함됩니다.google.cloud.firestore.document.v1.deleted.withAuthContext
: 문서가 삭제되면 이벤트가 전송됩니다. 추가 인증 정보가 포함됩니다.google.cloud.firestore.document.v1.written.withAuthContext
: 문서가 생성, 업데이트 또는 삭제되고 이벤트가 발생하면 이벤트가 전송됩니다. 추가 인증 정보가 포함됩니다.
DATABASE
: Firestore 데이터베이스입니다. 기본 데이터베이스 이름에는(default)
를 사용합니다.DOCUMENT
: 데이터가 생성, 업데이트 또는 삭제될 때 이벤트를 트리거하는 데이터베이스 경로입니다. 연산자는 다음 중 하나일 수 있습니다.- 같음, 예:
--trigger-event-filters=document='users/marie'
- 경로 패턴, 예:
--trigger-event-filters-path-pattern=document='users/*'
자세한 내용은 경로 패턴 이해를 참조하세요.
- 같음, 예:
함수를 배포할 때 선택적으로 추가 구성, 네트워킹, 보안 옵션을 지정할 수 있습니다.
배포 명령어와 플래그에 대한 자세한 내용은
gcloud functions deploy
문서를 참조하세요.
배포 예시
다음 예시에서는 Google Cloud CLI를 사용한 배포를 보여줍니다.
us-west2
리전의 데이터베이스에 함수를 배포합니다.
gcloud functions deploy gcfv2-trigger-firestore-node \
--gen2 \
--region=us-west2 \
--trigger-location=us-west2 \
--runtime=nodejs18 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=makeUpperCase \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
nam5
멀티 리전의 데이터베이스에 함수를 배포합니다.
gcloud functions deploy gcfv2-trigger-firestore-python \
--gen2 \
--region=us-central1 \
--trigger-location=nam5 \
--runtime=python311 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=make_upper_case \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written.withAuthContext \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
제한사항
Cloud Run Functions용 Firestore 트리거의 다음 제한사항에 유의하세요.
- Cloud Run Functions(1세대)는 Firestore 기본 모드의 기존 '(기본값)' 데이터베이스를 기본 요건으로 합니다. Firestore 이름이 지정된 데이터베이스 또는 Datastore 모드는 지원하지 않습니다. 이 경우 Cloud Run Functions(2세대)를 사용하여 이벤트를 구성하세요.
- 순서는 보장되지 않습니다. 급격하게 변경하면 예기치 않은 순서로 함수 호출이 트리거될 수 있습니다.
- 이벤트는 최소 1회 전송되지만 하나의 이벤트에 함수가 여러 번 호출될 수 있습니다. 정확히 한 번에 처리하는 메커니즘에 의존하지 말고 멱등 함수를 작성하세요.
- Datastore 모드의 Cloud Firestore에는 Cloud Run Functions(2세대)가 필요합니다. Cloud Run Functions(1세대)는 Datastore 모드를 지원하지 않습니다.
- 트리거는 단일 데이터베이스와 연결됩니다. 여러 데이터베이스와 일치하는 트리거를 만들 수 없습니다.
- 데이터베이스를 삭제해도 해당 데이터베이스의 트리거가 자동으로 삭제되지 않습니다. 트리거가 이벤트 제공을 중지하지만 트리거를 삭제하기 전까지 계속 존재합니다.
- 일치하는 이벤트가 최대 요청 크기를 초과하면 이벤트가 Cloud Run Functions(1세대)로 전달되지 않을 수 있습니다.
- 요청 크기로 인해 전송되지 않은 이벤트는 플랫폼 로그에 로깅되고 프로젝트의 로그 사용량에 반영됩니다.
- 이러한 로그는 로그 탐색기에서 '크기가 1세대... 한도를 초과하여 Cloud 함수에 이벤트를 전송할 수 없음'이라는
error
심각도의 메시지와 함께 확인할 수 있습니다.functionName
필드 아래에서 함수 이름을 찾을 수 있습니다.receiveTimestamp
필드가 지금부터 1시간 이내인 경우 타임스탬프 전후의 스냅샷과 함께 해당 문서를 읽어 실제 이벤트 콘텐츠를 추론할 수 있습니다. - 이러한 주기를 피하려면 다음을 수행하면 됩니다.
- Cloud Run Functions(2세대)로 마이그레이션 및 업그레이드
- 문서 크기 줄이기
- 문제의 Cloud Run Functions 삭제
- 제외를 사용하여 로깅 자체를 사용 중지할 수 있지만 그래도 문제가 되는 이벤트가 전송되지 않습니다.
Eventarc 및 Firestore 위치
Eventarc는 Firestore 이벤트 트리거에서 멀티 리전을 지원하지 않지만 멀티 리전 위치에서 Firestore 데이터베이스에 대한 트리거를 만들 수 있습니다. Eventarc는 Firestore 멀티 리전 위치를 다음 Eventarc 리전에 매핑합니다.
Firestore 멀티 리전 | Eventarc 리전 |
---|---|
nam5 |
us-central1 |
eur3 |
europe-west4 |
Cloud Run 함수 2세대와 1세대의 차이점
Cloud Run 함수 (2세대)는 모든 런타임에 Eventarc 이벤트를 사용합니다. 이전에는 Cloud Run 함수 (1세대)에서 일부 런타임에만 Eventarc 이벤트를 사용했습니다. Eventarc 이벤트는 Cloud Run 함수 (1세대)와 다음과 같은 차이점이 있습니다.
Eventarc용 Firestore 트리거는 Cloud Run 함수 외에도 추가 대상을 지원합니다.
CloudEvents
는 Cloud Run, GKE, Workflows를 포함하되 이에 국한되지 않는 여러 대상으로 라우팅할 수 있습니다.Eventarc의 Firestore 트리거는 데이터베이스 쓰기 작업이 시작될 때 트리거 정의를 가져와서 이 정의를 사용하여 Firestore에서 이벤트를 내보낼지 결정합니다. 쓰기 작업은 실행 중에 발생할 수 있는 트리거 정의 변경사항을 고려하지 않습니다.
Cloud Run 함수 (1세대)는 데이터베이스 쓰기 평가 중에 트리거 정의를 검색하고 평가 중에 트리거 변경사항을 실행하면 Firestore에서 이벤트를 내보낼지 여부에 영향을 줄 수 있습니다.
자세한 내용은 Cloud Run 함수 버전 비교를 참고하세요.