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

Date de la dernière mise à jour : 13/08/2021

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

Résolution

La méthode que vous pouvez utiliser pour accéder aux ressources du catalogue de données AWS Glue dans un autre compte dépend du service AWS auquel vous vous connectez et de l'utilisation ou non d'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 souhaitez partager une table, exécutez la commande AWS Command Line Interface (AWS CLI) suivante :

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

Assurez-vous de remplacer les valeurs suivantes dans la commande ci-dessus :

  • 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 true, vous utilisez Lake Formation.

Remarque : si vous recevez des erreurs pendant 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 entre comptes au sein d'une seule région AWS. Il n'aborde pas l'accès aux ressources dans une autre région. Si vous souhaitez 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.

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 source et le compte B au compte sur lequel se trouvent les ressources du catalogue de données AWS Glue.

Accès aux ressources avec une tâche d'extraction, de transformation et de chargement (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 Paramètres 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/*"
      ]
    }
  ]
}

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

  • 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 utilisé pour exécuter la tâche en incluant 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/*"
      ]
    }
  ]
}

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

  • 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 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, attachez une politique IAM au rôle IAM responsable de la tâche AWS Glue ETL 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, veillez à inclure la base de données par défaut dans la politique pour que les actions GetDatabase et CreateDatabase aboutissent. Pour plus d'informations, consultez la section Accès précis aux bases de données et aux tables dans le catalogue de données AWS Glue.

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

  • 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 créer une tâche ETL avec le script suivant pour vérifier si le compte A a accès au catalogue de données du compte B.

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

Pour accéder au catalogue de données dans un autre compte avec 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 dans un autre compte avec Athena, consultez Enregistrement d'un catalogue de données AWS Glue à partir d'un autre compte.

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, procédez comme suit :

  1. Ouvrez la console AWS Lake Formation.
  2. Dans le panneau de navigation, choisissez Catalogue de données, puis Paramètres.
  3. Effacez Utiliser uniquement le contrôle d'accès IAM pour les nouvelles bases de données et Utiliser uniquement le contrôle d'accès IAM pour les nouvelles tables de cette base de données.
  4. Choisissez 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 identifications peuvent ensuite être utilisées pour appliquer un accès précis à ces ressources du catalogue de données. Pour plus d'informations, consultez l'article Contrôle d'accès basé sur des identifications dans Lake Formation.

Pour accorder des autorisations Lake Formation à l'aide du TBAC, procédez comme suit :

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 Accorder des autorisations de catalogue de données à l'aide de la méthode de contrôle TBAC.