O blog da AWS

Melhorar experiência de Desenvolvimento na AWS usando MS VS Code IDE

Por Diego Castro, Arquiteto de Infraestrutura na AWS e
Guilherme Greco, Arquiteto de Soluções na AWS

 

Este guia demonstra um padrão de arquitetura para permitir que os desenvolvedores acessem os recursos da AWS usando o Microsoft VS Code de maneira segura e eficiente e destina-se a arquitetos e desenvolvedores de soluções.

Este padrão se aplica a empresas que possuem uma ou mais das características abaixo:

  • Blocos de IP privados esgotados, levando a VPCs com intervalos de IP conflitantes (IP overlapping) com outras redes locais.
  • Proibido manter cópia local de código-fonte na estação de trabalho local.
  • MS VS Code é o IDE (Integrated Development Environment) de escolha para o desenvolvimento de aplicativos nativos na nuvem AWS.

Como resultado dessas características, os desenvolvedores não têm acesso direto aos recursos VPC, tornando o desenvolvimento um processo lento.

Neste blog post abordaremos o uso do AWS Systems Manager (SSM) junto com a extensão “Remote Development” do VS Code para endereçar este caso de uso e mostraremos um template CloudFormation para automatizar o processo.

 

Pré-Requisitos

Arquitetura Proposta

Usando o AWS Systems Manager (SSM) em conjunto com a extensão “Remote Development” para o MS VS Code é possível criar um túnel SSH para uma instância EC2 remota, sem a necessidade de exposição a Grupos de Segurança em sub-redes públicas.  Isso permite que os desenvolvedores estabeleçam conexões para uma instância VS Code contida em sua VPC e aos recursos da AWS para o desenvolvimento de aplicativos na nuvem AWS.

Esse tipo de acesso fornece ao desenvolvedor experiência semelhante ao desenvolvimento conectado em seu VPC de desenvolvimento: permite acesso e resposta de desenvolvimento usando recursos da AWS e com as mesmas ferramentas de desenvolvimento com as quais estão familiarizados.

Enquanto resolve os tempos de resposta de desenvolvimento, permite uma gestão centralizada usando instância EC2 provisionada por meio de um template CloudFormation.

 

  1. A partir de sua estação de trabalho, o desenvolvedor requisita um redirecionamento de porta para o AWS Systems Manager usando AWS CLI.
  2. Usando o SSM Endpoint IP recebido, o SSM Plugin CLI interage com o AWS Systems Manager onde o redirecionamento de porta é executado.
  3. Usando a extensão de desenvolvimento remoto do MS VS Code, o desenvolvedor usará a instâncias EC2 implementada como ambiente de desenvolvimento remoto, permitindo o acesso aos recursos VPC com experiência semelhante como se conectado localmente em sua VPC.

Microsoft VS Code – Remote Development

O Visual Studio Code Remote Development permite usar uma máquina remota como um ambiente de desenvolvimento completo. Você pode:

  • Acessar recursos não disponíveis localmente.
  • Manter governança corporativa sobre o ambiente de desenvolvimento.
  • Usar ferramentas não disponíveis em sua máquina local.
  • Acessar ambiente de desenvolvimento a partir de varios locais remotos.
  • Padronizar o ambiente de desenvolvimento.

VS Code Remote Development HomePage: https://code.visualstudio.com/docs/remote/remote-overview

Passo 1 – Implemente o CloudFormation stack

O CloudFormation cria um LaunchTemplate e uma instância EC2 e gera output para que seja feito o redirecionamento de porta via AWS Systems Manager. Características da instância EC2:

  • Última versão de Amazon Linux 2 (AMI lida via Parameter Store)
  • Tipos de instâncias propostas t3.medium, t3.large ou m5.large.
    • Default “t3.medium” e customizável via parâmetros do CloudFormation)
  • Volumes EBS GP3 dedicados e criptografado para projetos VS Code.
    • IOPS: 2000 IOPs (customizável via parâmetros do CloudFormation).
    • Throuhput: 125 Mib/s (customizável via parâmetros do CloudFormation).
  • Volume de Sistema Operacional criptografado.
  • Instalação de Python 3.8 e .NetCore 5.

A seção de parâmetros requer:

  • KeyPair EC2 existente para ser usado pelo plugin Remote-SSH do VS Code.
  • Se você não tiver um KeyPair, crie um através da console de gerenciamento e baixe o arquivo PEM para um local seguro.
  • SubnetID de uma sub-rede privada.
  • Grupo de segurança existente com acesso de saída HTTPS para o serviço AWS Systems Manager ou VPC Endpoints configurados.
    • Caso não tenha, pode criar um Security Group usando a documentação de referência.
  • EC2 instance role que permite que a instância seja gerenciada pelo AWS Systems Manager.
    • Políticas necessárias: “AmazonSSMManagedInstanceCore”, “S3 Access https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-minimum-s3-permissions.html” e “CloudWatchAgentServerPolicy (opcional)”
  • O template CloudFormation fará o lookup automaticamente via AWS Systems Manager Parameter Store para o ID da AMI mais recente de Amazon Linux v2.
1.   AWSTemplateFormatVersion: 2010-09-09
2.   Description: CloudFormation template to automate EC2 creation for a remote MS VSCode instance
3.                
4.   Parameters:
5.     
6.     MyKeyPair: 
7.       Description: Amazon EC2 Key Pair
8.       Type: AWS::EC2::KeyPair::KeyName
9.       Default: ""
10.  
11.   PrivateSubnetId:
12.     Description: Private Subnet Id to create the instance 
13.     Type: AWS::EC2::Subnet::Id
14.     Default: ""
15.  
16.   MySecGroup:
17.     Description: SecGroup for the Server
18.     Type: String
19.     Default: ""
20.  
21.   MyIamInstanceProfile:
22.     Description: IAM-EC2-Instance-Profile
23.     Type: String
24.     Default: ""
25.  
26.   LatestAmiId:
27.     Type: "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>"
28.     Default: "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
29.  
30.   InstanceTypeParameter:
31.     Type: String
32.     Default: t3.medium
33.     AllowedValues:
34.       - t2.micro
35.       - t3.medium
36.       - t3.large
37.       - m5.large
38.     Description: Enter t2.micro, t3.medium, t3.large or m5.large. Default is t3.medium.
39.   
40.   GP3Iops:
41.     Type: String
42.     Default: 2000
43.     Description: "Enter IOPs for the GP3 volumes in the range: 3,000-16,000 IOPS."
44.  
45.   GP3Throuhput:
46.     Type: String
47.     Default: 125
48.     Description: "Enter throuhput for the GP3 volumes: 125 to 1,000 MiB/s."
49.  
50.  
51. Resources:
52.  
53.   VSCodeLaunch:
54.     Type: AWS::EC2::LaunchTemplate
55.     Properties:
56.       LaunchTemplateData:
57.         BlockDeviceMappings: 
58.         - Ebs:
59.             VolumeSize: 100
60.             VolumeType: gp3
61.             Iops: !Ref GP3Iops
62.             Throughput: !Ref GP3Throuhput
63.             DeleteOnTermination: false
64.             Encrypted: true
65.           DeviceName: /dev/xvdcz
66.         - Ebs:
67.             VolumeSize: 30
68.             VolumeType: gp3
69.             Iops: !Ref GP3Iops
70.             Throughput: !Ref GP3Throuhput
71.             DeleteOnTermination: false
72.             Encrypted: true
73.           DeviceName: /dev/xvda
74.         Monitoring: 
75.           Enabled: true
76.         ImageId: !Ref LatestAmiId
77.         InstanceType: !Ref InstanceTypeParameter
78.         KeyName: !Ref MyKeyPair 
79.         TagSpecifications:
80.         - ResourceType: instance
81.           Tags:
82.           - Key: Name
83.             Value: "VS Code"
84.  
85.   VSCodeEC2:
86.     Type: AWS::EC2::Instance
87.     Properties: 
88.       LaunchTemplate:
89.         LaunchTemplateId: !Ref VSCodeLaunch
90.         Version: !GetAtt VSCodeLaunch.LatestVersionNumber  
91.       SubnetId: !Ref PrivateSubnetId
92.       SecurityGroupIds:
93.         - !Ref MySecGroup
94.       IamInstanceProfile: !Ref MyIamInstanceProfile
95.       UserData:
96.         Fn::Base64: |
97.           #!/bin/bash
98.           pvcreate /dev/xvdcz
99.           vgcreate vgvscode /dev/xvdcz
100.            lvcreate -l 100%FREE -n lvvscode vgvscode
101.            mkfs.ext4 /dev/vgvscode/lvvscode
102.            sudo -u ec2-user mkdir -p /home/ec2-user/vscode
103.            echo "/dev/mapper/vgvscode-lvvscode /home/ec2-user/vscode ext4 defaults 0 2" >> /etc/fstab
104.            mount -a
105.            chown ec2-user:ec2-user /home/ec2-user/vscode
106.            #Basic packages for OS  and convenience
107.            yum update -y
108.            yum groupinstall 'Development Tools' -y
109.            rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm
110.            yum install amazon-linux-extras python38 wget unzip git bash-completion procps \
111.                python38-devel java-11-amazon-corretto dotnet-sdk-5.0 -y
112.            amazon-linux-extras enable python3.8
113.            python3.8 -m pip install --upgrade pip
114.            python3.8 -m pip install python-dev-tools
115.            printf '\nPATH=$PATH:"/usr/local/bin/"\nexport PATH\n' >> ~/.bashrc
116.            printf '\nPATH=$PATH:"/usr/local/bin/"\nexport PATH\n' >> ~/home/ec2-user/.bashrc
117.            echo "End of UserData"
118.  Outputs:
119.    VSCodeEC2ID:
120.      Description: EC2 ID
121.      Value: !Ref VSCodeEC2
122.    SSMPortFWCommand:
123.      Description: SSM PortFW Cmd
124.      Value: !Join
125.              - ''
126.              - - 'aws ssm start-session --target '
127.                - !Ref VSCodeEC2
128.                - ' --document-name AWS-StartPortForwardingSession --parameters'
129.                - ' localPortNumber=2222,portNumber=22'
130.                - ' --profile name-of-profile'

Passo 2 – Usando AWS CLI realize autenticação em sua conta

Caso necessite de assistência para realizar autenticação via AWS CLI, por favor verifique instruções em:  https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html

Passo 3 – Faça o redirecionamento de porta usando o SSM Plugin para AWS CLI

Acesse a console do CloudFormation e lá encontre o comando para realizar o redirecionamento de porta. O comando é uma saída gerada pelo CloudFormation stack com o nome de chave “SSMPortFWCommand”:

 

 

Altere “profile-name” com o nome do seu profile nomeado ou remova o parâmetro caso esteja usando um profile default via AWS CLI.

A porta local “tcp 2222” será redirecionada para a porta “tcp 22” na instância EC2 criada na AWS.

Passo 4 – Instale e configure o plugin “Remote-SSH” em seu VS Code

Esta é uma atividade que precisa ser feita apenas uma vez: Instale a extensão “Remote-SSH” em seu VS Code local.

Crie um arquivo de configuração SSH usando a paleta de comandos do VS Code “Remote-SSH: Open SSH Configuration File”.

Garanta que a porta local é a mesma usada para o redirecionamento, no caso 2222, e que a chave privada SSH usada no CloudFormation esteja no caminho correto.

1.   # Read more about SSH config files: https://linux.die.net/man/5/ssh_config
2.   Host vscode_remote
3.       HostName localhost
4.       User ec2-user
5.       Port 2222
6.       IdentityFile ~/Path_to.pem

Via paleta de commandos do VS Code selecione “Remote-SSH: Connect to Host” e selecione o host configurado anteriormente:

 

 

Aceite “Linux” como ambiente de desenvolvimento remoto e aceite a inclusão da instância EC2 no arquivo “known_hosts” SSH.

Uma nova instância VS Code é aberta conectada à instancia EC2 remota no ambiente AWS.

 

 

No exemplo mostrado pode-se verificar acesso aos recursos AWS a partir da instância remota do VS Code.

É possível customização e instalação de plugins no VS Code e aplicar políticas de governança, segurança e patching.

Conclusão

Um ambiente governando para o desenvolvimento de aplicações nativas em nuvem é o que muitas corporações estão buscando. A combinação do AWS Systems Manager e o VS Code permite uma completa gestão deste ambiente e sem a necessidade de exposição à tráfego de entrada a partir da Internet em Grupos de Segurança. Também permite acesso aos recursos AWS em ambientes segmentados onde ocorra conflitos de blocos de endereçamento IP entre redes corporativas e o ambiente AWS.

Nesse post, nós mostramos o uso do AWS CloudFormation para automatizar a criação de uma instância EC2 para ser usada como ambiente de desenvolvimento VS Code e para gerar o comando para realizar o redirecionamento de porta via AWS Systems Manager, além de configurar a extensão “Remote-SSH” do VS Code.

 


Sobre os autores

Diego Castro é Arquiteto de Infraestrutura na AWS Brasil. Com 21 anos de experiência tem grande interesse por automação, infraestrutura como código, containers e cultura DevOps.

 

 

 

 

Guilherme Greco é Arquiteto de Soluções na AWS, focado no segmento financeiro. Com 19 anos de experiência em infraestrutura e arquitetura, Guilherme auxilia os clientes da AWS desde 2018 a terem sucesso em suas jornadas para nuvem, desde a etapa de criação de uma fundação sólida até migrações de soluções corporativas.

 

 

 

Sobre os revisores

Alex Rosa é Arquiteto de Soluções Principal na AWS.

 

 

 

 

 

Leonardo Lopes é Arquiteto de Infraestrutura na AWS.