

# Conexão com o Asana
<a name="connecting-to-asana"></a>

O Asana é uma solução de colaboração em equipe baseada na nuvem que ajuda as equipes a organizar, planejar e concluir tarefas e projetos. Se você é usuário do Asana, sua conta contém dados sobre seus espaços de trabalho, projetos, tarefas, equipes e muito mais. É possível transferir dados do Asana para determinados serviços da AWS ou outras aplicações com suporte.

**Topics**
+ [Suporte do AWS Glue para Asana](asana-support.md)
+ [Políticas que contêm as operações de API para criar e usar conexões](asana-configuring-iam-permissions.md)
+ [Configuração do Asana](asana-configuring.md)
+ [Configuração de conexões do Asana](asana-configuring-connections.md)
+ [Leitura de entidades do Asana](asana-reading-from-entities.md)
+ [Opções de conexão do Asana](asana-connection-options.md)
+ [Criação de uma conta do Asana](asana-create-account.md)
+ [Limitações](asana-connector-limitations.md)

# Suporte do AWS Glue para Asana
<a name="asana-support"></a>

O AWS Glue oferece suporte ao Asana da seguinte forma:

**Compatível como fonte?**  
Sim. É possível usar trabalhos de ETL do AWS Glue para consultar dados do Asana.

**Compatível como destino?**  
Nº

**Versões da API do Asana com suporte**  
 1,0 

# Políticas que contêm as operações de API para criar e usar conexões
<a name="asana-configuring-iam-permissions"></a>

O exemplo de política a seguir descreve as permissões da AWS necessárias para criar e usar conexões. Se você estiver criando um novo perfil, crie uma política que contenha o seguinte: 

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

****  

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

------

Se não quiser usar o método anterior, uma alternativa será usar as seguintes políticas do IAM gerenciadas:
+  [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole): concede acesso a recursos que vários processos do AWS Glue exigem para serem executados em seu nome. Esses recursos incluem o AWS Glue, Amazon S3, IAM, CloudWatch Logs e Amazon EC2. Se você seguir a convenção de nomenclatura para os recursos especificados nesta política, os processos do AWS Glue terão as permissões necessárias. Esta política geralmente é anexada a funções especificadas durante a definição de crawlers, trabalhos e endpoints de desenvolvimento. 
+  [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess): concede acesso total aos recursos do AWS Glue quando uma identidade à qual a política está anexada usa o Console de Gerenciamento da AWS. Se você seguir a convenção de nomenclatura para os recursos especificados nesta política, os usuários poderão acessar todos os recursos do console. Esta política geralmente é anexada aos usuários do console do AWS Glue. 

# Configuração do Asana
<a name="asana-configuring"></a>

Antes de poder usar o AWS Glue para transferir dados do Asana, os seguintes requisitos deverão ser atendidos:

## Requisitos mínimos
<a name="asana-configuring-min-requirements"></a>
+ Você tem uma conta Asana com e-mail e senha. Para obter mais informações sobre como criar uma conta, consulte [Criação de uma conta do Asana](asana-create-account.md). 
+ Você deve ter uma conta da AWS criada com acesso de serviço ao AWS Glue. 
+ Certifique-se de ter criado um dos recursos a seguir na sua conta do Asana: 
  + Uma aplicação para desenvolvedores que ofereça suporte à autenticação `OAuth 2.0`. Para obter mais instruções, consulte [OAuth](https://developers.asana.com/docs/oauth) na documentação dos desenvolvedores do Asana. Como alternativa, consulte [Criação de uma conta do Asana](asana-create-account.md). 
  + Um token de acesso pessoal Para obter mais informações, consulte o Token de acesso pessoal[https://developers.asana.com/docs/personal-access-token](https://developers.asana.com/docs/personal-access-token) na documentação dos desenvolvedores do Asana. 

Se você atender a esses requisitos, poderá conectar o AWS Glue à sua conta do Adobe Analytics. Para conexões típicas, você não precisa fazer mais nada no Adobe Analytics.

# Configuração de conexões do Asana
<a name="asana-configuring-connections"></a>

O Asana oferece suporte ao tipo de concessão `AUTHORIZATION_CODE` para `OAuth2`. 

Esse tipo de concessão é considerado um `OAuth` de “três pernas”, pois conta com o redirecionamento dos usuários para o servidor de autorização de terceiros para autenticar o usuário. Os usuários podem optar por criar sua própria aplicação conectada no Asana e fornecer seus próprios ID e segredo do cliente ao criar conexões por meio do console do AWS Glue. Nesse cenário, eles ainda serão redirecionados para o Asana para fazer login e autorizar o acesso do AWS Glue aos recursos. 

Esse tipo de concessão resulta em um token de atualização e um token de acesso. O token de acesso tem vida curta e pode ser atualizado automaticamente sem a interação do usuário usando o token de atualização. 

Para obter a documentação pública da Asana sobre como criar uma aplicação conectada para o fluxo `AUTHORIZATION_CODE OAuth`, consulte [APIs do Asana](https://developers.asana.com/docs/oauth). 

Para configurar uma conexão do Asana:

1. No AWS Secrets Manager, crie um segredo com os seguintes detalhes: 
   + Para uma aplicação conectada gerenciada pelo cliente, o segredo deve conter a aplicação conectada Segredo do consumidor com a chave `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`. 
   + 
**nota**  
É necessário criar um segredo para a conexão no AWS Glue.

1. Em AWS Glue Studio, crie uma conexão em **Conexões de dados** seguindo estas etapas: 

   1. Ao selecionar um **Tipo de conexão**, escolha Asana.

   1. Forneça o ambiente do Asana.

   1. Selecione o perfil do IAM que o AWS Glue pode assumir e tem permissões para as seguintes ações: 

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

****  

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

------

   1. Selecione o `secretName` que você deseja usar para essa conexão no AWS Glue para inserir os tokens. 

   1.  Selecione as opções de rede se quiser usar sua rede. 

1. Conceda permissão ao perfil do IAM associado ao seu trabalho do AWS Glue para ler `secretName`. 

# Leitura de entidades do Asana
<a name="asana-reading-from-entities"></a>

 **Pré-requisitos** 

Um objeto do Asana do qual você deseja ler. Consulte a tabela de entidades compatíveis abaixo para verificar as entidades disponíveis. 

 **Entidades com suporte para a fonte** 


| Entidade | Pode ser filtrada | Oferece suporte a limite | Oferece suporte a Ordenar por | Oferece suporte a Selecionar \$1 | Oferece suporte a particionamento | 
| --- | --- | --- | --- | --- | --- | 
|  Espaço de trabalho  | Não | Sim | Não | Sim | Não | 
| Tag | Não | Sim | Não | Sim | Não | 
| Usuário | Não | Sim | Não | Sim | Não | 
|  Portfólio  | Não | Sim | Não | Sim | Não | 
| Team | Não | Sim | Não | Sim | Não | 
| Projeto | Sim | Sim | Não | Sim | Não | 
| Seção | Não | Sim | Não | Sim | Não | 
| Tarefa  | Sim | Não | Não | Sim | Sim | 
| Objetivo | Sim | Sim | Não | Sim | Não | 
|  AuditLogEvent  | Sim | Sim | Não | Sim | Não | 
|  Atualização de status  | Sim | Sim | Não | Sim | Não | 
|  Campo personalizado  | Não | Sim | Não | Sim | Não | 
|  Resumo do projeto  | Sim | Não | Não | Sim | Sim | 

 **Exemplo** 

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

 **Detalhes de entidade e campo do Asana** 
+ [Espaço de trabalho](https://developers.asana.com/docs/workspaces)
+ [Etiqueta](https://developers.asana.com/docs/tags)
+ [Usuário](https://developers.asana.com/docs/users)
+ [Portfólio](https://developers.asana.com/docs/portfolios)
+ [Equipe](https://developers.asana.com/docs/teams)
+ [Projeto](https://developers.asana.com/docs/get-all-projects-in-a-workspace)
+ [Seção](https://developers.asana.com/docs/get-sections-in-a-project)
+ [Tarefa](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)
+ [Atualização de status](https://developers.asana.com/reference/status-updates)
+ [Campo personalizado](https://developers.asana.com/reference/custom-fields)
+ [Resumo do projeto](https://developers.asana.com/reference/project-briefs)

 **Particionamento de consultas** 

Podem ser fornecidas as opções adicionais do Spark `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` e `NUM_PARTITIONS` se você quiser utilizar a simultaneidade no Spark. Com esses parâmetros, a consulta original seria dividida em `NUM_PARTITIONS` subconsultas, que poderiam ser executadas pelas tarefas do Spark simultaneamente. 
+ `PARTITION_FIELD`: o nome do campo a ser usado para particionar a consulta. 
+ `LOWER_BOUND`: um valor limite inferior inclusivo do campo de partição escolhido. 

  Na data, aceitamos o formato de data do Spark usado em consultas SQL do Spark. Exemplo de valores válidos: `2024-06-07T13:30:00.134Z`. 
+ `UPPER_BOUND`: um valor limite superior exclusivo do campo de partição escolhido. 
+ `NUM_PARTITIONS`: número de partições. 

 Os detalhes do suporte do campo de particionamento relativo às entidades são capturados na tabela a seguir. 


| Entity Name | Campo de particionamento | Tipo de dado | 
| --- | --- | --- | 
| Tarefa |  created\$1at  | DateTime | 
| Tarefa |  modified\$1at  | DateTime | 

 **Exemplo** 

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

# Opções de conexão do Asana
<a name="asana-connection-options"></a>

Estas são as opções de conexão do Asana:
+  `ENTITY_NAME`(string): (obrigatório) usado para leitura/gravação. O nome do seu objeto no Asana. 
+  `API_VERSION`(string): (obrigatório) usado para leitura/gravação. Versão da API Rest do Asana que você deseja usar. Por exemplo: 1.0. 
+  `SELECTED_FIELDS`(lista<string>): padrão: vazio (SELECT \$1). Usado para leitura. Colunas que deseja selecionar para o objeto. 
+  `FILTER_PREDICATE`(string): padrão: vazio. Usado para leitura. Deve estar no formato Spark SQL. 
+  `QUERY`(string): padrão: vazio. Usado para leitura. Consulta completa do Spark SQL. 
+ `PARTITION_FIELD`(string): usado para leitura. Campo a ser usado para particionar a consulta. 
+  `LOWER_BOUND`(string): usado para leitura. Um valor limite inferior inclusivo do campo de partição escolhido. 
+  `UPPER_BOUND`(string): usado para leitura. Um valor limite superior exclusivo do campo de partição escolhido. 
+  `NUM_PARTITIONS`(Inteiro): padrão: 1. Usado para leitura. Número de partições para leitura. 

# Criação de uma conta do Asana
<a name="asana-create-account"></a>

1. Cadastre-se para obter uma [conta do Asana](https://asana.com/create-account) e escolha **Inscrever-se**.

1. Depois de fazer login, você será redirecionado para a página [Configuração da conta](https://app.asana.com/0/account_setup). Execute as etapas a seguir:
   + Revise o formulário de configuração da conta.
   + Preencha todos os detalhes relevantes para criar sua conta do Asana.
   + Verifique novamente as informações para garantir a precisão.

1. Escolha **Criar conta** ou **Enviar** (o texto exato do botão pode variar) para finalizar a configuração da sua conta.

**Criação de uma aplicação no Asana para `OAuth2.0`**

1. Faça login na conta do Asana usando suas [Credenciais de cliente do Asana](https://app.asana.com/-/login). 

1. Escolha o ícone do seu perfil de usuário no canto superior direito e selecione **Minhas configurações** no menu suspenso.

1. Selecione a guia **Aplicações** e, em seguida, selecione **Gerenciar aplicações do desenvolvedor**.

1. Selecione **Criar nova aplicação** e insira os detalhes relevantes. 

1. Escolha **Criar aplicações**.

1. Na página **Minhas aplicações**: 

   1. Selecione **OAuth** e, na seção **Credenciais da aplicação**, anote seu ID do cliente e o segredo do cliente.

   1. Na seção **URLs de redirecionamento**, adicione os URLs de redirecionamento necessárias.
**nota**  
Insira o URI de redirecionamento usando este formato: `https://{aws-region-code}.console.aws.amazon.com/gluestudio/oauth`. Exemplo: para a região Leste dos EUA (Norte da Virgínia), use `https://us-east-1.console.aws.amazon.com/gluestudio/oauth`

**Criação da aplicação no Asana para o token `PAT`**

1. Faça login na conta do Asana usando suas [Credenciais de cliente do Asana](https://app.asana.com/-/login). 

1. Clique no ícone do seu perfil de usuário no canto superior direito e selecione **Minhas configurações de perfil** no menu suspenso.

1. Selecione a guia **Aplicações** e, em seguida, selecione **Contas de serviço**.

1. Selecione **Criar nova aplicação** e insira os detalhes relevantes. 

1. Escolha **Adicionar conta de serviço**.

1. A próxima página exibe seu token. Copie-o e armazene-o com segurança. 
**Importante**  
Esse token só será exibido uma vez. Certifique-se de copiá-lo e armazená-lo com segurança. 

# Limitações
<a name="asana-connector-limitations"></a>

Estas são as limitações do conector do Asana:
+ As contas de serviço em domínios corporativos só podem acessar endpoints da API de log de auditoria. A autenticação com o token de acesso pessoal de uma conta de serviço é necessária para acessar esses endpoints.
+ A entidade Goal só pode ser acessada para contas de usuário com plano Premium ou superior.
+ `Audit Log Event Entity`: no conector, os campos `start_at` e `end_at` são combinados em um único campo "start\$1end\$1at" para oferecer suporte a filtragem e transferência incremental.
+ Não pode haver suporte ao particionamento para o campo `Date`, embora ele ofereça suporte a operadores maior ou igual a e menor ou igual a. Cenário: foi criado um trabalho com `partitionField` como `due_on` (tipo de dados: data), `lowerBound` como `2019-09-14`, `upperBound` como `2019-09-16` e `numPartition` como `2`. A parte do filtro do URL do endpoint é criada da seguinte forma:
  + partição1: due\$1on.before=2019-09-14&due\$1on.after=2019-09-14
  + partição2: due\$1on.before=2019-09-15&due\$1on.after=2019-09-15 Output:
  + Na partição1, obtemos dados com due\$1date como 2019-09-14 e 2019-09-15
  + Na partição2, obtemos os mesmos dados com due\$1date de 2019-09-15 (que estava na partição1) junto com outros dados, causando duplicação de dados.
+ Não pode haver suporte para a filtragem e o particionamento no mesmo campo, pois um erro de solicitação inválida é gerado pela extremidade do SaaS.
+ A entidade Tarefa exige no mínimo 1 campo nos critérios de filtro. Há uma limitação no Asana em que a paginação não é identificada sem a classificação dos registros com base em um campo baseado em tempo. Portanto, o campo Created\$1at é usado junto com a paginação para distinguir o próximo conjunto de registros. O campo Created\$1at é marcado como obrigatório no filtro, com um valor padrão de 2000-01-01T00:00:00Z se não for fornecido. Para obter mais informações sobre paginação, consulte [Tarefas em um espaço de trabalho](https://developers.asana.com/reference/searchtasksforworkspace).