O blog da AWS

Crie um resolvedor de sessão serverless para seu NICE DCV Connection Gateway

Por Andrew Morgan

Os clientes podem implementar um resolvedor de sessão personalizado para os gateways de conexão NICE DCV usando serviços da AWS. Essa abordagem fornece um endpoint seguro que resolve conexões DCV em grande escala sem exigir infraestrutura dedicada. Os administradores se beneficiam da alta disponibilidade integrada, do aumento da agilidade e das otimizações de custos oferecidas pela tecnologia serverless. Os usuários finais que se conectam por meio de um gateway de conexão DCV são roteados perfeitamente para a sessão DCV, sem depender de um único ponto de falha para resolver a sessão.

Nesta postagem de blog de nível 300, você implementa um endpoint de resolvedor de sessão serverless para o DCV Connection Gateway. Seu resolvedor é acessado por meio do uso do Amazon API Gateway e do AWS Lambda. Quando o gateway resolve uma ID de sessão, ele espera o endereço IP privado do servidor DCV de destino como resposta. Neste blog, você usa o ID da instância do Amazon Elastic Compute Cloud (Amazon EC2) como ID da sessão. Seu gateway colocará as informações da sessão na API do resolvedor e obterá o IP privado do servidor DCV de destino como resposta.

Visão geralAn architecture of an API Gateway and Lambda function acting as a serverless resolver for DCV Connection Gateway

A arquitetura ilustra um usuário final se conectando a um servidor DCV por meio de um gateway de conexão DCV. A estrutura dessa conexão é DCV-Gateway-IP-or-DNS:8443/?AuthToken=Token#SessionId. Quando o usuário se conecta ao gateway com essas informações, o parâmetro sessionID é enviado como uma solicitação HTTP POST para um API Gateway. O API Gateway é acessado com segurança por meio de um endpoint privado da Amazon Virtual Private Cloud (Amazon VPC). O método POST do API Gateway transfere essas informações para uma função Lambda que retorna o endereço IP privado do servidor DCV de destino. Neste passo a passo, você usa o ID da instância EC2 como SessionID, mas ele pode ser personalizado para usar identificadores diferentes.

Pré-requisitos

Para acompanhar este blog, você precisará de um par de chaves do Amazon EC2 e de permissões do AWS Identity and Access Management (IAM) para:

  • Criar um API Gateway
  • Criar um VPC endpoint
  • Criar uma função Lambda
  • Criar uma função e uma política do IAM
  • Criar uma instância do Amazon EC2

Você também precisará de um Amazon VPC com resolução de DNS e nomes de host DNS habilitados. Você deve ter uma sub-rede pública e privada configurada de acordo com as melhores práticas da VPC.

Passo a passo

Etapa 1: criar um VPC endpoint para o API Gateway

  1. Navegue até a página Amazon VPC Endpoints no AWS Management Console.
  2. Selecione Criar endpoint.
  3. (Opcional) Atribua uma TAG de nome ao endpoint.
  4. Verifique se a opção AWS Services está selecionada na categoria de serviço.
  5. Na caixa de pesquisa Serviços, insira execute-api, selecione o filtro proposto (formatado como com.amazonaws.REGION.execute-api) e, em seguida, selecione o item com.amazonaws.REGION.execute-api.
  6. Na seção VPC, selecione seu ID de VPC no menu suspenso.
  7. Na seção Sub-redes, selecione as sub-redes privadas que podem ser acessadas de onde você planeja provisionar seu gateway de conexão DCV.
  8. Na seção Grupos de segurança, selecione um grupo de segurança que permitirá acesso ao endpoint dentro da sub-rede.
  9. Na seção Política, selecione Acesso total.
  10. Por fim, selecione Criar endpoint.
  11. Anote o ID do VPC endpoint, ele será necessário posteriormente.

Etapa 2: Criar a função Lambda DCVSessionResolver

Nesta etapa, você cria a função Lambda DCVSessionResolver. Essa função permite que o usuário gere um token para se autenticar no servidor DCV.

  1. Navegue até o console do AWS Lambda.
  2. Selecione Criar função.
  3. Verifique se a opção Author from scratch está selecionada.
  4. Insira DCVSessionResolver na caixa Nome da função.
  5. Na caixa Runtime, selecione Python 3.12 ou mais recente.
  6. Na caixa Arquitetura, selecione arm64.
  7. Selecione Criar função.
  8. Depois que a função for criada, substitua o conteúdo da função Lambda pelo código no repositório do Github.
  9. Selecione Implantar.
  10. Navegue até a guia Configuração, selecione Permissões na lista à esquerda e selecione o link da função abaixo do nome da função.
  11. Selecione o botão Adicionar permissões e, em seguida, Criar inline policy.
  12. Selecione o link Escolher um serviço próximo a Serviço e selecione EC2.
  13. Na seção Ações permitidas, selecione DescribeInstances em Lista.
  14. Selecione Avançar.
  15. Insira um nome para a política na caixa Nome da política.
  16. Selecione Criar política.

Etapa 3: criar um gateway de API

Nesta etapa, você cria um API Gateway. Isso funciona como um gatilho Lambda privado para invocar a função DCVSessionResolver que você criou na etapa anterior.

  1. Navegue até o console do Amazon API Gateway. Verifique se você está na região em que criou o VPC endpoint.
  2. Selecione Criar API.
  3. Na seção REST API privado, selecione o botão Criar.
  4. Na página Criar REST API, mantenha a opção Nova API selecionada e nomeie sua API como DCVSessionResolver.
  5. No menu suspenso VPC endpoint IDs, selecione o VPC endpoint que você criou na primeira etapa e selecione Adicionar.
  6. Selecione Criar API.
  7. Depois que a API for criada, na página Recursos, selecione Criar recurso.
  8. Em Nome do recurso, insira ResolveSession e selecione Criar recurso.
  9. No recurso ResolveSession, selecione Criar método.
  10. Em Tipo de método, selecione POST.
  11. Selecione o botão de opção da função Lambda e alterne o controle deslizante de integração do proxy Lambda.
  12. No menu suspenso da função Lambda, selecione a função Lambda que você criou na etapa anterior e selecione Criar método.
  13. Navegue até a página Política de Recursos na lista à esquerda e selecione Criar política.
  14. No menu suspenso Selecionar um template, selecione a Fonte VPC Allow list.
  15. Na política recém-adicionada, faça as seguintes alterações:
    • {{stageNameOrWildcard}}: Beta
    • {{httpVerbOrWildcard}}: POST
    • {{resourcePathOrWildcard}}: resolveSession
    • aws: sourceVpc”: aws: sourceVpce
    • {{vpcId}}: ID do VPC Endpoint da Etapa 1
      • Observe que aws:sourceVpc foi substituído por aws:sourceVpce. Um exemplo de política pode ser encontrado abaixo.
    • {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Deny",
                  "Principal": "*",
                  "Action": "execute-api:Invoke",
                  "Resource": "arn:aws:execute-api:REGION:ACCT-ID:API-ID/Beta/POST/resolveSession",
                  "Condition": {
                      "StringNotEquals": {
                          "aws:sourceVpce": "vpce-1234567890abcdef0"
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": "execute-api:Invoke",
                  "Resource": " arn:aws:execute-api:REGION:ACCT-ID:API-ID/Beta/POST/resolveSession"
  16. Selecione Salvar alterações.
  17. Selecione Recursos no painel de navegação.
  18. Selecione Implantar API na página do método /resolveSession.
  19. Selecione *Novo estágio* e dê ao estágio o nome de Beta.
  20. Selecione Implantar.
  21. Anote o URL de invocação da API recém-criada e o ID da API. O URL está no formato https://API-ID.execute-api.REGION.amazonaws.com/beta/ e o ID da API é recuperado dela.

Etapa 4: criar uma função do IAM para o gateway de conexão DCV

Nesta etapa, você cria uma função do IAM para sua instância EC2 do DCV Connection Gateway. A função do IAM permite que o gateway invoque o API Gateway para resolver os IDs de sessão recebidos.

  1. Navegue até a página de políticas do console AWS IAM.
  2. Selecione Criar política.
  3. Selecione Escolher um serviço na seção Serviço e selecione ExecuteAPI.
  4. Na seção Nível de ação, selecione Invocar.
  5. Em Recursos, selecione o botão Específico. Na seção execute-api-general, selecione Adicionar ARNs. Na caixa de diálogo, insira o seguinte:
    • Em Recurso em, selecione Esta conta.
    • Na caixa Região, a região em que você criou o API Gateway.
    • Na caixa ID da API, a ID da API recuperada no final da etapa três.
    • Na caixa Stage, insira Beta.
    • Na caixa Método, insira POST.
    • Na caixa de caminho de recurso específico da Api, insira DCVSessionResolver.
    • Selecione Adicionar ARNs.
  6. Selecione Avançar.
  7. Insira DCVSessionResolverApiPolicy na caixa Nome.
  8. Selecione Criar política.
  9. Escolha Funções no painel de navegação.
  10. Escolha Criar função.
  11. Selecione EC2 na seção Caso de uso e selecione Avançar.
  12. Na página Adicionar permissões, selecione DCVSessionResolverApiPolicy.
  13. Escolha Avançar.
  14. Em Nome da função, insira DCVSessionResolverApiRole.
  15. Escolha Criar função.

Etapa 5: Criar um gateway de conexão DCV

Nesta etapa, você provisiona um único gateway de conexão DCV que tem seu resolvedor configurado para usar o endpoint privado do API Gateway.

  1. Navegue até o console do EC2.
  2. Selecione Iniciar instância.
  3. Em Nome, insira DCV Connection Gateway.
  4. Selecione Amazon Linux 2 como a AMI da instância.
  5. Use o menu suspenso Arquitetura para selecionar 64 bits (Arm).
  6. Em Tipo de instância, selecione um c7g.large, da família de instâncias C7g.
  7. Em Par de chaves (login), selecione seu par de chaves no menu suspenso.
  8. Na seção Configurações de rede, escolha a VPC e a sub-rede para o gateway de conexão DCV.
    • Observe que você deve ter acesso direto ao gateway para estabelecer conexões. Se os usuários finais estiverem iniciando conexões pela Internet, você deverá ter um gateway de Internet.
  9. Selecione um grupo de segurança. Esse grupo de segurança fornece acesso de streaming ao gateway e comunicação entre o gateway, o API Gateway e os servidores DCV. A configuração padrão se vincula à porta 8443, mas isso pode ser alterado.
  10. Na seção Configurar armazenamento, selecione o valor padrão de 8 GB.
  11. Expanda os detalhes avançados.
  12. Anexe a função do IAM que você criou na etapa anterior no menu suspenso do perfil da instância do IAM.
  13. Na seção Dados do usuário, cole o script de bootstrap encontrado no repositório do Github.
    • Observe que você precisa remover o comentário do comando sed que define o endpoint do resolvedor. Substitua o espaço reservado RESOLVER-URL pelo URL de chamada que você anotou na etapa três.
  14. Selecione Iniciar instância.

Validação

Nesta seção, você confirma que seu resolvedor de sessão está operacional. Neste blog, você não implantou servidores DCV. Esta seção validará se a API que você implantou pode responder ao gateway de conexão DCV. Para testar isso, você inicia uma conexão com o gateway com um token de autenticação fictício e um ID de instância do EC2 na sua VPC como ID da sessão. Depois de iniciar essa conexão, os registros do gateway refletem a resolução da sessão.

  1. Crie sua DCV connection string substituindo os seguintes espaços reservados. Isso começa com https://, já que você usa o navegador como um cliente DCV para se conectar.
    • Substitua GATEWAY-PUBLIC-IP-OR-DNS pelo IP ou DNS público do gateway de conexão DCV.
    • Substitua i-abcdef01234567890 por uma instância do EC2 em sua VPC. Se você não tiver outra instância do EC2, poderá usar a instância do DCV Connection Gateway.
    • https://GATEWAY-PUBLIC-IP-OR-DNS:8443/?authToken=example-token#i-abcdef01234567890
  2. Abra seu navegador local e conecte-se ao URL. Observe que, por padrão, o gateway usa um certificado autoassinado para criptografar o tráfego. Isso faz com que o usuário confie na conexão. No Chrome, você seleciona Avançado e, em seguida, o link Continuar. Em produção, você pode distribuir seu próprio certificado TLS.
  3. Depois que a conexão falhar, use o SSH ou use o AWS Systems Manager Session Manager para se conectar à instância do DCV Connection Gateway.
  4. Depois de conectado, invoque o comando a seguir. A resposta ilustrará a API que resolve o endereço IP privado do ID da instância fornecido.
    • cat /var/log/dcv-connection-gateway/gateway.log | grep 'Route found'

Limpeza

Neste blog, você implantou recursos que geram custos, incluindo um API Gateway, um VPC Endpoint, uma instância EC2 e uma função Lambda. Para reduzir custos adicionais, você pode remover esses recursos.

Você pode remover as políticas e funções do IAM criadas durante este passo a passo.

Conclusão

Neste blog, você implementou um endpoint de resolução de sessão sem servidor para seu gateway de conexão DCV usando o API Gateway e Lambda. A resolução de uma sessão roteará a sessão DCV pelo gateway para o servidor DCV associado ao ID da sessão. O ID da sessão usado nesse passo a passo foi um ID de instância, mas pode ser qualquer identificador que resulte em uma resposta de IP privado de destino. O protocolo DCV precisa ser autenticado para começar a transmitir a sessão. A autenticação do protocolo ao transmitir por meio de um gateway de conexão DCV é realizada por meio de autenticação externa. Para implementar endpoints validadores e provedores de token sem servidor, consulte o blog Como usar serviços sem servidor da AWS como autenticador externo para NICE DCV. Em uma carga de trabalho de produção, normalmente haverá uma estrutura de interface de usuário para lidar com essas interações. Uma estrutura de interface de usuário permite que os usuários finais selecionem um botão para lidar com as ações pré-sessão. Isso inclui provisionar um token, localizar o ID da sessão do usuário e conectar perfeitamente o usuário à sessão por meio do uso de um cliente de URI ou navegador.

Este blog em português é uma tradução do blog original em inglês.

Autor

Andrew veio para a AWS em 2019 vindo de um grande ambiente de datacenter, onde se especializou em VMware, Cisco UCS e automação. Durante seu tempo na AWS, ele desenvolveu uma paixão por cargas de trabalho de visualização. Em 2022, ele começou sua função atual como advogado sênior de desenvolvedores da DCV.

Tradutores e Revisores

Luiz Rampanelli é um Solutions Architect no time da AWS Latam. Possui mais de 10 anos de experiência com workloads Microsoft em nuvem e ambientes híbridos. Atua com desenho de soluções seguindo as melhores práticas para que os clientes possam aproveitar ao máximo os benefícios da nuvem da AWS.
Mauricio Trunfio é um Solutions Architect no time da AWS Latam. Possui mais de 18 anos de experiencia com arquitetura e desenvolvimento de software. Atua auxiliando clientes da AWS a utilizarem nossos produtos e serviços da melhor maneira para ter excelência operacional e redução de custos.