원격 함수 작업

BigQuery 원격 함수를 사용하면 SQL 및 JavaScript 이외의 언어로 또는 BigQuery 사용자 정의 함수에서 허용되지 않는 라이브러리 또는 서비스를 사용해서 함수를 구현할 수 있습니다.

개요

BigQuery 원격 함수를 사용하면 Cloud FunctionsCloud Run과의 직접 통합을 제공함으로써 BigQuery 외부 소프트웨어에서 GoogleSQL 기능을 사용할 수 있습니다. BigQuery 원격 함수를 사용하면 지원되는 언어로 구현된 Cloud Functions 또는 Cloud Run에 함수를 배포한 후 GoogleSQL 쿼리에서 호출할 수 있습니다.

워크플로

  1. Cloud Functions 또는 Cloud Run에서 HTTP 엔드포인트 만들기
  2. BigQuery에서 원격 함수를 만듭니다.
    1. CLOUD_RESOURCE 유형의 연결을 만듭니다.
    2. 원격 함수를 만듭니다.
  3. 다른 사용자 정의 함수와 같이 쿼리에서 원격 함수를 사용합니다.

제한사항

  • 원격 함수는 인수 유형 또는 반환 유형과 같은 데이터 유형 중 하나만 지원합니다.

    • 불리언
    • 바이트
    • 숫자
    • 문자열
    • 날짜
    • 날짜/시간
    • 시간
    • 타임스탬프
    • JSON

    원격 함수는 ARRAY, STRUCT, INTERVAL 또는 GEOGRAPHY 유형을 지원하지 않습니다.

  • 임시 원격 함수를 만들 수 없습니다.

  • 테이블 값 원격 함수는 만들 수 없습니다.

  • 구체화된 보기를 만들 때 원격 함수를 사용할 수 없습니다.

  • 원격 함수의 반환 값은 항상 확정되지 않은 것으로 간주되므로 원격 함수를 호출하는 쿼리 결과는 캐시되지 않습니다.

  • 일시적인 네트워크 오류 또는 BigQuery 내부 오류로 인해 응답이 성공한 후에도 엔드포인트에 동일한 데이터가 포함된 반복 요청이 표시될 수 있습니다.

  • 짧은 조건으로 인해 일부 행에 대해 원격 함수 평가를 건너뛰는 경우(예: 조건식 또는 WHEN [NOT] MATCHED이 있는 MERGE)에서는 일괄 처리를 원격 함수에 사용하지 않습니다. 이 경우 HTTP 요청 본문calls 필드에는 정확히 하나의 요소가 있습니다.

  • 원격 함수와 연결된 데이터 세트가 리전 간 데이터 세트 복제를 통해 대상 리전에 복제되는 경우 원격 함수는 자신이 생성된 리전에서만 쿼리될 수 있습니다.

엔드포인트 만들기

비즈니스 로직을 구현할 수 있는 원격 함수를 만들려면 Cloud Functions 또는 Cloud Run을 사용하여 HTTP 엔드포인트를 만들어야 합니다. 엔드포인트는 단일 HTTP POST 요청에서 행 배치를 처리하고 배치 결과를 HTTP 응답으로 반환할 수 있어야 합니다.

BigQuery DataFrame을 사용하여 원격 함수를 만드는 경우 HTTP 엔드포인트를 수동으로 만들 필요가 없으며, 서비스가 이를 자동으로 수행합니다

Cloud 함수를 작성, 배포, 테스트, 유지보수하는 방법은 Cloud Functions 튜토리얼 및 기타 Cloud Functions 문서를 참조하세요.

Cloud Run 서비스를 작성, 배포, 테스트, 유지보수하는 방법은 Cloud Run 빠른 시작 및 기타 Cloud Run 문서를 참조하세요.

승인되지 않은 Cloud 함수 또는 Cloud Run 서비스 호출을 허용하는 대신 기본 인증을 유지하는 것이 좋습니다.

입력 형식

BigQuery는 다음 형식으로 JSON 본문을 사용해서 HTTP POST 요청을 전송합니다.

필드 이름 설명 필드 유형
requestId 요청의 ID입니다. GoogleSQL 쿼리에서 이 엔드포인트로 전송되는 여러 요청들 간에 고유합니다. 항상 제공됩니다. 문자열.
호출자 원격 함수를 호출하는 GoogleSQL 쿼리의 작업 전체 리소스 이름입니다. 항상 제공됩니다. 문자열.
sessionUser GoogleSQL 쿼리를 실행하는 사용자의 이메일입니다. 항상 제공됩니다. 문자열.
userDefinedContext BigQuery에서 원격 함수를 만들 때 사용된 사용자 정의 컨텍스트입니다. 선택사항. 키-값 쌍이 있는 JSON 객체입니다.
호출 수 입력 데이터의 배치입니다. 항상 제공됩니다. JSON 배열입니다.

각 요소 자체는 JSON 배열이며 하나의 원격 함수 호출에서 JSON 인코딩 인수 목록입니다.

요청 예시:

{
 "requestId": "124ab1c",
 "caller": "//bigquery.googleapis.com/projects/myproject/jobs/myproject:US.bquxjob_5b4c112c_17961fafeaf",
 "sessionUser": "test-user@test-company.com",
 "userDefinedContext": {
  "key1": "value1",
  "key2": "v2"
 },
 "calls": [
  [null, 1, "", "abc"],
  ["abc", "9007199254740993", null, null]
 ]
}

출력 형식

BigQuery에서는 엔드포인트가 다음 형식으로 HTTP 응답을 반환할 것으로 예상됩니다. 그렇지 않으면 BigQuery가 이를 사용할 수 없고 원격 함수를 호출하는 쿼리가 실패합니다.

필드 이름 설명 값 범위
답장 수 반환 값의 배치입니다. 성공적인 응답을 위해 필요합니다. JSON 배열입니다.

각 요소는 외부 함수의 JSON 인코딩 반환 값에 해당합니다.

배열 크기는 HTTP 요청에서 calls의 JSON 배열 크기와 일치해야 합니다. 예를 들어 calls에서 JSON 배열에 4개 요소가 있으면 이 JSON 요소에도 4개 요소가 있어야 합니다.

errorMessage 200 이외의 HTTP 응답 코드가 반환될 때의 오류 메시지입니다. 재시도할 수 없는 오류의 경우 BigQuery 작업의 오류 메시지의 일부로 사용자에게 오류를 반환합니다. 선택사항. 문자열. 크기는 1KB 미만이어야 합니다.

성공적인 응답의 예시:

{
  "replies": [
    1,
    0
  ]
}

실패한 응답의 예시:

{
  "errorMessage": "Received but not expected that the argument 0 be null".
}

HTTP 응답 코드

엔드포인트가 성공적으로 응답하려면 HTTP 응답 코드 200을 반환해야 합니다. BigQuery에서 다른 값을 수신하면 BigQuery는 응답을 실패로 간주하고 HTTP 응답 코드가 408, 429, 500, 503 또는 504이면 내부 제한에 도달할 때까지 재시도합니다.

SQL 데이터 유형의 JSON 인코딩

HTTP 요청/응답에서 JSON 인코딩은 TO_JSON_STRING 함수에 대한 기존 BigQuery JSON 인코딩을 따릅니다.

샘플 Cloud 함수 코드

다음 샘플 Python 코드는 원격 함수의 모든 정수 인수 추가를 구현합니다. 일괄 호출의 인수를 사용해서 요청을 처리하고 모든 결과를 응답에 반환합니다.

import functions_framework

from flask import jsonify

# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992

@functions_framework.http
def batch_add(request):
  try:
    return_value = []
    request_json = request.get_json()
    calls = request_json['calls']
    for call in calls:
      return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
    replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
    return_json = jsonify( { "replies":  replies } )
    return return_json
  except Exception as e:
    return jsonify( { "errorMessage": str(e) } ), 400

함수가 us-east1 리전의 my_gcf_project 프로젝트에 함수 이름 remote_add로 배포되었다고 가정하면 엔드포인트 https://us-east1-my_gcf_project.cloudfunctions.net/remote_add를 통해 함수에 액세스할 수 있습니다.

샘플 Cloud Run 코드

다음 샘플 Python 코드는 동일한 기능을 위해 Cloud Run에 빌드하고 배포할 수 있는 웹 서비스를 구현합니다.

import os

from flask import Flask, request, jsonify

# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992

app = Flask(__name__)

@app.route("/", methods=['POST'])
def batch_add():
  try:
    return_value = []
    request_json = request.get_json()
    calls = request_json['calls']
    for call in calls:
      return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
    replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
    return jsonify( { "replies" :  replies } )
  except Exception as e:
    return jsonify( { "errorMessage": str(e) } ), 400

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

코드 빌드 및 배포 방법은 가이드를 참조하세요.

Cloud Run 서비스가 us-east1 리전의 my_gcf_project 프로젝트에 서비스 이름 remote_add로 배포되었다고 가정하면 https://remote_add-<project_id_hash>-ue.a.run.app 엔드포인트를 통해 이 서비스에 액세스할 수 있습니다.

원격 함수 만들기

BigQuery는 CLOUD_RESOURCE 연결을 사용해서 Cloud 함수와 상호작용합니다. 원격 함수를 만들려면 CLOUD_RESOURCE 연결을 만들어야 합니다. BigQuery DataFrames을 사용하여 원격 함수를 만들고 프로젝트 IAM 관리자 역할(roles/resourcemanager.projectIamAdmin)을 받았으면, 수동으로 연결을 만들어 액세스 권한을 부여할 필요가 없습니다. 서비스에서 이를 자동으로 수행합니다.

연결 만들기

Cloud 함수 및 Cloud Run에 연결하려면 Cloud 리소스 연결이 있어야 합니다.

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 연결을 만들려면 추가를 클릭한 다음 외부 데이터 소스에 연결을 클릭합니다.

  3. 연결 유형 목록에서 Vertex AI 원격 모델, 원격 함수, BigLake(Cloud 리소스)를 선택합니다.

  4. 연결 ID 필드에 연결 이름을 입력합니다.

  5. 연결 만들기를 클릭합니다.

  6. 연결로 이동을 클릭합니다.

  7. 연결 정보 창에서 나중의 단계에 사용할 서비스 계정 ID를 복사합니다.

bq

  1. 명령줄 환경에서 연결을 만듭니다.

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    --project_id 매개변수는 기본 프로젝트를 재정의합니다.

    다음을 바꿉니다.

    • REGION: 연결 리전
    • PROJECT_ID: Google Cloud 프로젝트 ID
    • CONNECTION_ID: 연결의 ID

    연결 리소스를 만들면 BigQuery가 고유한 시스템 서비스 계정을 만들고 이를 연결에 연계합니다.

    문제 해결: 다음 연결 오류가 발생하면 Google Cloud SDK를 업데이트하세요.

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 이후 단계에서 사용할 수 있도록 서비스 계정 ID를 가져와 복사합니다.

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    출력은 다음과 비슷합니다.

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

main.tf 파일에 다음 섹션을 추가합니다.

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
다음을 바꿉니다.

  • CONNECTION_ID: 연결의 ID
  • PROJECT_ID: Google Cloud 프로젝트 ID
  • REGION: 연결 리전

액세스 설정

새 연결에 Cloud Function 또는 Cloud Run 서비스에 대한 읽기 전용 액세스 권한을 부여해야 합니다. Cloud 함수 또는 Cloud Run 서비스에 인증되지 않은 호출을 허용하지 않는 것이 좋습니다.

역할을 부여하려면 다음 단계를 따르세요.

  1. IAM 및 관리자 페이지로 이동합니다.

    IAM 및 관리자로 이동

  2. 추가를 클릭합니다.

    주 구성원 추가 대화상자가 열립니다.

  3. 새 주 구성원 필드에 앞에서 복사한 서비스 계정 ID를 입력합니다.

  4. 역할 선택 필드에서 다음 옵션 중 하나를 선택합니다.

    • 1세대 Cloud 함수를 사용하는 경우 Cloud 함수를 선택한 다음 Cloud 함수 호출자 역할을 선택합니다.
    • 2세대 Cloud 함수를 사용하는 경우 Cloud Run을 선택한 후 Cloud Run 호출자 역할을 선택합니다.
    • Cloud Run 서비스를 사용하는 경우 Cloud Run을 선택한 후 Cloud Run 호출자 역할을 선택합니다.
  5. 저장을 클릭합니다.

원격 함수 만들기

원격 함수를 만들려면 다음 안내를 따르세요.

SQL

BigQuery에서 다음 CREATE FUNCTION 문을 실행합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE FUNCTION PROJECT_ID.DATASET_ID.remote_add(x INT64, y INT64) RETURNS INT64
    REMOTE WITH CONNECTION PROJECT_ID.LOCATION.CONNECTION_NAME
    OPTIONS (
      endpoint = 'ENDPOINT_URL'
    )
    

    다음을 바꿉니다.

    • DATASET_ID: BigQuery 데이터 세트의 ID
    • ENDPOINT_URL: Cloud 함수의 URL 또는 Cloud Run 원격 함수 엔드포인트

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

BigQuery DataFrames

BigQuery DataFrame은 미리보기 버전입니다.

  1. 원격 함수요구사항 섹션에 설명된 대로 필요한 API를 사용 설정하고 필요한 역할이 부여되었는지 확인합니다.
  2. remote_function 데코레이터를 사용합니다.

    import bigframes.pandas as bpd
    
    # Set BigQuery DataFrames options
    bpd.options.bigquery.project = your_gcp_project_id
    bpd.options.bigquery.location = "us"
    
    # BigQuery DataFrames gives you the ability to turn your custom scalar
    # functions into a BigQuery remote function. It requires the GCP project to
    # be set up appropriately and the user having sufficient privileges to use
    # them. One can find more details about the usage and the requirements via
    # `help` command.
    help(bpd.remote_function)
    
    # Read a table and inspect the column of interest.
    df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")
    df["body_mass_g"].head(10)
    
    # Define a custom function, and specify the intent to turn it into a remote
    # function. It requires a BigQuery connection. If the connection is not
    # already created, BigQuery DataFrames will attempt to create one assuming
    # the necessary APIs and IAM permissions are setup in the project. In our
    # examples we would be using a pre-created connection named
    # `bigframes-rf-conn`. We will also set `reuse=False` to make sure we don't
    # step over someone else creating remote function in the same project from
    # the exact same source code at the same time. Let's try a `pandas`-like use
    # case in which we want to apply a user defined scalar function to every
    # value in a `Series`, more specifically bucketize the `body_mass_g` value
    # of the penguins, which is a real number, into a category, which is a
    # string.
    @bpd.remote_function(
        [float],
        str,
        bigquery_connection="bigframes-rf-conn",
        reuse=False,
    )
    def get_bucket(num):
        if not num:
            return "NA"
        boundary = 4000
        return "at_or_above_4000" if num >= boundary else "below_4000"
    
    # Then we can apply the remote function on the `Series`` of interest via
    # `apply` API and store the result in a new column in the DataFrame.
    df = df.assign(body_mass_bucket=df["body_mass_g"].apply(get_bucket))
    
    # This will add a new column `body_mass_bucket` in the DataFrame. You can
    # preview the original value and the bucketized value side by side.
    df[["body_mass_g", "body_mass_bucket"]].head(10)
    
    # The above operation was possible by doing all the computation on the
    # cloud. For that, there is a google cloud function deployed by serializing
    # the user code, and a BigQuery remote function created to call the cloud
    # function via the latter's http endpoint on the data in the DataFrame.
    
    # The BigQuery remote function created to support the BigQuery DataFrames
    # remote function can be located via a property `bigframes_remote_function`
    # set in the remote function object.
    print(f"Created BQ remote function: {get_bucket.bigframes_remote_function}")
    
    # The cloud function can be located via another property
    # `bigframes_cloud_function` set in the remote function object.
    print(f"Created cloud function: {get_bucket.bigframes_cloud_function}")
    
    # Warning: The deployed cloud function may be visible to other users with
    # sufficient privilege in the project, so the user should be careful about
    # having any sensitive data in the code that will be deployed as a remote
    # function.
    
    # Let's continue trying other potential use cases of remote functions. Let's
    # say we consider the `species`, `island` and `sex` of the penguins
    # sensitive information and want to redact that by replacing with their hash
    # code instead. Let's define another scalar custom function and decorate it
    # as a remote function
    @bpd.remote_function(
        [str], str, bigquery_connection="bigframes-rf-conn", reuse=False
    )
    def get_hash(input):
        import hashlib
    
        # handle missing value
        if input is None:
            input = ""
        encoded_input = input.encode()
        hash = hashlib.md5(encoded_input)
        return hash.hexdigest()
    
    # We can use this remote function in another `pandas`-like API `map` that
    # can be applied on a DataFrame
    df_redacted = df[["species", "island", "sex"]].map(get_hash)
    df_redacted.head(10)
    
    

원격 함수를 만드는 데이터 세트에 대한 bigquery.routines.create 권한과 원격 함수에서 사용하는 연결에 대한 bigquery.connections.delegate 권한(BigQuery 연결 관리자 역할을 통해)이 있어야 합니다.

사용자 정의 컨텍스트 제공

엔드포인트에 대한 모든 HTTP 요청의 일부가 되는 키-값 쌍의 형식으로 OPTIONS에서 user_defined_context를 지정할 수 있습니다. 사용자 정의 컨텍스트를 사용해서 여러 원격 함수를 만들 수 있지만 전달된 컨텍스트에 따라 다른 동작을 제공하는 단일 엔드포인트를 재사용할 수 있습니다.

다음 예시에서는 동일한 엔드포인트를 사용해서 BYTES 데이터를 암호화 및 복호화하는 두 가지 원격 함수를 만듭니다.

CREATE FUNCTION `PROJECT_ID.DATASET_ID`.encrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
  endpoint = 'ENDPOINT_URL',
  user_defined_context = [("mode", "encryption")]
)

CREATE FUNCTION `PROJECT_ID.DATASET_ID`.decrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
  endpoint = 'ENDPOINT_URL',
  user_defined_context = [("mode", "decryption")]
)

일괄 요청에서 행 수 제한

Cloud Functions 제한 시간을 방지하기 위해 OPTIONS에서 각 HTTP 요청의 최대 행수로 max_batching_rows를 지정할 수 있습니다. 지정하지 않으면 BigQuery가 배치에 포함할 최대 행 수를 결정합니다.

쿼리에 원격 함수 사용

원격 함수의 연결과 연계된 BigQuery의 서비스 계정에 액세스할 수 있도록 Cloud 함수에 대해 권한이 부여되었는지 확인합니다.

원격 함수가 있는 데이터 세트에 bigquery.routines.get 권한과 원격 함수에서 사용하는 연결에 대한 BigQuery Connection User 역할을 통해 얻을 수 있는 bigquery.connections.use 권한이 있어야 합니다.

사용자 정의 함수와 같이 쿼리에서 원격 함수를 사용할 수 있습니다.

예를 들어 예시 쿼리에서 remote_add 함수를 사용할 수 있습니다.

SELECT
  val,
  `PROJECT_ID.DATASET_ID`.remote_add(val, 2)
FROM
  UNNEST([NULL,2,3,5,8]) AS val;

이 예시는 다음 출력을 생성합니다.

+------+-----+
|  val | f0_ |
+------+-----+
| NULL |   2 |
|    2 |   4 |
|    3 |   5 |
|    5 |   7 |
|    8 |  10 |
+------+-----+

지원되는 리전

BigQuery에는 두 가지 유형의 위치가 있습니다.

  • 리전은 특정한 지리적 장소(예: 런던)입니다.

  • 멀티 리전은 두 개 이상의 지리적 장소를 포함하는 넓은 지리적 지역(예: 미국)입니다.

단일 리전

BigQuery 단일 리전 데이터 세트의 경우 동일 리전에 배포된 Cloud 함수를 사용하는 원격 함수만 만들 수 있습니다. 예를 들면 다음과 같습니다.

  • BigQuery 단일 리전 us-east4의 원격 함수는 us-east4에서만 Cloud 함수를 사용할 수 있습니다.

따라서 단일 리전의 경우 Cloud Functions 및 BigQuery가 모두 지원되는 리전에서만 원격 함수가 지원됩니다.

멀티 리전

BigQuery 멀티 리전(US, EU) 데이터 세트에서는 동일한 대규모 지역(US, EU) 내 리전에 배포된 Cloud 함수를 사용하는 원격 함수만 만들 수 있습니다. 예를 들면 다음과 같습니다.

  • BigQuery US 멀티 리전의 원격 함수는 다음과 같이 미국 지리적 영역(예: us-central1 ,us-east4 ,us-west2 등)의 단일 리전에 배포된 Cloud 함수만 사용할 수 있습니다.
  • BigQuery EU 멀티 리전의 원격 함수는 EU의 회원 국가(예: europe-north1, europe-west3 등)의 단일 리전에 배포된 Cloud 함수만 사용할 수 있습니다.

BigQuery 리전 및 멀티 리전에 대한 자세한 내용은 데이터 세트 위치 페이지를 참조하세요. Cloud Functions 리전에 대한 자세한 내용은 Cloud Functions 위치 페이지를 참조하세요.

연결

단일 리전 위치 또는 멀티 리전 위치의 경우 사용되는 연결과 동일한 위치에서만 원격 함수를 만들 수 있습니다. 예를 들어 US 멀티 리전에서 원격 함수를 만들려면 US 멀티 리전에 있는 연결을 사용합니다.

가격 책정

  • 표준 BigQuery 가격 책정이 적용됩니다.

  • 또한 이 기능을 사용하면 Cloud Functions 및 Cloud Run에 대해 비용이 발생할 수 있습니다. 자세한 내용은 Cloud FunctionsCloud Run 가격 책정 페이지를 참조하세요.

VPC 서비스 제어 사용

VPC 서비스 제어는 데이터 무단 반출을 방지하기 위해 보안 경계를 설정할 수 있는 Google Cloud 기능입니다. 원격 함수와 함께 VPC 서비스 제어를 사용하여 보안을 강화하거나 internal traffic 인그레스 설정으로 엔드포인트를 사용하려면 다음과 같이 VPC 서비스 제어 가이드를 따르세요.

  1. 서비스 경계를 만듭니다.

  2. 원격 함수를 사용하여 쿼리의 BigQuery 프로젝트를 경계에 추가합니다.

  3. 엔드포인트 프로젝트를 경계에 추가하고 엔드포인트 유형에 따라 제한된 서비스에서 Cloud Functions API 또는 Cloud Run API를 설정합니다. 자세한 내용은 Cloud Functions VPC 서비스 제어Cloud Run VPC 서비스 제어를 참조하세요.

원격 함수 권장사항

  • 입력 사전 필터: 원격 함수로 전달하기 전 입력을 쉽게 필터링할 수 있으면 쿼리 속도가 더 빨라지고 비용이 낮아질 것입니다.

  • Cloud 함수를 확장 가능하게 유지합니다. 확장성은 최소 인스턴스, 최대 인스턴스, 동시 실행의 함수입니다.

    • 가능한 경우 Cloud 함수의 최대 인스턴스 수에 대한 기본값을 사용하세요.
    • 1세대 HTTP Cloud Functions에는 기본 한도가 없습니다. 테스트 또는 프로덕션 중에 1세대 HTTP Cloud Functions로 제한되지 않은 확장 이벤트를 방지하려면 한도를 설정하는 것이 좋습니다(예: 3,000).
  • 성능 향상을 위해 다른 Cloud 함수 팁을 참조하세요. 지연 시간이 높은 Cloud 함수와 상호작용하는 원격 함수는 제한 시간으로 인해 실패할 수 있습니다.

  • 실패한 응답에 대하여 적합한 HTTP 응답 코드 및 페이로드를 반환하도록 엔드포인트를 구현하세요.

    • BigQuery에서 재시도를 최소화하려면 실패한 응답에 408, 429, 500, 503, 504 이외의 HTTP 응답 코드를 사용하고 함수 코드에서 모든 예외를 포착해야 합니다. 그렇지 않으면 HTTP 서비스 프레임워크에서 포착되지 않은 예외에 대해 자동으로 500을 반환할 수 있습니다. BigQuery가 실패한 데이터 파티션 또는 쿼리를 재시도할 때도 재시도된 HTTP 요청이 표시될 수 있습니다.

    • 엔드포인트는 실패한 응답에 대해 정의된 형식으로 JSON 페이로드를 반환해야 합니다. 엄격하게 요구되는 것은 아니지만, 이렇게 하면 실패한 응답이 함수 구현에서 발생했는지 또는 Cloud Functions/Cloud Run의 인프라에서 비롯되는지 BigQuery가 구별하는 데 도움이 됩니다. 후자의 경우 BigQuery가 다른 내부 제한으로 다시 시도할 수 있습니다.

할당량

원격 함수 할당량에 대한 자세한 내용은 할당량 및 한도를 참조하세요.