

# Tutorial: configurar um PyCharm Professional com um endpoint de desenvolvimento
<a name="dev-endpoint-tutorial-pycharm"></a>

Este tutorial mostra como conectar o IDE Python [PyCharm Professional](https://www.jetbrains.com/pycharm/) sendo executado em sua máquina local a um endpoint de desenvolvimento para que você possa executar, depurar e testar de forma interativa scripts de ETL (extração, transformação e carregamento) do AWS Glue antes de implantá-los. As instruções e capturas de tela no tutorial são baseadas no PyCharm Professional versão 2019.3.

Para se conectar a um endpoint de desenvolvimento de forma interativa, você precisa ter PyCharm Professional instalado. Você não pode fazer isso usando a edição gratuita.

**nota**  
O tutorial usa o Amazon S3 como a fonte dos dados. Se você quiser usar uma fonte de dados JDBC, execute o endpoint de desenvolvimento em uma nuvem privada virtual (VPC). Para se conectar com SSH a um endpoint de desenvolvimento em uma VPC, você deve criar um túnel SSH. Este tutorial não inclui instruções para criar um túnel SSH. Para obter informações sobre como usar o SSH para se conectar a um endpoint de desenvolvimento em uma VPC, consulte [Securely Connect to Linux Instances Running in a Private Amazon VPC](https://aws.amazon.com/blogs/security/securely-connect-to-linux-instances-running-in-a-private-amazon-vpc/) no blog de segurança da AWS.

**Topics**
+ [Conectar o PyCharm Professional a um endpoint de desenvolvimento](#dev-endpoint-tutorial-pycharm-connect)
+ [Implantar o script no endpoint de desenvolvimento](#dev-endpoint-tutorial-pycharm-deploy)
+ [Configurar um intérprete remoto](#dev-endpoint-tutorial-pycharm-interpreter)
+ [Executar seu script no endpoint de desenvolvimento](#dev-endpoint-tutorial-pycharm-debug-run)

## Conectar o PyCharm Professional a um endpoint de desenvolvimento
<a name="dev-endpoint-tutorial-pycharm-connect"></a>

1. Crie um novo projeto Python puro no PyCharm, chamado `legislators`.

1. Crie um arquivo chamado `get_person_schema.py` no projeto com o seguinte conteúdo:

   ```
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   
   
   def main():
       # Create a Glue context
       glueContext = GlueContext(SparkContext.getOrCreate())
   
       # Create a DynamicFrame using the 'persons_json' table
       persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
   
       # Print out information about this data
       print("Count:  ", persons_DyF.count())
       persons_DyF.printSchema()
   
   
   if __name__ == "__main__":
       main()
   ```

1. Execute um destes procedimentos:
   + Para o AWS Glue versão 0.9, faça download do arquivo da biblioteca Python do AWS Glue, `PyGlue.zip`, em `https://s3.amazonaws.com/aws-glue-jes-prod-us-east-1-assets/etl/python/PyGlue.zip` para um local conveniente na sua máquina local.
   + Para o AWS Glue versão 1.0 ou versões posteriores, faça download do arquivo da biblioteca Python do AWS Glue, `PyGlue.zip`, em `https://s3.amazonaws.com/aws-glue-jes-prod-us-east-1-assets/etl-1.0/python/PyGlue.zip` para um local conveniente na sua máquina local.

1. Adicione o `PyGlue.zip` como raiz de conteúdo do seu projeto no PyCharm:
   + No PyCharm, escolha **File**, **Settings** para abrir a caixa de diálogo **Settings**. Você também pode pressionar . `Ctrl+Alt+S`.)
   + Expanda o projeto `legislators` e escolha **Project Structure**. Em seguida, escolha **\$1 Add Content Root** no painel direito.
   + Navegue até o local em que você salvou `PyGlue.zip`, selecione-o, e escolha **Apply**.

    A tela **Settings** deve ser semelhante à seguinte:  
![\[A tela Settings do PyCharm com o PyGlue.zip adicionado como uma raiz de conteúdo.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_AddContentRoot.png)

   Mantenha a caixa de diálogo **Settings** aberta depois de selecionar **Apply**.

1. Configure as opções de implantação para fazer upload do script local no seu endpoint de desenvolvimento usando SFTP (esse recurso está disponível somente no PyCharm Professional):
   + Na caixa de diálogo **Settings**, expanda a seção **Build, Execution, Deployment**. Escolha a subseção **Deployment**.
   + Escolha o ícone **\$1** na parte superior do painel central para adicionar um novo servidor. Defina o **Type (Tipo)** como `SFTP` e dê um nome a ele.
   + Defina o **SFTP host (Host SFTP)** como **Public address (Endereço público)** do endpoint de desenvolvimento, conforme listado na página de detalhes. Escolha o nome do endpoint de desenvolvimento no console do AWS Glue para exibir a página de detalhes. Para um endpoint de desenvolvimento em execução em uma VPC, defina o **SFTP host (Host SFTP)** como o endereço do host e a porta local do túnel SSH como o endpoint de desenvolvimento.
   + Defina **User name** como `glue`.
   + Defina **Auth type** como **Key pair (OpenSSH or Putty)**. Defina **Private key file** (Arquivo de chave privada) navegando até o local em que o arquivo de chave privada do endpoint de desenvolvimento está localizado. Observe que PyCharm só é compatível com tipos de chave DSA, RSA e ECDSA OpenSSH, e não aceita chaves no formato privado de Putty. Você pode usar uma versão atualizada de `ssh-keygen` para gerar um tipo de par de chaves aceito pelo PyCharm, usando uma sintaxe como a seguinte:

     ```
     ssh-keygen -t rsa -f <key_file_name> -C "<your_email_address>"
     ```
   + Escolha **Test connection (Conexão de teste)** e permita que a conexão seja testada. Se a conexão for concluída com sucesso, escolha **Apply**.

    A tela **Settings** agora deve ser semelhante à seguinte:  
![\[A tela Settings do PyCharm com servidor SFTP definido.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_SFTP.png)

   Novamente, mantenha a caixa de diálogo **Settings** aberta depois de selecionar **Apply**.

1. Mapeie o diretório local até um diretório remoto para implantação:
   + No painel direito da página **Deployment**, escolha a guia central na parte superior, nomeada **Mappings**.
   + Na coluna **Deployment Path**, insira um caminho abaixo de `/home/glue/scripts/` para implantação do caminho do seu projeto. Por exemplo: `/home/glue/scripts/legislators`.
   + Selecione **Aplicar**.

    A tela **Settings** agora deve ser semelhante à seguinte:  
![\[A tela Settings do PyCharm depois do mapeamento da implantação.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_Mapping.png)

   Escolha **OK** para fechar a caixa de diálogo **Settings (Configurações)**.

## Implantar o script no endpoint de desenvolvimento
<a name="dev-endpoint-tutorial-pycharm-deploy"></a>

1. Escolha **Tools (Ferramentas)**, **Deployment (Implantação)** e o nome para o qual você configurou seu endpoint de desenvolvimento, conforme mostrado na seguinte imagem:  
![\[O item de menu para a implantação do seu script.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_Deploy.png)

   Depois que seu script for implantado, a parte inferior da tela exibirá o seguinte:  
![\[Parte inferior da tela PyCharm depois de uma implantação bem-sucedida.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_Deployed.png)

1. Na barra de menus, escolha **Tools (Ferramentas)**, **Deployment (Implantação)**, **Automatic Upload (always) (Upload automático (sempre))**. Verifique se uma marca de seleção aparece ao lado de **Automatic Upload (always) (Upload automático (sempre))**.

   Quando essa opção está habilitada, o PyCharm carrega automaticamente os arquivos alterados no endpoint de desenvolvimento.

## Configurar um intérprete remoto
<a name="dev-endpoint-tutorial-pycharm-interpreter"></a>

Configure o PyCharm para usar o intérprete Python no endpoint de desenvolvimento.

1. No menu **File (Arquivo)**, escolha **Settings (Configurações)**.

1. Expanda os **legislators (legisladores)** do projeto e escolha **Project Interpreter (Intérprete do projeto)**.

1. Escolha o ícone de engrenagem ao lado da lista **Project Interpreter (Intérprete do projeto)** e escolha **Add (Adicionar)**.

1. Na caixa de diálogo **Add Python Interpreter (Adicionar intérprete Python)**, no painel esquerdo, escolha **SSH Interpreter (Intérprete SSH)**.

1. Escolha **Existing server configuration (Configuração de servidor existente)** e, na lista **Deployment configuration (Configuração de implantação)**, escolha sua configuração.

   Sua tela deve ser semelhante à seguinte imagem.  
![\[No painel esquerdo, SSH Interpreter (Intérprete SSH) é selecionado e, no painel direito, o botão de opção Existing server configuration (Configuração do servidor existente) é selecionado. O campo Deployment configuration (Configuração de implantação) contém o nome da configuração e a mensagem "Remote SDK is saved in IDE settings, so it needs the deployment server to be saved there too. Which do you prefer?" (O SDK remoto é salvo nas configurações do IDE e, portanto, ele precisa que o servidor de implantação também seja salvo lá. O que você prefere?) Veja a seguir as opções abaixo dessa mensagem: "Create copy of this deployment server in IDE settings" (Criar cópia deste servidor de implantação nas configurações do IDE) e "Move this server to IDE settings" (Mover este servidor para configurações do IDE).\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/PyCharm_Interpreter1.png)

1. Escolha **Move this server to IDE settings (Mover este servidor para configurações do IDE)** e **Next (Avançar)**.

1. No campo **Interpreter (Intérprete)**, altere o caminho para ` /usr/bin/gluepython` se você estiver usando Python 2 ou para `/usr/bin/gluepython3` se estiver usando Python 3. Em seguida, escolha **Finish (Concluir)**.

## Executar seu script no endpoint de desenvolvimento
<a name="dev-endpoint-tutorial-pycharm-debug-run"></a>

Para executar o script:
+ No painel esquerdo, clique com o botão direito do mouse no nome do arquivo e escolha **Run '*<filename>*' (Executar <nome do arquivo>)**.

  Após uma série de mensagens, a saída final deve mostrar a contagem e o esquema.

  ```
  Count:   1961
  root
  |-- family_name: string
  |-- name: string
  |-- links: array
  |    |-- element: struct
  |    |    |-- note: string
  |    |    |-- url: string
  |-- gender: string
  |-- image: string
  |-- identifiers: array
  |    |-- element: struct
  |    |    |-- scheme: string
  |    |    |-- identifier: string
  |-- other_names: array
  |    |-- element: struct
  |    |    |-- lang: string
  |    |    |-- note: string
  |    |    |-- name: string
  |-- sort_name: string
  |-- images: array
  |    |-- element: struct
  |    |    |-- url: string
  |-- given_name: string
  |-- birth_date: string
  |-- id: string
  |-- contact_details: array
  |    |-- element: struct
  |    |    |-- type: string
  |    |    |-- value: string
  |-- death_date: string
  
  
  Process finished with exit code 0
  ```

Agora você está pronto para depurar seu script remotamente no endpoint de desenvolvimento.