Pourquoi ma tâche AWS Glue échoue-t-elle avec l'erreur « Répertoire temporaire non spécifié » lorsque j'insère ou extrais des données d'Amazon Redshift ?

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

Ma tâche AWS Glue échoue avec l'erreur « Répertoire temporaire non spécifié » lorsque j'insère ou extrais des données d'Amazon Redshift.

Brève description

Voici quelques éléments à retenir lorsque votre tâche AWS Glue écrit ou lit des données à partir d'Amazon Redshift :

  • Votre tâche AWS Glue écrit des données dans un cluster Amazon Redshift : la tâche écrit initialement les données dans un compartiment Amazon Simple Storage Service (Amazon S3) au format CSV. Ensuite, la tâche émet une commande COPIER à Amazon Redshift.
  • Votre tâche AWS Glue lit les données d'un cluster Amazon Redshift : la tâche décharge d'abord les données dans un compartiment Amazon S3 au format CSV à l'aide de la commande DÉCHARGER. Ensuite, la tâche charge les données dans le DynamicFrame à partir de ces fichiers de compartiment temporaires.

Cette erreur peut s'afficher lorsque l'une des conditions suivantes est remplie :

  • vous déchargez les données d'Amazon Redshift dans le compartiment S3 temporaire ;
  • vous chargez les données du compartiment S3 vers Amazon Redshift à l'aide de la commande COPIER ou DÉCHARGER.

Résolution

Voici quelques causes courantes et options de solution pour cette erreur.

Définir un répertoire temporaire

La raison la plus courante de cette erreur est le compartiment S3 temporaire manquant utilisé par la tâche AWS Glue comme répertoire intermédiaire. Par conséquent, veillez à définir un compartiment S3 comme répertoire temporaire pour votre tâche. Pour plus d'informations sur la définition d'un compartiment temporaire, consultez Paramètres spéciaux utilisés par AWS Glue.

Vérifier les autorisations de rôle IAM

Vérifiez les autorisations de rôle IAM pour vous assurer que vous disposez des autorisations appropriées pour accéder au compartiment S3 temporaire. Assurez-vous également de n'avoir pas bloqué les autorisations requises pour le compartiment dans les politiques suivantes pour le rôle IAM AWS Glue :

  • politique de compartiment ;
  • politique de point de terminaison d'un VPC S3 ;
  • politique AWS Organizations ;
  • politique de contrôle des services.

Voici quelques exemples d'autorisations requises : ListObjects, GetObject et PutObject.

Vérifier le nom du répertoire temporaire

Assurez-vous que le nom du compartiment S3 utilisé comme répertoire temporaire ne contient pas de période afin d'éviter l'exception suivante :

Caused by: java.sql.SQLException: [Amazon](500310) Invalid operation: UNLOAD destination is not supported.

Vérifier les autorisations AWS Key Management Service (AWS KMS)

Si vous utilisez des clés gérées par le client d'AWS Key Management Service (AWS KMS) pour chiffrer vos données, assurez-vous d'inclure extraunloadoptions dans additional_options pour votre instruction ETL dans le script AWS Glue. Par exemple :

datasource0 = glueContext.create_dynamic_frame.from_catalog(
    database = "database-name", 
    table_name = "table-name", 
    redshift_tmp_dir = args["TempDir"],
    additional_options = {"extraunloadoptions":"ENCRYPTED KMS_KEY_ID 'CMK key ID'"}, 
    transformation_ctx = "datasource0"
  )

Si vous utilisez AWS KMS pour chiffrer des données S3 et que vous rencontrez des problèmes d'autorisation liés à AWS KMS, assurez-vous que :

  • vous disposez des autorisations d'action AWS KMS similaires aux suivantes dans le rôle IAM AWS Glue ;
  • vous avez ajouté le rôle IAM AWS Glue dans la clé AWS KMS.
"Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
    ]

Vérifier les autorisations de rôle IAM pour la tâche AWS Glue Python Shell

Si vous tentez d'exécuter la commande COPIER ou DÉCHARGER à partir d'une tâche AWS Glue Python Shell et que vous ne parvenez pas à charger les informations d'identification, assurez-vous que :

  • vous avez ajouté le rôle IAM AWS Glue dans Amazon Redshift ;
  • le rôle de tâche AWS Glue inclut Amazon Redshift et AWS Glue dans sa politique de relation d'approbation. Par exemple :
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "glue.amazonaws.com",
          "redshift.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Vérifier s'il y a abandon de paquets

L'échec que rencontrent vos requêtes lorsqu'elles tentent d'atteindre le cluster Amazon Redshift même une fois la connexion réussie peut être dû à l'inadéquation de la taille de l'unité de transmission maximale (MTU) entre Amazon Redshift et le chemin réseau AWS Glue. Essayez de configurer les groupes de sécurité Amazon Redshift pour autoriser ICMP « destination inaccessible ». Pour plus d'informations, consultez la section Les requêtes semblent se bloquer et parfois échouent à atteindre le cluster.

Définir le répertoire temporaire dans le modèle AWS CloudFormation

Si vous avez créé votre tâche AWS Glue à l'aide de CloudFormation, assurez-vous que vous avez fourni l'emplacement du répertoire temporaire dans le paramètre DefaultArguments de votre modèle CloudFormation. Par exemple :

"DefaultArguments": { "--TempDir": "s3://doc-example-bucket/doc-example-folder"}

Définir un répertoire temporaire dans DynamicFrame

Si vous obtenez l'erreur même après avoir défini le répertoire temporaire dans votre tâche AWS Glue, vérifiez si vous lisez ou écrivez dans Amazon Redshift. Pour ce faire, vous pouvez utiliser la méthode DynamicFrame d'AWS Glue. Ensuite, vérifiez que :

Vous avez passé votre répertoire temporaire dans la propriété redshift_tmp_dir de votre DynamicFrame :

  • Pour créer un DynamicFrame à l'aide d'une base de données et d'une table de catalogue de données, consultez create_dynamic_frame_from_catalog.
  • Pour créer un DynamicFrame avec une connexion et un format spécifiés, consultez create_dynamic_frame_from_options.
  • Pour écrire dans un DynamicFrame à l'aide d'informations provenant d'une base de données et d'une table de catalogue de données, consultez write_dynamic_frame_from_catalog.
  • Pour écrire dans un DynamicFrame avec une connexion et un format spécifiés, consultez write_dynamic_frame_from_options.
  • Pour écrire dans un DynamicFrame ou une DynamicFrameCollection avec une connexion et un format spécifiés, consultez write_from_options.
  • Pour écrire dans un DynamicFrame ou une DynamicFrameCollection à l'aide d'informations provenant d'une connexion JDBC spécifiée, consultez write_from_jdbc_conf.

Vous avez TempDir spécifié dans la fonction getResolvedOptions pour votre tâche ETL :

Utilisez les commandes suivantes pour récupérer le nom de la tâche et les paramètres TempDir :

import sys
from awsglue.utils import getResolvedOptions
args = getResolvedOptions(sys.argv,['JOB_NAME','TempDir'])
TempDir = args['TempDir']

Pour plus d'informations, consultez les paramètres d'accès à l'aide de GetResolvedOptions.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?