Conectarse a Amazon S3

Como administrador de BigQuery, puedes crear una conexión para permitir que los analistas de datos accedan a los datos almacenados en los contenedores de Amazon Simple Storage Service (Amazon S3).

BigQuery Omni accede a los datos de Amazon S3 a través de conexiones. Cada conexión tiene su propio usuario de gestión de identidades y accesos (IAM) de Amazon Web Services (AWS). Concedes permisos a los usuarios a través de roles de AWS IAM. Las políticas de los roles de gestión de identidades y accesos de AWS determinan a qué datos puede acceder BigQuery en cada conexión.

Las conexiones son necesarias para consultar los datos de Amazon S3 y exportar los resultados de las consultas de BigQuery a tu segmento de Amazon S3.

Antes de empezar

Asegúrate de haber creado los siguientes recursos:

Roles obligatorios

Para obtener los permisos que necesitas para crear una conexión y acceder a los datos de Amazon S3, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de conexiones de BigQuery (roles/bigquery.connectionAdmin) en el proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Crear una política de gestión de identidades y accesos de AWS para BigQuery

Asegúrate de seguir las prácticas recomendadas de seguridad para Amazon S3. Te recomendamos que hagas lo siguiente:

  • Configura una política de AWS que impida el acceso a tu bucket de Amazon S3 a través de HTTP.
  • Configura una política de AWS que impida el acceso público a tu bucket de Amazon S3.
  • Utiliza el cifrado del lado del servidor de Amazon S3.
  • Limita los permisos concedidos a la cuenta de Google al mínimo necesario.
  • Configura CloudTrail y habilita los eventos de datos de Amazon S3.

Para crear una política de gestión de identidades y accesos de AWS, usa la consola de AWS o Terraform:

Consola de AWS

  1. Ve a la consola de IAM de AWS. Asegúrate de que estás en la cuenta propietaria del segmento de Amazon S3 al que quieres acceder.

    Ir a la consola de IAM de AWS

  2. Selecciona Políticas > Crear política (se abre en una pestaña nueva).

  3. Haz clic en JSON y pega lo siguiente en el editor:

    {
     "Version": "2012-10-17",
     "Statement": [
        {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME"
          ]
        },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           EXPORT_PERM
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME",
            "arn:aws:s3:::BUCKET_NAME/*"
          ]
        }
     ]
    }

    Haz los cambios siguientes:

    • BUCKET_NAME: el bucket de Amazon S3 al que quieres que acceda BigQuery.
    • EXPORT_PERM (opcional): permiso adicional si quieres exportar datos a un segmento de Amazon S3. Reemplazar por "s3:PutObject"
      • Para separar el control de acceso a la exportación, te recomendamos que crees otra conexión con un rol de IAM de AWS independiente y que le concedas acceso de solo escritura. Para tener un control de acceso más detallado, también puedes limitar el acceso de un rol a una ruta específica del contenedor.
  4. En el campo Name (Nombre), introduce un nombre para la política, como bq_omni_read_only.

  5. Haz clic en Crear política.

La política se crea con un nombre de recurso de Amazon (ARN) con el siguiente formato:

arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Haz los cambios siguientes:

  • AWS_ACCOUNT_ID: número de ID del usuario de AWS IAM de la conexión.
  • POLICY_NAME: el nombre de la política que has elegido.

CLI de AWS

Para crear una política de gestión de identidades y accesos de AWS, usa el comando aws iam create-policy:

  aws iam create-policy \
   --policy-name POLICY_NAME \
   --policy-document '{
     "Version": "2012-10-17",
     "Statement": [
        {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket"
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME"
          ]
        },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           EXPORT_PERM
         ],
         "Resource": [
           "arn:aws:s3:::BUCKET_NAME",
            "arn:aws:s3:::BUCKET_NAME/*"
          ]
        }
     ]
    }'

Haz los cambios siguientes:

  • POLICY_NAME: el nombre de la política que vas a crear.
  • BUCKET_NAME: el bucket de Amazon S3 al que quieres que acceda BigQuery.
  • EXPORT_PERM (opcional): permiso adicional si quieres exportar datos a un segmento de Amazon S3. Reemplazar por "s3:PutObject"
    • Para separar el control de acceso a la exportación, te recomendamos que crees otra conexión con un rol de IAM de AWS independiente y que le concedas acceso de solo escritura. Para tener un control de acceso más detallado, también puedes limitar el acceso de un rol a una ruta específica del contenedor.

La política se crea con un nombre de recurso de Amazon (ARN) con el siguiente formato:

arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Haz los cambios siguientes:

  • AWS_ACCOUNT_ID: número de ID del usuario de AWS IAM de la conexión.
  • POLICY_NAME: el nombre de la política que has elegido.

Terraform

Añade lo siguiente a tu configuración de Terraform para adjuntar una política a un recurso de segmento de Amazon S3:

  resource "aws_iam_policy" "bigquery-omni-connection-policy" {
    name = "bigquery-omni-connection-policy"

    policy = <<-EOF
            {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "BucketLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:ListBucket"],
                      "Resource": ["arn:aws:s3:::BUCKET_NAME"]
                  },
                  {
                      "Sid": "ObjectLevelAccess",
                      "Effect": "Allow",
                      "Action": ["s3:GetObject",EXPORT_PERM],
                      "Resource": [
                          "arn:aws:s3:::BUCKET_NAME",
                          "arn:aws:s3:::BUCKET_NAME/*"
                          ]
                  }
              ]
            }
            EOF
  }

Haz los cambios siguientes:

  • BUCKET_NAME: el bucket de Amazon S3 al que quieres que acceda BigQuery.
  • EXPORT_PERM (opcional): permiso adicional si quieres exportar datos a un segmento de Amazon S3. Reemplazar por "s3:PutObject"
    • Para separar el control de acceso a la exportación, te recomendamos que crees otra conexión con un rol de gestión de identidades y accesos de AWS independiente y que le concedas acceso de solo escritura. Para tener un control más granular del acceso, también puedes limitar el acceso de un rol a una ruta específica del contenedor.

Crear un rol de gestión de identidades y accesos de AWS para BigQuery

A continuación, crea un rol que permita acceder al segmento de Amazon S3 desde BigQuery. Este rol usa la política que has creado en la sección anterior.

Para crear un rol de gestión de identidades y accesos de AWS, usa la consola de AWS o Terraform:

Consola de AWS

  1. Ve a la consola de IAM de AWS. Asegúrate de que estás en la cuenta propietaria del segmento de Amazon S3 al que quieres acceder.

    Ir a la consola de IAM de AWS

  2. Selecciona Roles > Crear rol.

  3. En Select type of trusted entity (Seleccionar tipo de entidad de confianza), selecciona Web Identity (Identidad web).

  4. En Proveedor de identidades, selecciona Google.

  5. En Audiencia, introduce 00000 como valor de marcador de posición. Sustituirás el valor más adelante.

  6. Haz clic en Siguiente: Permisos.

  7. Para conceder acceso al rol a tus datos de Amazon S3, adjunta una política de gestión de identidades y accesos al rol. Busca la política que has creado en la sección anterior y haz clic en el interruptor.

  8. Haz clic en Siguiente: Etiquetas.

  9. Haz clic en Siguiente: Revisar. Introduce un nombre para el rol, como BQ_Read_Only.

  10. Haz clic en Crear rol.

CLI de AWS

Usa el siguiente comando para crear un rol de gestión de identidades y accesos y asignarle la política creada:

  aws iam create-role \
   --role-name bigquery-omni-connection \
   --max-session-duration 43200 \
   --assume-role-policy-document '{
     "Version": "2012-10-17",
     "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "accounts.google.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "accounts.google.com:sub": "00000"
                }
            }
        }
    ]
}'

Terraform

Añade lo siguiente a tu configuración de Terraform para crear un rol de gestión de identidades y accesos (IAM) y asignar la política al rol creado:

  resource "aws_iam_role" "bigquery-omni-connection-role" {
    name                 = "bigquery-omni-connection"
    max_session_duration = 43200

    assume_role_policy = <<-EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "00000"
            }
          }
        }
      ]
    }
    EOF
  }

  resource "aws_iam_role_policy_attachment" "bigquery-omni-connection-role-attach" {
    role       = aws_iam_role.bigquery-omni-connection-role.name
    policy_arn = aws_iam_policy.bigquery-omni-connection-policy.arn
  }

  output "bigquery_omni_role" {
    value = aws_iam_role.bigquery-omni-connection-role.arn
  }

A continuación, adjunta la política al rol:

  aws iam attach-role-policy \
    --role-name bigquery-omni-connection \
    --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME

Haz los cambios siguientes:

  • AWS_ACCOUNT_ID: número de ID del usuario de AWS IAM de la conexión.
  • POLICY_NAME: el nombre de la política que has elegido.

Crear conexiones

Para conectarse a su segmento de Amazon S3, utilice la Google Cloud consola, la herramienta de línea de comandos bq o la biblioteca de cliente:

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en 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 Almacenamiento o lagos de datos.

    También puede introducir aws o Amazon S3 en el campo Buscar fuentes de datos.

  4. En la sección Fuentes de datos destacadas, haga clic en Amazon S3.

  5. Haz clic en la tarjeta de solución Amazon S3 Omni: federación de BigQuery.

  6. En el cuadro de diálogo Crear tabla, en el campo ID de conexión, seleccione Crear una conexión de S3.

  7. En el panel Fuente de datos externa, introduce la siguiente información:

    • En Tipo de conexión, seleccione BigLake en AWS (a través de BigQuery Omni).
    • En Connection ID (ID de conexión), introduce un identificador para el recurso de conexión. Puedes usar letras, números, guiones y guiones bajos.
    • En Región, selecciona la ubicación en la que quieras crear la conexión.
    • Opcional: En Nombre descriptivo, introduce un nombre descriptivo para la conexión, como My connection resource. El nombre descriptivo puede ser cualquier valor que te ayude a identificar el recurso de conexión si necesitas modificarlo más adelante.
    • Opcional: En Descripción, escribe una descripción de este recurso de conexión.
    • En ID de rol de AWS, introduce el ID de rol de gestión de identidades y accesos completo que has creado con este formato:
      arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  8. Haga clic en Crear conexión.

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

  10. En el panel Información de la conexión, copia la identidad de Google de BigQuery. Se trata de un principal de Google específico de cada conexión. Ejemplo:

      BigQuery Google identity: IDENTITY_ID
      

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "bigquery-omni-aws-connection"
    friendly_name = "bigquery-omni-aws-connection"
    description   = "Created by Terraform"

    location      = "AWS_LOCATION"
    aws {
      access_role {
        # This must be constructed as a string instead of referencing the
        # AWS resources directly to avoid a resource dependency cycle
        # in Terraform.
        iam_role_id = "arn:aws:iam::AWS_ACCOUNT:role/IAM_ROLE_NAME"
      }
    }
  }

Haz los cambios siguientes:

bq

bq mk --connection --connection_type='AWS' \
--iam_role_id=arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME \
--location=AWS_LOCATION \
CONNECTION_ID

Haz los cambios siguientes:

  • AWS_ACCOUNT_ID: número de ID del usuario de AWS IAM de la conexión.
  • ROLE_NAME: el nombre de la política de rol que has elegido
  • AWS_LOCATION: una ubicación de Amazon S3 en Google Cloud
  • CONNECTION_ID: el ID que asignas a este recurso de conexión.

La línea de comandos muestra el siguiente resultado:

  Identity: IDENTITY_ID

La salida contiene lo siguiente:

  • IDENTITY_ID: un principal de Google que Google Cloud controla y que es específico de cada conexión.

Anota el valor de IDENTITY_ID.

.

Java

Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

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

import com.google.cloud.bigquery.connection.v1.AwsAccessRole;
import com.google.cloud.bigquery.connection.v1.AwsProperties;
import com.google.cloud.bigquery.connection.v1.Connection;
import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
import com.google.cloud.bigquery.connection.v1.LocationName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import java.io.IOException;

// Sample to create aws connection
public class CreateAwsConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    // Example of location: aws-us-east-1
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    // Example of role id: arn:aws:iam::accountId:role/myrole
    String iamRoleId = "MY_AWS_ROLE_ID";
    AwsAccessRole role = AwsAccessRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setAccessRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  static void createAwsConnection(
      String projectId, String location, String connectionId, Connection connection)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      LocationName parent = LocationName.of(projectId, location);
      CreateConnectionRequest request =
          CreateConnectionRequest.newBuilder()
              .setParent(parent.toString())
              .setConnection(connection)
              .setConnectionId(connectionId)
              .build();
      Connection response = client.createConnection(request);
      AwsAccessRole role = response.getAws().getAccessRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamRoleId()
              + " Aws externalId :"
              + role.getIdentity());
    }
  }
}

Añadir una relación de confianza al rol de AWS

BigQuery Omni ofrece dos métodos para acceder de forma segura a los datos de Amazon S3. Puedes conceder acceso a la cuenta de servicio a tu rol de AWS o, si tu cuenta de AWS tiene un proveedor de identidades personalizado para accounts.google.com, debes añadir la cuenta de servicio como audiencia al proveedor: Google Cloud Google Cloud

Añade una política de confianza al rol de AWS

La relación de confianza permite que la conexión asuma el rol y acceda a los datos de Amazon S3 tal como se especifica en la política de roles.

Para añadir una relación de confianza, usa la consola de AWS o Terraform:

Consola de AWS

  1. Ve a la consola de IAM de AWS. Asegúrate de que estás en la cuenta propietaria del segmento de Amazon S3 al que quieres acceder.

    Ir a la consola de IAM de AWS

  2. Selecciona Roles.

  3. Selecciona el ROLE_NAME que has creado.

  4. Haga clic en Editar y, a continuación, siga estos pasos:

    1. En Duración máxima de la sesión, selecciona 12 horas. Como cada consulta puede ejecutarse durante un máximo de seis horas, esta duración permite un intento adicional. Si aumentas la duración de la sesión a más de 12 horas, no podrás hacer más reintentos. Para obtener más información, consulta el límite de tiempo de ejecución de consultas o consultas con varias instrucciones.

      Botón Editar de AWS para definir la duración de la sesión.

    2. Haz clic en Guardar cambios.

  5. Selecciona Relaciones de confianza y haz clic en Editar relación de confianza. Sustituye el contenido de la política por lo siguiente:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }

    Sustituye IDENTITY_ID por el valor de identidad de Google de BigQuery, que puedes encontrar en la Google Cloud consola de la conexión que has creado.

  6. Haz clic en Actualizar política de confianza.

CLI de AWS

Para crear una relación de confianza con la conexión de BigQuery, usa el comando aws iam update-assume-role-policy:

  aws iam update-assume-role-policy \
    --role-name bigquery-omni-connection \
    --policy-document '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }'
  aws iam update-assume-role-policy \
    --role-name bigquery-omni-connection \
    --policy-document '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "IDENTITY_ID"
            }
          }
        }
      ]
    }'

Haz los cambios siguientes:

  • IDENTITY_ID: el valor de identidad de Google de BigQuery, que puedes encontrar en la consola de Google Cloud la conexión que has creado.

Terraform

Actualiza el recurso aws_iam_role en la configuración de Terraform para añadir una relación de confianza:

    resource "aws_iam_role" "bigquery-omni-connection-role" {
      name                 = "bigquery-omni-connection"
      max_session_duration = 43200

      assume_role_policy = <<-EOF
          {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Federated": "accounts.google.com"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                  "StringEquals": {
                    "accounts.google.com:sub": "${google_bigquery_connection.connection.aws[0].access_role[0].identity}"
                  }
                }
              }
            ]
          }
          EOF
    }

La conexión ya está lista para usarse.

Configurar un proveedor de identidades de AWS personalizado

Si tu cuenta de AWS tiene un proveedor de identidades personalizado para accounts.google.com, tendrás que añadir IDENTITY_ID como audiencia al proveedor. Para ello, puedes hacer lo siguiente:

  1. Ve a la consola de IAM de AWS. Asegúrate de que estás en la cuenta propietaria del segmento de Amazon S3 al que quieres acceder.

    Ir a la consola de IAM de AWS

  2. Ve a IAM > Proveedores de identidades.

  3. Selecciona el proveedor de identidades de accounts.google.com.

  4. Haga clic en Añadir audiencia y añada el IDENTITY_ID como audiencia.

La conexión ya está lista para usarse.

Compartir conexiones con usuarios

Puede conceder los siguientes roles para permitir que los usuarios consulten datos y gestionen conexiones:

  • roles/bigquery.connectionUser: permite a los usuarios usar conexiones para conectarse con fuentes de datos externas y ejecutar consultas en ellas.

  • roles/bigquery.connectionAdmin: permite a los usuarios gestionar las conexiones.

Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta el artículo sobre roles y permisos predefinidos.

Selecciona una de las opciones siguientes:

Consola

  1. Ve a la página BigQuery.

    Ir a BigQuery

    Las conexiones se muestran en tu proyecto, en un grupo llamado Conexiones externas.

  2. En el panel Explorador, haga clic en el nombre del proyecto > Conexiones externas > conexión.

  3. En el panel Detalles, haz clic en Compartir para compartir una conexión. A continuación, sigue estas instrucciones:

    1. En el cuadro de diálogo Permisos de conexión, comparte la conexión con otras entidades principales añadiendo o editando entidades principales.

    2. Haz clic en Guardar.

bq

No puedes compartir una conexión con la herramienta de línea de comandos bq. Para compartir una conexión, usa la Google Cloud consola o el método de la API Connections de BigQuery.

API

Usa el método projects.locations.connections.setIAM de la sección de referencia de la API REST Connections de BigQuery y proporciona una instancia del recurso policy.

Java

Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

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

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

Siguientes pasos