Trabajar con funciones remotas

Una función remota de BigQuery te permite implementar tu función en otros lenguajes que no sean SQL ni JavaScript, o con las bibliotecas o los servicios que no se permiten en las funciones definidas por el usuario de BigQuery.

Información general

Una función remota de BigQuery te permite incorporar funciones de GoogleSQL con software externo a BigQuery proporcionando una integración directa con Cloud Run Functions y Cloud Run. Con las funciones remotas de BigQuery, puedes desplegar tus funciones en Cloud Run Functions o en Cloud Run implementado con cualquier lenguaje compatible y, a continuación, invocarlas desde consultas de GoogleSQL.

Flujo de trabajo

  1. Crea el endpoint HTTP en Cloud Run Functions o Cloud Run.
  2. Crea una función remota en BigQuery.
    1. Crea una conexión de tipo CLOUD_RESOURCE.
    2. Crea una función remota.
  3. Usa la función remota en una consulta como cualquier otra función definida por el usuario.

Limitaciones

  • Las funciones remotas solo admiten uno de los siguientes tipos de datos como tipo de argumento o tipo de valor devuelto:

    • Booleano
    • Bytes
    • Numérico
    • Cadena
    • Fecha
    • Fecha y hora
    • Hora
    • Marca de tiempo
    • JSON

    Las funciones remotas no admiten los tipos ARRAY, STRUCT, INTERVAL ni GEOGRAPHY.

  • No puedes crear funciones remotas con valores de tabla.

  • No puedes usar funciones remotas al crear vistas materializadas.

  • Siempre se presupone que el valor devuelto de una función remota no es determinista, por lo que el resultado de una consulta que llama a una función remota no se almacena en caché.

  • Es posible que vea solicitudes repetidas con los mismos datos a su endpoint, incluso después de que se hayan enviado correctamente, debido a errores de red transitorios o a errores internos de BigQuery.

  • Cuando se omite la evaluación de una función remota en algunas filas debido a un cortocircuito (por ejemplo, en expresiones condicionales o en una instrucción MERGE con WHEN [NOT] MATCHED), no se usa el procesamiento por lotes con la función remota. En este caso, el campo calls del cuerpo de la solicitud HTTP tiene exactamente un elemento.

  • Si el conjunto de datos asociado a la función remota se replica en una región de destino mediante la replicación de conjuntos de datos entre regiones, la función remota solo se podrá consultar en la región en la que se haya creado.

Crear un punto final

Para crear una función remota que pueda implementar lógica empresarial, debes crear un endpoint HTTP mediante funciones de Cloud Run o Cloud Run. El endpoint debe poder procesar un lote de filas en una sola solicitud POST HTTP y devolver los resultados del lote como respuesta HTTP.

Si creas la función remota con DataFrames de BigQuery, no tienes que crear manualmente el endpoint HTTP, ya que el servicio lo hace automáticamente.

Consulta el tutorial de Cloud Run Functions y otra documentación de Cloud Run Functions sobre cómo escribir, desplegar, probar y mantener una función de Cloud Run.

Consulta la guía de inicio rápido de Cloud Run y otra documentación de Cloud Run sobre cómo escribir, desplegar, probar y mantener un servicio de Cloud Run.

Te recomendamos que mantengas la autenticación predeterminada en lugar de permitir la invocación no autenticada de tu función o servicio de Cloud Run.

Formato de entrada

BigQuery envía solicitudes HTTP POST con un cuerpo JSON en el siguiente formato:

Nombre del campo Descripción Tipo de campo
requestId ID de la solicitud. Único en varias solicitudes enviadas a este endpoint en una consulta de GoogleSQL. Siempre se proporciona. Cadena.
llamador Nombre completo del recurso de trabajo de la consulta de GoogleSQL que llama a la función remota. Siempre se proporciona. Cadena.
sessionUser Correo del usuario que ejecuta la consulta de GoogleSQL. Siempre se proporciona. Cadena.
userDefinedContext El contexto definido por el usuario que se usó al crear la función remota en BigQuery. Opcional. Un objeto JSON con pares clave-valor.
llamadas Un lote de datos de entrada. Siempre se proporciona. Una matriz JSON.

Cada elemento es una matriz JSON, que es una lista de argumentos codificada en JSON de una llamada a una función remota.

Ejemplo de solicitud:

{
 "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]
 ]
}

Formato de salida

BigQuery espera que el endpoint devuelva una respuesta HTTP con el siguiente formato. De lo contrario, BigQuery no podrá consumirla y la consulta que llame a la función remota fallará.

Nombre del campo Descripción Intervalo de valores
respuestas Un lote de valores devueltos. Es obligatorio para que la respuesta sea correcta. Una matriz JSON.

Cada elemento corresponde a un valor devuelto codificado en JSON de la función externa.

El tamaño de la matriz debe coincidir con el tamaño de la matriz JSON de calls en la solicitud HTTP. Por ejemplo, si la matriz JSON de calls tiene 4 elementos, esta matriz JSON también debe tener 4 elementos.

errorMessage Mensaje de error cuando se devuelve un código de respuesta HTTP distinto de 200. En el caso de los errores que no se pueden volver a intentar, se devuelve como parte del mensaje de error de la tarea de BigQuery al usuario. Opcional. Cadena. El tamaño debe ser inferior a 1 KB.

Ejemplo de respuesta correcta:

{
  "replies": [
    1,
    0
  ]
}

Ejemplo de una respuesta fallida:

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

Código de respuesta HTTP

Tu endpoint debe devolver el código de respuesta HTTP 200 si la respuesta es correcta. Cuando BigQuery recibe cualquier otro valor, considera que la respuesta es un error y vuelve a intentarlo cuando el código de respuesta HTTP es 408, 429, 500, 503 o 504 hasta alcanzar un límite interno.

Codificación JSON del tipo de datos SQL

La codificación JSON en las solicitudes y respuestas HTTP sigue la codificación JSON de BigQuery de la función TO_JSON_STRING.

Código de función de Cloud Run de ejemplo

El siguiente código de muestra de Python implementa la adición de todos los argumentos enteros de la función remota. Gestiona una solicitud con los argumentos de las invocaciones por lotes y devuelve todos los resultados en una respuesta.

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

Si la función se implementa en el proyecto my_gcf_project de la región us-east1 con el nombre remote_add, se puede acceder a ella a través del endpoint https://us-east1-my_gcf_project.cloudfunctions.net/remote_add.

Código de ejemplo de Cloud Run

El siguiente código de ejemplo de Python implementa un servicio web que se puede compilar y desplegar en Cloud Run para obtener la misma funcionalidad.

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)))

Consulta la guía sobre cómo crear e implementar el código.

Si el servicio de Cloud Run se despliega en el proyecto my_gcf_project de la región us-east1 con el nombre de servicio remote_add, se puede acceder a él a través del endpoint https://remote_add-<project_id_hash>-ue.a.run.app.

Crear una función remota

BigQuery usa una conexión CLOUD_RESOURCE para interactuar con tu función de Cloud Run. Para crear una función remota, debes crear una conexión CLOUD_RESOURCE. Si creas la función remota con DataFrames de BigQuery y tienes el rol de administrador de gestión de identidades y accesos del proyecto (roles/resourcemanager.projectIamAdmin), no tienes que crear la conexión manualmente ni concederle acceso, ya que el servicio lo hace automáticamente.

Crear una conexión

Debes tener una conexión de recursos de Cloud para conectarte a una función de Cloud Run y a Cloud Run.

Puedes saltarte este paso si tienes una conexión predeterminada configurada o si tienes el rol Administrador de BigQuery.

Crea una conexión de recursos de Cloud para que la use el modelo remoto y obtén la cuenta de servicio de la conexión. Crea la conexión en la misma ubicación que el conjunto de datos que has creado en el paso anterior.

Selecciona una de las opciones siguientes:

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haga clic en Añadir datos:

    El elemento de la interfaz de usuario para añadir datos.

    Se abrirá el cuadro de diálogo Añadir datos.

  3. En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Aplicaciones empresariales.

    También puede introducir Vertex AI en el campo Buscar fuentes de datos.

  4. En la sección Fuentes de datos destacadas, haga clic en Vertex AI.

  5. Haz clic en la tarjeta de solución Modelos de Vertex AI: federación de BigQuery.

  6. En la lista Tipo de conexión, selecciona Modelos remotos, funciones remotas y BigLake (recurso de Cloud) de Vertex AI.

  7. En el campo ID de conexión, introduce un nombre para la conexión.

  8. Haga clic en Crear conexión.

  9. Haz clic en Ir a la conexión.

  10. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.

bq

  1. En un entorno de línea de comandos, crea una conexión:

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

    El parámetro --project_id anula el proyecto predeterminado.

    Haz los cambios siguientes:

    • REGION: tu región de conexión
    • PROJECT_ID: tu ID de proyecto Google Cloud
    • CONNECTION_ID: un ID para tu conexión

    Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia a la conexión.

    Solución de problemas: si aparece el siguiente error de conexión, actualiza el SDK de Google Cloud:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Obtén y copia el ID de la cuenta de servicio para usarlo en un paso posterior:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    El resultado debería ser similar al siguiente:

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

Terraform

Usa el recurso google_bigquery_connection.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.

En el siguiente ejemplo se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection en la región US:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

Preparar Cloud Shell

  1. Abre Cloud Shell.
  2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

    Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

Preparar el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

    Copia el código de ejemplo en el archivo main.tf que acabas de crear.

    También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

  3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
    terraform init

    Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
    terraform plan

    Haga las correcciones necesarias en la configuración.

  2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
    terraform apply

    Espera hasta que Terraform muestre el mensaje "Apply complete!".

  3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

Configurar el acceso

Debes dar a la nueva conexión acceso de solo lectura a tu función o servicio de Cloud Run. No se recomienda permitir la invocación sin autenticar de tu función o servicio de Cloud Run.

Para asignar roles, sigue estos pasos:

  1. Ve a la página IAM y administración.

    Ir a IAM y administración

  2. Haz clic en Añadir.

    Se abrirá el cuadro de diálogo Añadir principales.

  3. En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.

  4. En el campo Selecciona un rol, elige una de las siguientes opciones:

    • Si usas una función de Cloud Run de primera generación, elige Función de Cloud y, a continuación, selecciona el rol Invocador de función de Cloud.
    • Si usas una función de Cloud Run de segunda generación, elige Cloud Run y, a continuación, selecciona Rol Invocador de Cloud Run.
    • Si usas un servicio de Cloud Run, elige Cloud Run y, a continuación, selecciona Rol Invocador de Cloud Run.
  5. Haz clic en Guardar.

Crear una función remota

Para crear una función remota, sigue estos pasos:

SQL

Ejecuta la siguiente instrucción CREATE FUNCTION en BigQuery:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    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'
    )

    Haz los cambios siguientes:

    • DATASET_ID: el ID de tu conjunto de datos de BigQuery.
    • ENDPOINT_URL: la URL de tu función de Cloud Run o del endpoint de la función remota de Cloud Run.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

BigQuery DataFrames

  1. Habilita las APIs necesarias y asegúrate de que se te han concedido los roles obligatorios, tal como se describe en la sección Requisitos de Funciones remotas.
  2. Usa el decorador 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 will be letting the default connection `bigframes-default-connection`
    # be used. 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(
        reuse=False,
        cloud_function_service_account="default",
    )
    def get_bucket(num: float) -> str:
        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. The custom function in this example has external
    # package dependency, which can be specified via `packages` parameter.
    @bpd.remote_function(
        reuse=False,
        packages=["cryptography"],
        cloud_function_service_account="default",
    )
    def get_hash(input: str) -> str:
        from cryptography.fernet import Fernet
    
        # handle missing value
        if input is None:
            input = ""
    
        key = Fernet.generate_key()
        f = Fernet(key)
        return f.encrypt(input.encode()).decode()
    
    # 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)
    
    

Debe tener el permiso bigquery.routines.create en el conjunto de datos en el que cree la función remota y el permiso bigquery.connections.delegate (disponible en el rol Administrador de conexiones de BigQuery) en la conexión que use la función remota.

Proporcionar contexto definido por el usuario

Puedes especificar user_defined_context en OPTIONS como un tipo de pares clave-valor, que formarán parte de cada solicitud HTTP al endpoint. Con el contexto definido por el usuario, puedes crear varias funciones remotas, pero reutilizar un solo endpoint, que proporciona diferentes comportamientos en función del contexto que se le haya pasado.

En los siguientes ejemplos se crean dos funciones remotas para encriptar y desencriptar datos de BYTES con el mismo endpoint.

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")]
)

Limitar el número de filas en una solicitud en lote

Puedes especificar max_batching_rows en OPTIONS como el número máximo de filas de cada solicitud HTTP para evitar que se agote el tiempo de espera de las funciones de Cloud Run. Si especificas max_batching_rows, BigQuery determina el número de filas de un lote hasta el límite de max_batching_rows. Si no se especifica, BigQuery determina automáticamente el número de filas que se van a agrupar.

Usar una función remota en una consulta

Asegúrate de haber concedido el permiso en tu función de Cloud Run para que la cuenta de servicio de BigQuery asociada a la conexión de la función remota pueda acceder a ella.

También debe tener el permiso bigquery.routines.get en el conjunto de datos donde se encuentra la función remota y el permiso bigquery.connections.use, que puede obtener a través del rol BigQuery Connection User, en la conexión que utiliza la función remota.

Puedes usar una función remota en una consulta igual que una función definida por el usuario.

Por ejemplo, puedes usar la función remote_add en la consulta de ejemplo:

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

Este ejemplo genera el siguiente resultado:

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

Regiones disponibles

Hay dos tipos de ubicaciones en BigQuery:

  • Una región es un lugar geográfico específico, como Londres.

  • Una multirregión es una zona geográfica amplia, como Estados Unidos, que contiene dos o más ubicaciones geográficas.

Una sola región

En un conjunto de datos de una sola región de BigQuery, solo puede crear una función remota que use una función de Cloud Run implementada en la misma región. Por ejemplo:

  • Una función remota de una sola región de BigQuery us-east4 solo puede usar una función de Cloud Run en us-east4.

Por lo tanto, en el caso de las regiones únicas, las funciones remotas solo se admiten en las regiones que admiten tanto funciones de Cloud Run como BigQuery.

Multirregional

En un conjunto de datos multirregional de BigQuery (US, EU), solo puedes crear una función remota que use una función de Cloud Run implementada en una región que se encuentre en la misma zona geográfica grande (EE. UU. o UE). Por ejemplo:

  • Una función remota de la multirregión US de BigQuery solo puede usar una función de Cloud Run implementada en cualquier región de la zona geográfica de EE. UU., como us-central1, us-east4 o us-west2, entre otras.
  • Una función remota de la EU multirregión de BigQuery solo puede usar una función de Cloud Run implementada en cualquier región de los Estados miembros de la Unión Europea, como europe-north1, europe-west3, etc.

Para obtener más información sobre las regiones y las multirregiones de BigQuery, consulta la página Ubicaciones de conjuntos de datos. Para obtener más información sobre las regiones de las funciones de Cloud Run, consulta la página Ubicaciones de las funciones de Cloud Run.

Conexiones

Tanto en las ubicaciones de una sola región como en las multirregionales, solo puedes crear una función remota en la misma ubicación que la conexión que utilices. Por ejemplo, para crear una función remota en la multirregión US, usa una conexión ubicada en la multirregión US.

Precios

Usar Controles de Servicio de VPC

Controles de Servicio de VPC es una Google Cloud función que te permite configurar un perímetro seguro para protegerte frente a la filtración externa de datos. Para usar Controles de Servicio de VPC con funciones remotas para aumentar la seguridad o para usar endpoints con internal traffic ajustes de entrada, sigue la guía de Controles de Servicio de VPC para hacer lo siguiente:

  1. Crea un perímetro de servicio.

  2. Añade al perímetro el proyecto de BigQuery de la consulta que usa la función remota.

  3. Añade el proyecto del endpoint al perímetro y define Cloud Functions API o Cloud Run API en los servicios restringidos en función del tipo de endpoint. Para obtener más información, consulta Controles de Servicio de VPC de funciones de Cloud Run y Controles de Servicio de VPC de Cloud Run.

Prácticas recomendadas para funciones remotas

  • Prefiltra la entrada: si puedes filtrar fácilmente la entrada antes de pasarla a una función remota, es probable que tu consulta sea más rápida y barata.

  • Mantén la escalabilidad de tu función de Cloud Run. La escalabilidad depende de las instancias mínimas, las instancias máximas y la simultaneidad.

    • Siempre que sea posible, usa el valor predeterminado para el número máximo de instancias de tu función de Cloud Run.
    • Ten en cuenta que no hay ningún límite predeterminado para las funciones HTTP de Cloud Run de 1.ª gen. Para evitar eventos de escalado ilimitados con funciones HTTP de Cloud Run de 1.ª gen. durante las pruebas o en producción, te recomendamos que establezcas un límite, por ejemplo, 3000.
  • Sigue otros consejos sobre funciones de Cloud Run para mejorar el rendimiento. Las consultas de funciones remotas que interactúan con una función de Cloud Run con una latencia alta pueden fallar debido al tiempo de espera.

  • Implementa tu endpoint para que devuelva el código de respuesta HTTP y la carga útil correctos en caso de que la respuesta falle.

    • Para minimizar los reintentos de BigQuery, usa códigos de respuesta HTTP distintos de 408, 429, 500, 503 y 504 para una respuesta fallida, y asegúrate de detectar todas las excepciones en el código de tu función. De lo contrario, el marco de servicio HTTP puede devolver automáticamente el código 500 en caso de excepciones no controladas. Es posible que sigas viendo solicitudes HTTP reintentadas cuando BigQuery reintente una partición de datos o una consulta fallida.

    • Tu endpoint debe devolver una carga útil JSON con el formato definido para una respuesta fallida. Aunque no es estrictamente necesario, ayuda a BigQuery a distinguir si la respuesta fallida procede de la implementación de tu función o de la infraestructura de Cloud Run functions o Cloud Run. En este último caso, BigQuery puede volver a intentarlo con un límite interno diferente.

Cuotas

Para obtener información sobre las cuotas de funciones remotas, consulta Cuotas y límites.