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
- Uma conta ativa AWS (usuário ou role AWS Identity and Access Management (IAM).
- AWS Command Line Interface (CLI) e SSM Plugin for AWS CLI.
- Permissões IAM para executar CloudFormation stacks e criar instância EC2.
- AWS Systems Manager configurado para possibilitar gestão sobre instâncias EC2. Caso necessário consulte AWS Systems Manager Quick Setup guide .
- Amazon VPC com acesso Internet via NAT Gateway ou com VPC Endpoints para o AWS Systems Manager.
- IAM instance profile que permita EC2 a ser gerenciado por AWS Systems Manager.
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.
- A partir de sua estação de trabalho, o desenvolvedor requisita um redirecionamento de porta para o AWS Systems Manager usando AWS CLI.
- Usando o SSM Endpoint IP recebido, o SSM Plugin CLI interage com o AWS Systems Manager onde o redirecionamento de porta é executado.
- 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.thinkwithwp.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.thinkwithwp.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.