

# Conexión a Asana
<a name="connecting-to-asana"></a>

Asana es una solución de colaboración en equipo basada en la nube que ayuda a los equipos a organizar, planificar y completar tareas y proyectos. Si es usuario de Asana, la cuenta contiene datos sobre los espacios de trabajo, los proyectos, las tareas, los equipos y mucho más. Puedes transferir datos desde Asana a ciertos servicios de AWS u otras aplicaciones compatibles.

**Topics**
+ [Compatibilidad de AWS Glue con Asana](asana-support.md)
+ [Políticas que contienen las operaciones de la API para crear y usar conexiones](asana-configuring-iam-permissions.md)
+ [Configuración de Asana](asana-configuring.md)
+ [Configuración de conexiones a Asana](asana-configuring-connections.md)
+ [Cómo leer de las entidades de Asana](asana-reading-from-entities.md)
+ [Opciones de conexión a Asana](asana-connection-options.md)
+ [Cómo crear una cuenta de Asana](asana-create-account.md)
+ [Limitaciones](asana-connector-limitations.md)

# Compatibilidad de AWS Glue con Asana
<a name="asana-support"></a>

AWS Glue es compatible con Asana de la siguiente manera:

**¿Es compatible como origen?**  
Sí. Puede usar los trabajos de ETL de AWS Glue para consultar datos de Asana.

**¿Es compatible como destino?**  
No.

**Versiones de la API de Asana compatibles**  
 1.0 

# Políticas que contienen las operaciones de la API para crear y usar conexiones
<a name="asana-configuring-iam-permissions"></a>

En el siguiente ejemplo de política se describen los permisos de AWS necesarios para crear y utilizar conexiones. Si va a crear un nuevo rol, cree una política que contenga lo siguiente: 

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

****  

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

------

Si no desea utilizar el método anterior, como alternativa, utilice las siguientes políticas de IAM administradas:
+  [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole): concede acceso a los recursos que necesitan diversos procesos de AWS Glue para ejecutarse en su nombre. Entre estos recursos se incluyen AWS Glue, Amazon S3, IAM, CloudWatch Logs y Amazon EC2. Si aplica la convención de nomenclatura en los recursos especificados en esta política, los procesos de AWS Glue tienen los permisos necesarios. Normalmente, esta política se asocia a los roles que se especifican a la hora de definir rastreadores, trabajos y puntos de conexión de desarrollo. 
+  [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess): concede acceso completo a los recursos de AWS Gluecuando una identidad a la que está vinculada la política utiliza la Consola de administración de AWS. Si sigue la convención de nomenclatura para los recursos especificados en esta política, los usuarios dispondrán de todas las funciones de la consola. Esta política se suele adjuntar a los usuarios de la consola AWS Glue. 

# Configuración de Asana
<a name="asana-configuring"></a>

Antes de poder utilizar AWS Glue para transferir desde Asana, deberá cumplir los siguientes requisitos:

## Requisitos mínimos
<a name="asana-configuring-min-requirements"></a>
+ Tener una cuenta de Asana con correo electrónico y contraseña. Para obtener más información sobre cómo crear una cuenta, consulte [Creación de una cuenta de Asana](asana-create-account.md). 
+ Debe tener una cuenta de AWS creada con el servicio de acceso a AWS Glue. 
+ Asegúrese de haber creado uno de los siguientes recursos en la cuenta de Asana: 
  + Una aplicación para desarrolladores que admite la autenticación de `OAuth 2.0`. Para obtener más instrucciones, consulte [OAuth](https://developers.asana.com/docs/oauth) en la Documentación para desarrolladores de Asana. Para otras opciones, consulte [Cómo crear una cuenta de Asana](asana-create-account.md). 
  + Un token de acceso personal. Para obtener más información, consulte el token de acceso personal [https://developers.asana.com/docs/personal-access-token](https://developers.asana.com/docs/personal-access-token) en la documentación para desarrolladores de Asana. 

Si cumple estos requisitos, estará listo para conectar AWS Glue a la cuenta de Adobe Analytics. Para conexiones típicas, no necesita hacer nada más en Adobe Analytics.

# Configuración de conexiones a Asana
<a name="asana-configuring-connections"></a>

Asana admite el tipo de concesión `AUTHORIZATION_CODE` para `OAuth2`. 

Este tipo de concesión se considera un `OAuth` “de tres vías”, ya que se basa en redirigir a los usuarios al servidor de autorización externo para autenticar al usuario. Los usuarios aún pueden optar por crear una aplicación conectada propia en Asana y proporcionar un ID y secreto de cliente propios al crear conexiones a través de la consola de AWS Glue. En este escenario, aún se abrirá Asana para iniciar sesión y autorizar a AWS Glue para que acceda a sus recursos. 

Este tipo de concesión da como resultado un token de actualización y un token de acceso. El token de acceso es de corta duración y se puede actualizar automáticamente sin la interacción del usuario mediante el token de actualización. 

Para consultar la documentación pública de Asana sobre la creación de una aplicación conectada para el flujo `AUTHORIZATION_CODE OAuth`, consulte las [API de Asana](https://developers.asana.com/docs/oauth). 

Para configurar una conexión a Asana:

1. En AWS Secrets Manager, cree un secreto con los siguientes detalles: 
   + En el caso de una aplicación conectada administrada por el cliente, el secreto debe contener el secreto del consumidor de la aplicación conectada con la clave `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`. 
   + 
**nota**  
Debe crear un secreto para la conexión en AWS Glue.

1. En AWS Glue Studio, cree una conexión en **Conexiones de datos** según los pasos que se indican a continuación: 

   1. Al seleccionar un **Tipo de conexión**, seleccione Asana.

   1. Proporcione el entorno de Asana.

   1. Seleccione el rol de IAM que AWS Glue puede asumir y que cuente con los permisos necesarios para realizar las siguientes acciones: 

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

****  

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

------

   1. Seleccione el `secretName` que desee usar para esta conexión en AWS Glue para colocar los tokens. 

   1.  Seleccione las opciones de red si quiere usar su red. 

1. Conceda el rol de IAM asociado a su permiso de trabajo de AWS Glue para leer `secretName`. 

# Cómo leer de las entidades de Asana
<a name="asana-reading-from-entities"></a>

 **Requisitos previos** 

Un objeto de Asana del que le gustaría leer. Consulte la tabla de entidades compatibles que aparece a continuación para comprobar las entidades disponibles. 

 **Entidades admitidas para el origen** 


| Entidad | Se puede filtrar | Admite límite | Admite Ordenar por | Admite Seleccionar \$1 | Admite Partición | 
| --- | --- | --- | --- | --- | --- | 
|  Espacio de trabajo  | No | Sí | No | Sí | No | 
| Tag | No | Sí | No | Sí | No | 
| Usuario | No | Sí | No | Sí | No | 
|  Portfolio  | No | Sí | No | Sí | No | 
| Equipo | No | Sí | No | Sí | No | 
| Proyecto | Sí | Sí | No | Sí | No | 
| Sección | No | Sí | No | Sí | No | 
| Tarea  | Sí | No | No | Sí | Sí | 
| Objetivo | Sí | Sí | No | Sí | No | 
|  AuditLogEvent  | Sí | Sí | No | Sí | No | 
|  Actualización de estado  | Sí | Sí | No | Sí | No | 
|  Campo personalizado  | No | Sí | No | Sí | No | 
|  Breve descripción del proyecto  | Sí | No | No | Sí | Sí | 

 **Ejemplo** 

```
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"
    }
```

 **Detalles de entidades y campos de Asana** 
+ [Espacio de trabajo](https://developers.asana.com/docs/workspaces)
+ [Tag](https://developers.asana.com/docs/tags)
+ [Usuario](https://developers.asana.com/docs/users)
+ [Portafolio](https://developers.asana.com/docs/portfolios)
+ [Equipo](https://developers.asana.com/docs/teams)
+ [Proyecto](https://developers.asana.com/docs/get-all-projects-in-a-workspace)
+ [Sección](https://developers.asana.com/docs/get-sections-in-a-project)
+ [Tarea](https://developers.asana.com/docs/search-tasks-in-a-workspace) 
+ [Objetivo](https://developers.asana.com/docs/get-goals)
+ [AuditLogEvent](https://developers.asana.com/docs/audit-log-api)
+ [Actualización de estado](https://developers.asana.com/reference/status-updates)
+ [Campo personalizado](https://developers.asana.com/reference/custom-fields)
+ [Breve descripción del proyecto](https://developers.asana.com/reference/project-briefs)

 **Consultas de partición** 

Puede proporcionar las opciones adicionales de Spark `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` y `NUM_PARTITIONS` si quiere usar la simultaneidad en Spark. Con estos parámetros, la consulta original se dividiría en un número `NUM_PARTITIONS` de subconsultas que las tareas de Spark pueden ejecutar simultáneamente. 
+ `PARTITION_FIELD`: el nombre del campo que se usará para particionar la consulta. 
+ `LOWER_BOUND`: un valor de límite inferior inclusivo del campo de partición elegido. 

  Para la fecha, aceptamos el formato de fecha de Spark que se usa en las consultas de Spark SQL. Ejemplos de valores válidos: `2024-06-07T13:30:00.134Z`. 
+ `UPPER_BOUND`: un valor límite superior exclusivo del campo de partición elegido. 
+ `NUM_PARTITIONS`: el número de particiones. 

 Los detalles de compatibilidad del campo de partición por entidad se capturaron en la siguiente tabla. 


| Nombre de la entidad | Campo de partición | Tipo de datos | 
| --- | --- | --- | 
| Tarea |  created\$1at  | DateTime | 
| Tarea |  modified\$1at  | DateTime | 

 **Ejemplo** 

```
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"
    }
```

# Opciones de conexión a Asana
<a name="asana-connection-options"></a>

Las siguientes son opciones de conexión para Asana:
+  `ENTITY_NAME`(cadena): (obligatorio) se utiliza para leer y escribir. El nombre del objeto en Asana. 
+  `API_VERSION`(cadena): (obligatorio) se utiliza para leer y escribir. Versión de la API de REST de Asana que desea usar. Por ejemplo: 1.0. 
+  `SELECTED_FIELDS`(lista<Cadena>): predeterminado: empty(SELECT \$1). Se usa para leer. Columnas que desee seleccionar para el objeto. 
+  `FILTER_PREDICATE`(cadena): predeterminado: vacío. Se usa para leer. Debe estar en el formato de Spark SQL. 
+  `QUERY`(cadena): predeterminado: vacío. Se usa para leer. Consulta completa de Spark SQL. 
+ `PARTITION_FIELD`(cadena): se usa para leer. Campo que se utilizará para particionar la consulta. 
+  `LOWER_BOUND`(cadena): se usa para leer. Un valor de límite inferior inclusivo del campo de partición elegido. 
+  `UPPER_BOUND`(cadena): se usa para leer. Un valor límite superior exclusivo del campo de partición elegido. 
+  `NUM_PARTITIONS`(entero): predeterminado: 1. Se usa para leer. Número de particiones para leer. 

# Cómo crear una cuenta de Asana
<a name="asana-create-account"></a>

1. Regístrese para obtener una [cuenta de Asana](https://asana.com/create-account) y elija **Registrarse**.

1. Tras iniciar sesión, pasará a la página [Configuración de la cuenta](https://app.asana.com/0/account_setup). Realice los siguientes pasos:
   + Revise el formulario de configuración de cuenta.
   + Complete todos los detalles relevantes para crear la cuenta de Asana.
   + Verifique la exactitud de la información.

1. Elija **Crear cuenta** o **Enviar** (el texto exacto del botón puede variar) para finalizar la configuración de la cuenta.

**Cómo crear la aplicación en Asana para `OAuth2.0`**

1. Inicie sesión en la cuenta de Asana con sus [credenciales de cliente de Asana](https://app.asana.com/-/login). 

1. Elija el icono del perfil de usuario en la esquina superior derecha y seleccione **Mi configuración** en el menú desplegable.

1. Seleccione la pestaña **Aplicaciones** y, a continuación, seleccione **Administrar aplicaciones de desarrollador**.

1. Seleccione **Crear nueva aplicación** e ingrese los detalles pertinentes. 

1. Elija **Crear aplicaciones**.

1. En la página **Mis aplicaciones**: 

   1. Seleccione **OAuth** y en la sección **Credenciales de la aplicación**, anote el ID de cliente y el secreto de cliente.

   1. En la sección **URL de redirección**, agregue las URL de redirección necesarias.
**nota**  
Introduzca el URI de redirección con el siguiente formato: `https://{aws-region-code}.console.aws.amazon.com/gluestudio/oauth`. Ejemplo: para el Este de EE. UU. (Norte de Virginia), utilice: `https://us-east-1.console.aws.amazon.com/gluestudio/oauth`

**Cómo crear la aplicación en Asana para el token de `PAT`**

1. Inicie sesión en la cuenta de Asana con sus [credenciales de cliente de Asana](https://app.asana.com/-/login). 

1. Elija el icono del perfil de usuario en la esquina superior derecha y seleccione **Configuración de mi perfil** en el menú desplegable.

1. Seleccione la pestaña **Aplicaciones** y, a continuación, **Cuentas de servicio**.

1. Seleccione **Crear nueva aplicación** e ingrese los detalles pertinentes. 

1. Elija **Agregar cuenta de servicio**.

1. La siguiente página muestra el token, cópielo y guárdelo de forma segura. 
**importante**  
Este token solo aparecerá una vez. Asegúrese de copiarlo y almacenarlo de forma segura. 

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

Las siguientes son limitaciones para el conector de Asana:
+ Las cuentas de servicio de los dominios Enterprise solo pueden acceder a los puntos de conexión de la API del registro de auditoría. Para acceder a estos puntos de conexión es necesario autenticarse con un token de acceso personal de la cuenta de servicio.
+ Solo las cuentas de usuario con el plan Premium o uno superior pueden acceder a la entidad Goal.
+ `Audit Log Event Entity`: en el conector, los campos `start_at` y `end_at` se combinan en un único campo “start\$1end\$1at” para permitir el filtrado y la transferencia incremental.
+ No es posible realizar particiones en el campo `Date`, aunque se admiten los operadores “mayor que o igual a” y “menor que o igual a”. Escenario: se creó un trabajo con `partitionField` como `due_on` (tipo de datos: fecha), `lowerBound` como `2019-09-14`, `upperBound` como `2019-09-16` y `numPartition` como `2`. La parte del filtro de la URL del punto de conexión se crea de la siguiente manera:
  + 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 Salida:
  + En partition1, obtenemos datos con due\$1date como 14/09/2019 y 15/09/2019
  + En partition2, obtenemos los mismos datos con due\$1date como 15/09/2019 (que estaba en partition1) junto con otros datos, lo que provoca la duplicación de datos.
+ El filtrado y la partición no se admiten en el mismo campo, ya que se produce un error de solicitud incorrecta en la parte de SaaS.
+ La entidad Task requiere un mínimo de un campo en los criterios de filtrado. Existe una limitación con Asana por la cual la paginación no se identifica sin ordenar los registros con base en un campo basado en el tiempo. Por lo tanto, el campo Created\$1at se utiliza junto con la paginación para distinguir el siguiente conjunto de registros. El campo Created\$1at se marca como obligatorio en el filtro, con un valor predeterminado de 2000-01-01T00:00:00Z si no se proporciona. [ara obtener más información sobre la paginación, consulte Tareas en un espacio de trabajo](https://developers.asana.com/reference/searchtasksforworkspace).