Créer une connexion BigQuery AWS

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.

Avant de commencer

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

Créer un rôle 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 S3 via HTTP
  • Configurer une stratégie AWS qui empêche l'accès public au bucket S3
  • Utiliser le chiffrement côté serveur S3
  • Limiter les autorisations accordées au compte Google au minimum requis
  • Configurer CloudTrails et activer les événements de données S3

Pour créer un rôle IAM AWS, procédez comme suit :

  1. Accédez à la console IAM (Identity and Access Management) AWS. Vérifiez que vous vous trouvez dans le compte contenant le bucket S3 auquel vous souhaitez accéder.
  2. Sélectionnez Rôles > Créer un rôle.
  3. Dans le champ Select type of trusted entity (Sélectionner le type d'entité de confiance), sélectionnez Another AWS account (Autre compte AWS).
  4. Dans le champ ID de compte, saisissez l'ID numérique de votre compte AWS. Vous remplacerez ensuite cette valeur par le numéro d'identification de l'utilisateur IAM AWS à l'origine de la connexion.
  5. Sélectionnez Require External ID (Exiger un ID externe), puis saisissez 00000 en tant que valeur d'espace réservé. Vous remplacerez ensuite cette valeur par l'ID externe de la connexion.
  6. Cliquez sur Next: Permissions (Suivant : Autorisations).
  7. Pour autoriser le rôle à accéder à vos données AWS, créez une stratégie IAM et associez-la au rôle. Par exemple, créez une stratégie IAM qui fournit un accès en lecture seule à votre bucket.

    1. Sélectionnez Règles > Créer une règle (s'ouvre dans un nouvel onglet).
    2. 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"
        ],
        "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
      }
    ]
    }
    

    Remplacez l'élément suivant :

    • BUCKET_NAME : bucket S3 auquel vous souhaitez que BigQuery accède
  8. Dans le champ Nom, saisissez un nom de stratégie.

  9. Pour créer la stratégie d'accès S3, cliquez sur Créer une règle.

  10. Pour associer la stratégie au rôle, sélectionnez-la dans l'onglet Créer un rôle.

  11. Dans le champ Nom, saisissez un nom de rôle.

  12. Cliquez sur Créer un rôle.

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

  arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
  

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 du rôle choisi

Si vous devez exporter des données vers un bucket Amazon S3, vous devez également disposer de l'autorisation s3:PutObject. Pour dissocier le contrôle des accès, 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 la connexion BigQuery AWS

Pour créer une connexion BigQuery AWS, utilisez Cloud Console, l'outil de ligne de commande bq ou la bibliothèque cliente :

Console

  1. Pour créer une ressource de connexion, accédez à la page BigQuery dans Cloud Console.

    Accéder à BigQuery

  2. Dans le menu Ajouter des données , 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 AWS.
    • 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.
    • Dans le champ Emplacement de connexion, sélectionnez aws-us-east-1.
    • 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 Create connection (Créer une connexion). La ligne de commande affiche le résultat suivant :

        IAM user: USER_ID
        External Id: EXTERNAL_ID
      

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

    • USER_ID : utilisateur AWS spécifique à chaque connexion contrôlé par Google Cloud
    • EXTERNAL_ID : chaîne unique attribuée à chaque connexion

      Retenez les valeurs USER_ID et EXTERNAL_ID.

bq

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

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 AWS dans Google Cloud. Doit être défini sur aws-us-east-1.
  • CONNECTION_NAME : nom attribué à la ressource de connexion

La ligne de commande affiche le résultat suivant :

  IAM user: USER_ID
  External Id: EXTERNAL_ID

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

  • USER_ID : utilisateur AWS spécifique à chaque connexion contrôlé par Google Cloud
  • EXTERNAL_ID : chaîne unique attribuée à chaque connexion

Retenez les valeurs USER_ID et EXTERNAL_ID.

Java

import com.google.cloud.bigquery.connection.v1.AwsCrossAccountRole;
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";
    // Note: As of now location only supports 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";
    AwsCrossAccountRole role = AwsCrossAccountRole.newBuilder().setIamRoleId(iamRoleId).build();
    AwsProperties awsProperties = AwsProperties.newBuilder().setCrossAccountRole(role).build();
    Connection connection = Connection.newBuilder().setAws(awsProperties).build();
    createAwsConnection(projectId, location, connectionId, connection);
  }

  public 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);
      AwsCrossAccountRole role = response.getAws().getCrossAccountRole();
      System.out.println(
          "Aws connection created successfully : Aws userId :"
              + role.getIamUserId()
              + " Aws externalId :"
              + role.getExternalId());
    }
  }
}

Ajouter une relation d'approbation au rôle AWS

La relation d'approbation permet à la connexion BigQuery AWS de prendre le rôle et d'accéder aux données S3 comme spécifié dans la stratégie des rôles.

Pour ajouter une relation d'approbation, procédez comme suit :

  1. Accédez à la console IAM AWS. Vérifiez que vous vous trouvez dans le compte contenant le bucket 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. Définissez la durée maximale de la session de l'API/de la CLI sur 12 heures.
  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": {
          "AWS": "GOOGLE_AWS_USER"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "EXTERNAL_ID"
          }
        }
    }]
    }
    
  6. Cliquez sur Update Trust Policy (Mettre à jour la règle d'approbation).

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

Étape suivante