Se connecter à Amazon S3

En tant qu'administrateur BigQuery, vous pouvez créer une connexion pour permettre aux analystes de données d'accéder aux données stockées dans des buckets Amazon S3 (pour Simple Storage Service).

BigQuery Omni accède aux données Amazon S3 via des connexions. Chaque connexion possède son propre utilisateur IAM (Identity and Access Management) Amazon Web Services (AWS). Vous accordez des autorisations aux utilisateurs à l'aide des rôles IAM AWS. Les stratégies des rôles IAM AWS déterminent les données auxquelles BigQuery peut accéder pour chaque connexion.

Les connexions sont nécessaires pour interroger les données Amazon S3 et exporter les résultats de requête de BigQuery vers votre bucket Amazon S3.

Avant de commencer

Assurez-vous d'avoir créé les ressources suivantes :

Rôles requis

Afin d'obtenir les autorisations nécessaires pour créer une connexion afin d'accéder aux données Amazon S3, demandez à votre administrateur de vous accorder le rôle IAM Administrateur de connexion BigQuery (roles/bigquery.connectionAdmin) sur le projet. Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Créer une stratégie IAM AWS pour BigQuery

Assurez-vous de suivre les bonnes pratiques de sécurité pour Amazon S3. Nous vous recommandons d'effectuer les opérations suivantes :

  • Configurer une stratégie AWS qui empêche l'accès au bucket Amazon S3 via HTTP
  • Configurer une stratégie AWS qui empêche l'accès public au bucket Amazon S3
  • Utiliser le chiffrement côté serveur Amazon S3
  • Limiter les autorisations accordées au compte Google au minimum requis
  • Configurer CloudTrails et activer les événements de données Amazon S3

Pour créer une stratégie IAM AWS, utilisez la console AWS ou Terraform :

Console AWS

  1. Accédez à la console IAM (Identity and Access Management) AWS. Vérifiez que vous vous trouvez dans le compte contenant le bucket Amazon S3 auquel vous souhaitez accéder.
  2. Sélectionnez Règles > Créer une règle (s'ouvre dans un nouvel onglet).
  3. Cliquez sur JSON, puis collez le texte suivant dans l'éditeur :

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

    Remplacez les éléments suivants :

    • BUCKET_NAME : bucket Amazon S3 auquel vous souhaitez que BigQuery accède.
    • EXPORT_PERM (facultatif): autorisation supplémentaire si vous souhaitez exporter des données vers un bucket Amazon S3. Remplacer par "s3:PutObject"
      • Pour dissocier le contrôle des accès à l'exportation, nous vous recommandons de créer une autre connexion à l'aide d'un rôle IAM AWS distinct auquel vous accordez un accès en écriture seule. Pour un contrôle d'accès plus précis, vous pouvez également limiter l'accès d'un rôle à un chemin spécifique du bucket.
  4. Dans le champ Nom, saisissez un nom de stratégie, tel que bq_omni_read_only.

  5. Cliquez sur Create policy (Créer une régle).

La stratégie est créée avec un nom de ressource Amazon (ARN) au format suivant :

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

Remplacez les éléments suivants :

  • AWS_ACCOUNT_ID : numéro d'identification de l'utilisateur IAM AWS à l'origine de la connexion
  • POLICY_NAME : nom de la règle que vous avez choisi.

Terraform

Ajoutez les éléments suivants à votre configuration Terraform pour associer une stratégie à une ressource de bucket 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
  }

Remplacez les éléments suivants :

  • BUCKET_NAME : bucket Amazon S3 auquel vous souhaitez que BigQuery accède.
  • EXPORT_PERM (facultatif): autorisation supplémentaire si vous souhaitez exporter des données vers un bucket Amazon S3. Remplacer par "s3:PutObject"
    • Pour dissocier le contrôle des accès à l'exportation, nous vous recommandons de créer une autre connexion à l'aide d'un rôle IAM AWS distinct auquel vous accordez un accès en écriture seule. Pour un contrôle d'accès plus précis, vous pouvez également limiter l'accès d'un rôle à un chemin spécifique du bucket.

Créer un rôle IAM AWS pour BigQuery

Vous allez ensuite créer un rôle permettant d'accéder au bucket Amazon S3 depuis BigQuery. Ce rôle utilise la stratégie que vous avez créée dans la section précédente.

Pour créer un rôle IAM AWS, utilisez la console AWS ou Terraform :

Console AWS

  1. Accédez à la console IAM AWS. Vérifiez que vous vous trouvez dans le compte contenant le bucket Amazon S3 auquel vous souhaitez accéder.
  2. Sélectionnez Rôles > Créer un rôle.
  3. Dans le champ Sélectionner le type d'entité de confiance, sélectionnez Identité Web.
  4. Pour Fournisseur d'identité, sélectionnez Google.
  5. Pour Audience, saisissez la valeur d'espace réservé 00000. Vous remplacerez cette valeur ultérieurement.
  6. Cliquez sur Next: Permissions (Suivant : Autorisations).
  7. Pour autoriser le rôle à accéder à vos données Amazon S3, associez-lui une stratégie IAM. Recherchez la stratégie que vous avez créée dans la section précédente, puis cliquez sur le bouton d'activation/de désactivation.
  8. Cliquez sur Next: Tags (Suivant : Tags).
  9. Cliquez sur Suivant : Relire. Saisissez un nom pour le rôle, par exemple BQ_Read_Only.
  10. Cliquez sur Créer un rôle.

Terraform

Ajoutez ci-dessous à votre configuration Terraform pour créer un rôle IAM et attribuez la stratégie au rôle créé :

  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
  }

Créer des connexions

Pour vous connecter à votre bucket Amazon S3, utilisez la console Google Cloud, l'outil de ligne de commande bq ou la bibliothèque cliente :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le menu Ajouter, sélectionnez Source de données externe.

  3. Dans le volet Source de données externes, saisissez les informations suivantes :

    • Dans le champ Type de connexion, sélectionnez BigLake sur AWS (via BigQuery Omni).
    • Dans le champ Connection ID (ID de connexion), saisissez un identifiant pour la ressource de connexion. Vous pouvez utiliser des lettres, des chiffres et des traits de soulignement.
    • Sélectionnez l'emplacement où vous souhaitez créer la connexion.
    • Facultatif : Dans le champ Nom descriptif, saisissez un nom clair pour identifier la connexion, tel que My connection resource. Ce nom peut correspondre à n'importe quelle valeur permettant d'identifier la ressource de connexion si vous devez la modifier ultérieurement.
    • Facultatif : Dans le champ Description, saisissez une description pour la ressource de connexion.
    • Dans le champ ID du rôle AWS, saisissez l'ID complet du rôle IAM que vous avez créé au format suivant : arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME.
  4. Cliquez sur Créer une connexion.

  5. Cliquez sur Accéder à la connexion.

  6. Dans le volet Connection info (Informations de connexion), copiez l'identité BigQuery Google. Il s'agit d'un principe de Google spécifique à chaque connexion. Exemple :

      BigQuery Google identity: 000000000000000000000
      

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

Remplacez les éléments suivants :

  • AWS_LOCATION: emplacement Amazon S3 dans Google Cloud
  • AWS_ACCOUNT : ID de compte AWS.
  • IAM_ROLE_NAME : rôle permettant d'accéder au bucket Amazon S3 depuis BigQuery. Utilisez la valeur de l'argument name de la ressource aws_iam_role dans la section Créer un rôle IAM AWS pour BigQuery.

bq

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

Remplacez les éléments suivants :

  • AWS_ACCOUNT_ID : numéro d'identification de l'utilisateur IAM AWS à l'origine de la connexion
  • ROLE_NAME : nom de la stratégie de rôle choisie
  • AWS_LOCATION: emplacement Amazon S3 dans Google Cloud
  • CONNECTION_ID : ID que vous attribuez à cette ressource de connexion.

La ligne de commande affiche le résultat suivant :

  Identity: IDENTITY_ID

Le résultat contient les éléments suivants :

  • IDENTITY_ID : compte principal Google contrôlé par Google Cloud, spécifique à chaque connexion.

Notez la valeur IDENTITY_ID.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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());
    }
  }
}

Ajouter une relation d'approbation au rôle AWS

BigQuery Omni propose deux méthodes pour accéder en toute sécurité aux données depuis Amazon S3. Vous pouvez accorder au compte de service Google Cloud l'accès à votre rôle AWS ou, si votre compte AWS dispose d'un rôle Fournisseur d'identité personnalisé pour accounts.google.com, vous devez ajouter le compte de service Google Cloud en tant qu'audience au fournisseur :

Ajouter une stratégie d'approbation au rôle AWS

La relation d'approbation permet à la connexion d'assurer le rôle qui lui a été attribué, et d'accéder aux données Amazon S3 comme spécifié dans la stratégie des rôles.

Pour ajouter une relation d'approbation, utilisez la console AWS ou Terraform :

Console AWS

  1. Accédez à la console IAM AWS. Vérifiez que vous vous trouvez dans le compte contenant le bucket Amazon S3 auquel vous souhaitez accéder.
  2. Cliquez sur Rôles.
  3. Sélectionnez le nom du rôle (ROLE_NAME) que vous avez créé.
  4. Cliquez sur Modifier, puis procédez comme suit :

    1. Définissez la durée maximale de la session sur 12 heures. Étant donné que chaque requête peut s'exécuter pendant un maximum de six heures, cette durée permet une nouvelle tentative. L'augmentation de la durée de session au-delà de 12 heures n'autorise pas de nouvelles tentatives. Pour en savoir plus, consultez la limite de temps d'exécution des requêtes sur plusieurs instructions.

      Bouton &quot;Modifier&quot; dans AWS pour définir la durée de la session.

    2. Cliquez sur Enregistrer les modifications.

  5. Sélectionnez Relations d'approbation, puis cliquez sur Edit trust relationship (Modifier la relation d'approbation). Remplacez le contenu de la règle par ce qui suit :

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

    Remplacez IDENTITY_ID par la valeur de l'identité Google BigQuery, que vous pouvez trouver sur la page de la console AWS pour la connexion que vous avez créée.

  6. Cliquez sur Update Trust Policy (Mettre à jour la règle d'approbation).

Terraform

Mettez à jour la ressource aws_iam_role dans la configuration Terraform pour ajouter une relation d'approbation :

    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 connexion est maintenant prête à être utilisée.

Configurer un fournisseur d'identité AWS personnalisé

Si votre compte AWS dispose d'un fournisseur d'identité personnalisé pour accounts.google.com, vous devez ajouter IDENTITY_ID comme une audience pour le fournisseur. Pour ce faire, vous pouvez utiliser au choix l'une des méthodes suivantes :

  1. Dans la console AWS, accédez à la page IAM.

    Accéder à IAM AWS

  2. Accédez à IAM > Fournisseurs d'identité.

  3. Sélectionnez le fournisseur d'identité pour accounts.google.com.

  4. Cliquez sur Ajouter une audience et ajoutez IDENTITY_ID comme audience.

La connexion est maintenant prête à être utilisée.

Partager des connexions avec les utilisateurs

Vous pouvez attribuer les rôles suivants pour permettre aux utilisateurs d'interroger des données et de gérer les connexions :

  • roles/bigquery.connectionUser permet aux utilisateurs de se connecter à des sources de données externes et d'y exécuter des requêtes.

  • roles/bigquery.connectionAdmin permet aux utilisateurs de gérer les connexions.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

    Les connexions sont répertoriées dans votre projet, dans un groupe appelé Connexions externes.

  2. Dans le volet Explorateur, cliquez sur votre nom de projet > Connexions externes > connexion.

  3. Dans le volet Détails, cliquez sur Partager pour partager une connexion. Ensuite, procédez comme suit :

    1. Dans la boîte de dialogue Autorisations de connexion, partagez la connexion avec d'autres comptes principaux en ajoutant ou en modifiant des comptes principaux.

    2. Cliquez sur Enregistrer.

bq

Vous ne pouvez pas partager de connexion avec l'outil de ligne de commande bq. Pour partager une connexion, utilisez la console Google Cloud ou la méthode de l'API BigQuery Connections permettant le partage de connexion.

API

Utilisez la méthode projects.locations.connections.setIAM dans la section de référence de l'API REST BigQuery Connections et fournissez une instance de la ressource policy.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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");
    }
  }
}

Étape suivante