Comment fournir un accès intercompte aux ressources du catalogue de données AWS Glue ?

Dernière mise à jour : 21/10/2022

Je veux utiliser des services tels qu'Amazon EMR, Amazon Athena et AWS Glue avec le catalogue de données AWS Glue dans un autre compte.

Solution

La façon dont vous accédez aux ressources intercompte dans le catalogue de données AWS Glue dépend du service AWS que vous utilisez pour vous connecter. Cette méthode d'accès dépend également du fait que vous utilisez ou non AWS Lake Formation pour contrôler l'accès au catalogue de données.

Si vous ne savez pas si vous utilisez Lake Formation et que vous voulez partager une table, exécutez la commande suivante de l'interface de la ligne de commande AWS (AWS CLI) :

aws glue get-table --database-name DOC-EXAMPLE-DB --name DOC-EXAMPLE-TABLE --query 'Table.IsRegisteredWithLakeFormation'

Veillez à remplacer les valeurs suivantes dans cette commande :

  • DOC-EXAMPLE-DB par le nom de la base de données
  • DOC-EXAMPLE-TABLE par le nom de la table

Si la commande renvoie vrai, vous utilisez Lake Formation.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Le catalogue de données peut se trouver dans un environnement hybride avec certaines tables utilisant des autorisations Lake Formation et d'autres celles d'AWS Glue. Pour mettre à niveau votre catalogue de données vers Lake Formation, consultez l'article Mise à niveau des autorisations de données AWS Glue vers le modèle AWS Lake Formation.

Remarque : cet article présente les solutions pour l'accès intercompte au sein d'une seule région AWS. Il n'aborde pas l'accès aux ressources dans une autre région. Si vous voulez répliquer le catalogue de données de votre compte vers un compte d'une autre région AWS, consultez l'utilitaire de réplication de catalogue de données AWS Glue (Langue Français non disponible) sur GitHub.

Accès au catalogue de données sans Lake Formation

Si vous n'utilisez pas Lake Formation, procédez comme suit pour accorder des autorisations au niveau des ressources au compte A à partir du catalogue de données AWS Glue du compte B.

Remarque : le compte A correspond au compte d'extraction, transformation et chargement (ETL), et le compte B au compte sur lequel se trouvent les ressources du catalogue de données AWS Glue.

Accès aux ressources à l'aide d'une tâche ETL AWS Glue

1.    Attachez une politique de ressources similaire à la suivante au compte A pour accéder aux bases de données et aux tables du compte B. Vous pouvez le faire à l'aide de la console AWS Glue en choisissant Catalog settings (Paramètres du catalogue) dans le panneau de navigation.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

Veillez à remplacer les valeurs suivantes dans cette politique :

  • 1111222233334444 par l'ID de compte pour le compte A
  • 5555666677778888 par l'ID de compte pour le compte B
  • us-east-1 par la région de votre choix
  • DOC-EXAMPLE-DB par le nom de la base de données

Vous pouvez également limiter l'accès à un rôle spécifique du compte A qui est utilisé pour exécuter la tâche. Pour ce faire, incluez l'ARN du rôle dans la politique. Par exemple :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:role/service-role/AWSGlueServiceRole-Glue-Test"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

Veillez à remplacer les valeurs suivantes dans cette politique :

  • 1111222233334444 par l'ID de compte pour le compte A
  • 5555666677778888 par l'ID de compte pour le compte B
  • us-east-1 par la région de votre choix
  • DOC-EXAMPLE-DB par le nom de la base de données
  • AWSGlueServiceRole-Glue-Test par l'ARN du rôle utilisé pour exécuter la tâche ETL

2.    L'utilisateur AWS Identity and Access Management (IAM) du compte A qui exécute la tâche ETL doit avoir accès aux bases de données et aux tables du compte B. Dans le compte A, associez une politique IAM au rôle IAM responsable de la tâche ETL AWS Glue pour qu'il puisse accéder à la base de données et aux tables du compte B :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetConnection",
        "glue:GetTable",
        "glue:GetPartition"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/default",
        "arn:aws:glue:us-east-1:5555666677778888:database/DOC-EXAMPLE-DB",
        "arn:aws:glue:us-east-1:5555666677778888:table/DOC-EXAMPLE-DB/*"
      ]
    }
  ]
}

Remarque : si vous utilisez Athena avec le catalogue de données AWS Glue, incluez la base de données par défaut dans la politique. Cela permet de s'assurer que les actions GetDatabase et CreateDatabase réussissent. Pour plus d'informations, consultez Stratégie d'accès à la base de données Default et au catalogue par région AWS.

Veillez à remplacer les valeurs suivantes dans cette politique :

  • 1111222233334444 par l'ID de compte pour le compte A
  • 5555666677778888 par l'ID de compte pour le compte B
  • us-east-1 par la région de votre choix
  • DOC-EXAMPLE-DB par le nom de la base de données

3.    Après avoir accordé l'autorisation requise au compte A, vous pouvez vérifier si le compte A a accès au catalogue de données du compte B. Pour ce faire, créez une tâche ETL avec le script suivant :

"""Create Spark Session with cross-account AWS Glue Data Catalog"""
from pyspark.sql import SparkSession

spark_session = SparkSession.builder.appName("Spark Glue Example") \
.config("hive.metastore.client.factory.class", \
"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
.config("hive.metastore.glue.catalogid", "5555666677778888") \
.enableHiveSupport() \
.getOrCreate()

table_df = spark_session.sql("SELECT * FROM DOC-EXAMPLE-DB.DOC-EXAMPLE-TABLE limit 10")

table_df.show()

Veillez à remplacer les valeurs suivantes dans le script :

  • 5555666677778888 par l'ID de compte pour le compte B
  • DOC-EXAMPLE-DB par le nom de la base de données
  • DOC-EXAMPLE-TABLE par le nom de la table

Accès aux ressources avec Amazon EMR

Pour accéder au catalogue de données dans un autre compte avec Amazon EMR, consultez Comment utiliser Hive et Spark sur Amazon EMR pour interroger un catalogue de données AWS Glue se trouvant sur un autre compte AWS ?

Accès aux ressources avec Athéna

Pour accéder au catalogue de données sur un autre compte avec Athena, consultez Accès intercompte aux catalogues de données AWS Glue.

Accès au catalogue de données avec Lake Formation

Si vous utilisez Lake Formation, vous pouvez utiliser l'une des méthodes suivantes pour accorder un accès entre comptes au catalogue de données :

  • Ressource nommée
  • Contrôle d'accès basé sur les identifications (TBAC)

Important : pour empêcher les nouvelles tables du catalogue de données d'avoir une autorisation Super par défaut sur IAMAllowedPrincipals, effectuez les étapes suivantes :

1.    Ouvrez la console AWS Lake Formation.

2.    Dans le panneau de navigation, sélectionnez Data Catalog (Catalogue de données), puis Settings (Paramètres).

3.    Désactivez à la fois Use only IAM access control for new databases (Utiliser uniquement le contrôle d'accès IAM pour les nouvelles bases de données) et Use only IAM access control for new tables in this database (Utiliser uniquement le contrôle d'accès IAM pour les nouvelles tables de cette base de données).

4.    Sélectionnez Save (Enregistrer).

Pour plus d'informations, consultez l'article Modification des paramètres de sécurité par défaut de votre lac de données.

Accorder des autorisations entre comptes à l'aide de la méthode de ressource nommée

AWS Resource Access Manager (AWS RAM) est utilisé pour fournir des autorisations aux bases de données à l'aide de la méthode de ressource nommée.

Pour accorder des autorisations Lake Formation au compte A pour les ressources du catalogue de données du compte B, procédez comme suit :

1.    Attachez une politique de ressources similaire à la suivante dans le catalogue de données du compte B :

{
  "Effect": "Allow",
  "Action": [
    "glue:ShareResource"
  ],
  "Principal": {
    "Service": [
      "ram.amazonaws.com"
    ]
  },
  "Resource": [
    "arn:aws:glue:us-east-1:5555666677778888:table/*/*",
    "arn:aws:glue:us-east-1:5555666677778888:database/*",
    "arn:aws:glue:us-east-1:5555666677778888:catalog"
  ]
}

Assurez-vous de remplacer 5555666677778888 dans la politique par l'ID de compte B.

2.    Utilisez la méthode de ressource nommée pour accorder des autorisations Lake Formation aux bases de données et aux tables du catalogue de données dans le compte B. Pour plus d'informations, consultez l'article Accorder des autorisations au catalogue de données à l'aide de la méthode de ressource nommée.

Accorder des autorisations entre comptes à l'aide du contrôle TBAC

Avec le contrôle d'accès basé sur les identifications (TBAC), vous pouvez définir des identifications de politique et attribuer ces identifications à des bases de données, des tables et des colonnes AWS Glue. Ces balises peuvent ensuite être utilisées pour appliquer un accès précis à ces ressources du catalogue de données. Pour plus d'informations, consultez Partage de données à l'aide du contrôle d'accès basé sur les balises (Langue Français non garanti).

Pour accorder des autorisations Lake Formation à l'aide du TBAC, effectuez les étapes suivantes :

1.    Attachez une politique de ressources similaire à la suivante dans le catalogue de données pour le compte B :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:root"
      },
      "Action": "glue:*",
      "Resource": [
        "arn:aws:glue:us-east-1:5555666677778888:catalog",
        "arn:aws:glue:us-east-1:5555666677778888:database/*",
        "arn:aws:glue:us-east-1:5555666677778888:table/*"
      ],
      "Condition": {
        "Bool": {
          "glue:EvaluatedByLakeFormationTags": true
        }
      }
    }
  ]
}

Assurez-vous de remplacer les valeurs suivantes dans la politique :

  • 1111222233334444 par l'ID de compte pour le compte A
  • 5555666677778888 par l'ID de compte pour le compte B

2.    Créez les identifications de politique.

3.    Utilisez la méthode TBAC pour accorder des autorisations Lake Formation sur les ressources du catalogue de données. Pour plus d'informations, consultez la section Octroi d'autorisations de catalogues de données à l'aide de la méthode LF-TBAC (Langue Français non garanti).