

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Connexion à Asana
<a name="connecting-to-asana"></a>

Asana est une solution de collaboration d’équipe cloud qui aide les équipes à organiser, à planifier et à exécuter des tâches et des projets. Si vous utilisez Asana, votre compte contient des données sur vos espaces de travail, vos projets, vos tâches, vos équipes, etc. Vous pouvez transférer des données d’Asana vers certains services AWS ou d’autres applications compatibles.

**Topics**
+ [AWS Glue support pour Asana](asana-support.md)
+ [Politiques contenant les opérations API pour la création et l’utilisation des connexions](asana-configuring-iam-permissions.md)
+ [Configuration d’Asana](asana-configuring.md)
+ [Configuration de connexions Asana](asana-configuring-connections.md)
+ [Lecture à partir d’entités Asana](asana-reading-from-entities.md)
+ [Options de connexion Asana](asana-connection-options.md)
+ [Création d’un compte Asana](asana-create-account.md)
+ [Limitations](asana-connector-limitations.md)

# AWS Glue support pour Asana
<a name="asana-support"></a>

AWS Glue prend en charge Asana comme suit :

**Prise en charge en tant que source ?**  
Oui. Vous pouvez utiliser les tâches AWS Glue ETL pour interroger les données d'Asana.

**Prise en charge en tant que cible ?**  
Non.

**Versions d’API Asana prises en charge**  
 1.0 

# Politiques contenant les opérations API pour la création et l’utilisation des connexions
<a name="asana-configuring-iam-permissions"></a>

L'exemple de politique suivant décrit les AWS autorisations requises pour créer et utiliser des connexions. Si vous créez un rôle, créez une politique contenant les éléments suivants : 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

Si vous ne voulez pas utiliser la méthode ci-dessus, vous pouvez également utiliser les politiques IAM gérées suivantes :
+  [ AWSGlueServiceRole ](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole)— Accorde l'accès aux ressources dont AWS Glue les différents processus ont besoin pour s'exécuter en votre nom. Ces ressources incluent AWS Glue Amazon S3, IAM, CloudWatch Logs et Amazon EC2. Si vous suivez la convention de dénomination des ressources spécifiée dans cette politique, AWS Glue les processus disposent des autorisations requises. Cette politique est généralement attachée aux rôles spécifiés lorsque vous définissez les crawlers, les tâches et les points de terminaison de développement. 
+  [ AWSGlueConsoleFullAccess ](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)— Accorde un accès complet aux AWS Glue ressources lorsqu'une identité à laquelle la politique est attachée utilise la console AWS de gestion. Si vous suivez la convention de dénomination pour les ressources spécifiées dans la politique, les utilisateurs bénéficient des capacités totales de la console. Cette politique s'applique généralement aux utilisateurs de la AWS Glue console. 

# Configuration d’Asana
<a name="asana-configuring"></a>

Avant de pouvoir AWS Glue effectuer un transfert depuis Asana, vous devez remplir les conditions suivantes :

## Configuration requise
<a name="asana-configuring-min-requirements"></a>
+ Vous disposez d’un compte Asana avec adresse e-mail et mot de passe. Pour plus d’informations sur la création d’un compte, consultez [Creating a Asana account](asana-create-account.md). 
+ Vous devez avoir créé AWS un compte avec l'accès au service à AWS Glue. 
+ Assurez-vous d’avoir créé l’une des ressources suivantes dans votre compte Asana : 
  + Une application pour développeurs qui prend en charge l’authentification `OAuth 2.0`. Pour plus d'instructions, consultez la documentation destinée [OAuth](https://developers.asana.com/docs/oauth)aux développeurs d'Asana. Sinon, consultez [Création d’un compte Asana](asana-create-account.md). 
  + Un jeton d’accès personnel. Pour plus d’informations, consultez le jeton d’accès personnel [https://developers.asana.com/docs/personal-access-token](https://developers.asana.com/docs/personal-access-token) dans la documentation destinée aux développeurs Asana. 

Si vous répondez à ces exigences, vous êtes prêt à vous connecter AWS Glue à votre compte Adobe Analytics. Pour les connexions classiques, vous n’avez rien d’autre à faire dans Adobe Analytics.

# Configuration de connexions Asana
<a name="asana-configuring-connections"></a>

Asana prend en charge le type d’autorisation `AUTHORIZATION_CODE` pour `OAuth2`. 

Ce type d’autorisation est considéré comme `OAuth` tridimensionnel, car il repose sur la redirection des utilisateurs vers le serveur d’autorisation tiers pour authentifier l’utilisateur. Les utilisateurs peuvent choisir de créer leur propre application connectée sur Asana et de fournir leur propre identifiant client et leur secret client lors de la création de connexions via la AWS Glue console. Dans ce scénario, ils seront toujours redirigés vers Asana pour se connecter et autoriser l'accès AWS Glue à leurs ressources. 

Ce type d’autorisation donne lieu à un jeton d’actualisation et à un jeton d’accès. Le jeton d’accès est de courte durée et peut être actualisé automatiquement sans interaction de l’utilisateur à l’aide du jeton d’actualisation. 

Pour consulter la documentation publique d'Asana sur la création d'une application connectée pour `AUTHORIZATION_CODE OAuth` Flow, consultez [Asana APIs](https://developers.asana.com/docs/oauth). 

Pour configurer une connexion Asana :

1. Dans AWS Secrets Manager, créez un secret avec les informations suivantes : 
   + Pour l’application connectée gérée par le client : le secret doit contenir le secret du consommateur de l’application connectée avec `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` comme clé. 
   + 
**Note**  
Vous devez créer un secret pour la connexion dans AWS Glue.

1. Dans AWS Glue Studio, créez une connexion sous **Connexions de données** en suivant les étapes ci-dessous : 

   1. Lorsque vous sélectionnez un **type de connexion**, sélectionnez Asana.

   1. Indiquez l’environnement Asana.

   1. Sélectionnez le rôle IAM pour lequel AWS Glue vous pouvez assumer et qui dispose des autorisations nécessaires pour effectuer les actions suivantes : 

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1. Sélectionnez celui `secretName` que vous souhaitez utiliser pour cette connexion AWS Glue afin d'y placer les jetons. 

   1.  Sélectionnez les options réseau si vous souhaitez utiliser votre réseau. 

1. Accordez au rôle IAM associé à votre AWS Glue travail l'autorisation de lire`secretName`. 

# Lecture à partir d’entités Asana
<a name="asana-reading-from-entities"></a>

 **Conditions préalables** 

Un objet Asana à partir duquel vous souhaitez lire. Reportez-vous au tableau des entités prises en charge ci-dessous pour vérifier les entités disponibles. 

 **Entités prises en charge pour la source** 


| Entité | Peut être filtré | Limit prise en charge | Order by prise en charge | Select prise en charge\$1 | Partitionnement pris en charge | 
| --- | --- | --- | --- | --- | --- | 
|  Espace de travail  | Non | Oui | Non | Oui | Non | 
| Balise | Non | Oui | Non | Oui | Non | 
| Utilisateur | Non | Oui | Non | Oui | Non | 
|  Portfolio  | Non | Oui | Non | Oui | Non | 
| Team | Non | Oui | Non | Oui | Non | 
| Project | Oui | Oui | Non | Oui | Non | 
| Section | Non | Oui | Non | Oui | Non | 
| Sous-tâche  | Oui | Non | Non | Oui | Oui | 
| Objectif | Oui | Oui | Non | Oui | Non | 
|  AuditLogEvent  | Oui | Oui | Non | Oui | Non | 
|  Status Update  | Oui | Oui | Non | Oui | Non | 
|  Custom Field  | Non | Oui | Non | Oui | Non | 
|  Project Brief  | Oui | Non | Non | Oui | Oui | 

 **Exemple** 

```
read_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Asana",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "task/workspace:xxxx",
        "API_VERSION": "1.0",
        "PARTITION_FIELD": "created_at",
        "LOWER_BOUND": "2024-02-05T14:09:30.115Z",
        "UPPER_BOUND": "2024-06-07T13:30:00.134Z",
        "NUM_PARTITIONS": "3"
    }
```

 **Détails des entités et des champs Asana** 
+ [Espace de travail](https://developers.asana.com/docs/workspaces)
+ [Balise](https://developers.asana.com/docs/tags)
+ [Utilisateur](https://developers.asana.com/docs/users)
+ [Portfolio](https://developers.asana.com/docs/portfolios)
+ [Team](https://developers.asana.com/docs/teams)
+ [Project](https://developers.asana.com/docs/get-all-projects-in-a-workspace)
+ [Rubrique](https://developers.asana.com/docs/get-sections-in-a-project)
+ [Tâche](https://developers.asana.com/docs/search-tasks-in-a-workspace) 
+ [Objectif](https://developers.asana.com/docs/get-goals)
+ [AuditLogEvent](https://developers.asana.com/docs/audit-log-api)
+ [Status Update](https://developers.asana.com/reference/status-updates)
+ [Custom Field](https://developers.asana.com/reference/custom-fields)
+ [Project Brief](https://developers.asana.com/reference/project-briefs)

 **Requêtes de partitionnement** 

Les options Spark supplémentaires `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` et `NUM_PARTITIONS` peuvent être indiquées si vous souhaitez utiliser la simultanéité dans Spark. Avec ces paramètres, la requête d’origine serait divisée en `NUM_PARTITIONS` nombres de sous-requêtes pouvant être exécutées simultanément par les tâches Spark. 
+ `PARTITION_FIELD` : le nom du champ à utiliser pour partitionner la requête. 
+ `LOWER_BOUND` : une valeur limite inférieure inclusive du champ de partition choisi. 

  Pour le champ Date, nous acceptons le format de date Spark utilisé dans les requêtes SQL Spark. Exemples de valeurs valides : `2024-06-07T13:30:00.134Z`. 
+ `UPPER_BOUND` : une valeur limite supérieure exclusive du champ de partition choisi. 
+ `NUM_PARTITIONS` : nombre de partitions. 

 Les détails relatifs à la prise en charge des champs de partitionnement par entité sont présentés dans le tableau suivant. 


| Nom de l'entité | Champ de partitionnement | Type de données | 
| --- | --- | --- | 
| Sous-tâche |  created\$1at  | DateTime | 
| Sous-tâche |  modified\$1at  | DateTime | 

 **Exemple** 

```
read_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Asana",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "task/workspace:xxxx",
        "API_VERSION": "1.0",
        "PARTITION_FIELD": "created_at",
        "LOWER_BOUND": "2024-02-05T14:09:30.115Z",
        "UPPER_BOUND": "2024-06-07T13:30:00.134Z",
        "NUM_PARTITIONS": "3"
    }
```

# Options de connexion Asana
<a name="asana-connection-options"></a>

Les options de connexion pour Asana sont les suivantes :
+  `ENTITY_NAME`(Chaîne) - (Obligatoire) Utilisé pour la lecture/l’écriture. Le nom de votre objet dans Asana. 
+  `API_VERSION`(Chaîne) - (Obligatoire) Utilisé pour la lecture/l’écriture. Version d’API Rest Asana que vous souhaitez utiliser. Par exemple : 1.0. 
+  `SELECTED_FIELDS`(Liste<Chaîne>) - Par défaut : vide (SELECT \$1). Utilisé pour la lecture. Colonnes que vous souhaitez sélectionner pour l’objet. 
+  `FILTER_PREDICATE`(Chaîne) - Par défaut : vide. Utilisé pour la lecture. Doit être au format SQL Spark. 
+  `QUERY`(Chaîne) - Par défaut : vide. Utilisé pour la lecture. Requête Spark SQL complète. 
+ `PARTITION_FIELD`(Chaîne) - Utilisé pour la lecture. Champ à utiliser pour partitionner la requête. 
+  `LOWER_BOUND`(Chaîne) - Utilisé pour la lecture. Une valeur limite inférieure inclusive du champ de partition choisi. 
+  `UPPER_BOUND`(Chaîne) - Utilisé pour la lecture. Une valeur limite supérieure exclusive du champ de partition choisi. 
+  `NUM_PARTITIONS`(Entier) - Par défaut : 1. Utilisé pour la lecture. Nombre de partitions pour la lecture. 

# Création d’un compte Asana
<a name="asana-create-account"></a>

1. Créez un [compte Asana](https://asana.com/create-account) et choisissez **S’inscrire**.

1. Une fois connecté, vous serez redirigé vers la page [Configuration du compte](https://app.asana.com/0/account_setup). Procédez comme suit :
   + Consultez le formulaire de configuration du compte.
   + Renseignez toutes les informations nécessaires pour créer votre compte Asana.
   + Vérifiez l’exactitude des informations.

1. Choisissez **Créer un compte** ou **Soumettre** (le texte exact du bouton peut varier) pour finaliser la configuration de votre compte.

**Création de l’application dans Asana pour `OAuth2.0`**

1. Connectez-vous à votre compte Asana à l’aide de vos [informations d’identification client Asana](https://app.asana.com/-/login). 

1. Choisissez l’icône de votre profil utilisateur dans le coin supérieur droit et sélectionnez **Mes paramètres** dans le menu déroulant.

1. Sélectionnez l’onglet **Applications**, puis **Gérer les applications de développeurs**.

1. Sélectionnez **Créer une application** et entrez les informations pertinentes. 

1. Sélectionnez **Créer des applications**.

1. Sur la page **Mes applications** : 

   1. Sélectionnez **OAuth**et dans la section **Informations d'identification de l'application**, notez votre identifiant client et votre secret client.

   1. Dans la URLs section **Redirection**, ajoutez les URL de redirection nécessaires.
**Note**  
Entrez l’URI de redirection en utilisant ce format : `https://{aws-region-code}.console.aws.amazon.com/gluestudio/oauth`. Par exemple, pour USA Est (Virginie du Nord), utilisez : `https://us-east-1.console.aws.amazon.com/gluestudio/oauth`

**Création de l’application dans Asana pour le jeton `PAT`**

1. Connectez-vous à votre compte Asana à l’aide de vos [informations d’identification client Asana](https://app.asana.com/-/login). 

1. Choisissez l’icône de votre profil utilisateur dans le coin supérieur droit et sélectionnez **Mes paramètres de profil** dans le menu déroulant.

1. Sélectionnez l’onglet **Applications**, puis **Comptes de service**.

1. Sélectionnez **Créer une application** et entrez les informations pertinentes. 

1. Choisissez **Ajouter un compte de service**.

1. La page suivante affiche votre jeton, copiez-le et stockez-le en toute sécurité. 
**Important**  
Ce jeton ne sera affiché qu’une seule fois. Assurez-vous de le copier et de le stocker en toute sécurité. 

# Limitations
<a name="asana-connector-limitations"></a>

Les restrictions du connecteur Asana sont les suivantes :
+ Les comptes de service dans Enterprise Domains ne peuvent accéder qu’aux points de terminaison de l’API du journal d’audit. L’authentification à l’aide du jeton d’accès personnel d’un compte de service est requise pour accéder à ces points de terminaison.
+ L’entité Goal n’est accessible que pour les comptes utilisateur dotés d’un forfait Premium ou supérieur.
+ `Audit Log Event Entity` : dans le connecteur, les champs `start_at` et `end_at` sont combinés en un seul champ « start\$1end\$1at » pour prendre en charge le filtrage et le transfert incrémentiel.
+ Le partitionnement ne peut pas être pris en charge pour le `Date` champ, même s'il prend en charge les opérateurs greater-than-or-equal -to et less-than-or-equal -to. Scénario : création d’une tâche avec `partitionField` en tant que `due_on` (datatype : date), `lowerBound` en tant que `2019-09-14`, `upperBound` en tant que `2019-09-16` et `numPartition` en tant que `2`. La partie filtre de l’URL du point de terminaison est créée comme suit :
  + partition1 : due\$1on.before=2019-09-14&due\$1on.after=2019-09-14
  + partition2 : due\$1on.before=2019-09-15&due\$1on.after=2019-09-15 Sortie :
  + Dans partition1, nous obtenons des données dont la date d’échéance (due\$1date) est le 14/09/2019 et le 15/09/2019.
  + Dans partition2, nous obtenons les mêmes données avec une date d’échéance le 15/09/2019 (qui se trouvaient dans partition1), ainsi que d’autres données, ce qui entraîne une duplication des données.
+ Le filtrage et le partitionnement ne peuvent pas être pris en charge sur le même champ, car une erreur de demande erronée est renvoyée du côté de SaaS.
+ L’entité Task nécessite un minimum d’un champ dans les critères de filtre. Asana présente une restriction : la pagination n’est pas identifiée si les enregistrements ne sont pas triés en fonction d’un champ temporel. Par conséquent, le champ Created\$1at est utilisé avec la pagination pour distinguer le prochain ensemble d’enregistrements. Le champ Created\$1at est marqué comme obligatoire dans le filtre, avec une valeur par défaut de 2000-01-01T00:00:00Z s’il n’est pas fourni. Pour plus d’informations sur la pagination, consultez [Tasks in a workspace](https://developers.asana.com/reference/searchtasksforworkspace).