Como criar uma API REST sem servidor em apenas cinco minutos!

Alex Maison Blocked Unblock Seguir Seguindo 12 de janeiro

Olá,

Neste breve artigo, eu gostaria de compartilhar com vocês como você pode usar uma capacidade ilimitada de Amazon Web Services sem servidor API REST e como usar esses recursos na resolução de problemas de aplicação.

Em um exemplo simples, vamos considerar a criação em poucos minutos de nossa própria API REST com auto-serviço e sem servidor, com a análise de um caso – obtendo uma lista para um recurso.

Cloud Computing

Introdução

Nós não vamos usar nenhum banco de dados para análises. Em vez disso, nossa fonte de informações será um arquivo de texto simples no AWS S3.

  • Portanto, suponha que no AWS S3 tenhamos um arquivo de texto com cabeçalhos e um processo grava informações nele.
  • Vamos criar uma API baseada em nuvem, que, por uma solicitação GET com o parâmetro passado, retornará uma coleção JSON na forma de uma resposta.
  • Ao mesmo tempo, dependendo da complexidade das tarefas e, como resultado, do aumento de requisitos para o poder computacional dos recursos, você não precisará se preocupar com isso, porque o serviço é totalmente automático. Isso significa que você não precisa de nenhuma administração, alocação e gerenciamento de servidores, basta carregar seu código e executá-lo.

A arquitetura do sistema desenvolvido

Componentes do Amazon Web Services

Componentes usados do Amazon Web Services:

  • Amazon S3 – armazenamento de objetos, que permite armazenar quantidades praticamente ilimitadas de informações;
  • O AWS Identity and Access Management (IAM) é um serviço que fornece a capacidade de controlar com segurança o acesso a recursos e serviços da AWS. Usando o IAM, você pode criar e gerenciar usuários e grupos da AWS e usar permissões para conceder ou negar acesso a recursos da AWS;
  • O AWS Lambda é um serviço que permite executar códigos sem fazer backup e configurar servidores. Todos os poderes de computação são dimensionados automaticamente para cada chamada. A taxa é cobrada com base no número de solicitações para as funções e sua duração, ou seja, o tempo durante o qual o código é executado.

O nível de acesso gratuito (Camada gratuita) implica 1 milhão de solicitações por mês sem custo e 400K GB-s. Idiomas suportados: Node.js, Java, C #, Go, Python, Ruby, PowerShell

Nós vamos estar usando o Python:

  • A biblioteca boto3 é um AWS SDK para Python que permite interagir com vários serviços da Amazon;
  • O Amazon API Gateway é um serviço de desenvolvedor totalmente gerenciado projetado para criar, publicar, manter, monitorar e proteger APIs em qualquer escala. Além da possibilidade de usar várias versões da mesma API (estágios) para fins de depuração, refinamento e teste, o serviço permite criar API REST sem servidor usando o AWS Lambda . O Lambda executa o código em uma infraestrutura de computação altamente disponível, eliminando a necessidade de distribuição, dimensionamento e gerenciamento do servidor.

O nível de camada gratuita da API HTTP / REST inclui um milhão de chamadas de API por mês durante 12 meses.

Preparação de dados

Um arquivo de texto com uma guia como separadores de campo será usado como uma fonte de informações para gerar respostas em uma solicitação GEST REST . As informações realmente não importam para este exemplo no momento, mas para uso adicional da API , eu descarreguei a tabela de negociações atuais sobre títulos denominados em rublos russos no terminal de negociação da Quik e salvei-os no arquivo bonds.txt. arquivo em um lote da AWS S3 especialmente criado.

Um exemplo da informação recebida é como mostrado na figura abaixo:

Em seguida, você precisa escrever uma função que leia as informações do arquivo bonds.txt, analise-as e as emita mediante solicitação. O AWS Lambda se sairá bem. Mas primeiro, você precisará criar uma nova função que permitirá que a função do Lambda seja criada para ler informações de um lote localizado no AWS S3 .

Criando uma função para o AWS Lambda

  • No AWS Management Console , vá para o serviço AWS IAM e, em seguida, na guia "Funções" , clique no botão "Criar função" ;

Adicionando uma nova função

  • A função que criaremos será usada pelo AWS Lambda para ler informações do AWS S3 . Portanto, na próxima etapa, selecione “Selecionar tipo de confiável” -> “Serviço Aws” e “Escolha este serviço” -> “Lambda” e clique no botão “Próximo: Permissões”

Uma função para o serviço Lambda

  • Agora você precisa definir políticas para acessar os recursos da AWS a serem usados na função recém-criada. A lista de políticas é bastante impressionante, usando o filtro para políticas especificamos "S3" para isso. Como resultado, obtemos uma lista filtrada aplicada ao serviço S3 . Marque a caixa de seleção em frente à política “AmazonS3ReadOnlyAccess” e clique no botão “Next: Tags” .

Políticas para papéis

A etapa (Adicionar tags (opcional)) é opcional, mas, se desejar, você pode especificar tags para Funções. Nós não faremos isso e passaremos para a próxima etapa – Preview. Aqui você precisa definir o nome da função – “ForLambdaS3-ReadOnly” , adicionar uma descrição e clicar no botão “Criar função” .

Funções de título

Tudo, o papel é criado e podemos usá-lo em trabalhos futuros.

Criando um novo recurso no AWS Lambda

Vá para o serviço do AWS Lambda e clique no botão "Criar função":

Criação de função

Preencha todos os campos conforme mostrado na captura de tela abaixo:

  • Nome – "getAllBondsList";
  • Tempo de Execução – “Python 3.6”
  • Função – “Escolha uma função existente”
  • Papel existente – aqui escolhemos o papel que criamos acima – ForLambdaS3-ReadOnly

Seleção de nome e função

Resta apenas escrever o código da função e testar seu desempenho em várias execuções de teste. Deve-se notar que o componente principal de qualquer função do Lambda (se você usa Python) é a biblioteca boto3:

 import boto3 
s3 = boto3.resource ('s3')
bucket = s3.Bucket ('seu-s3-bucket')
obj = bucket.Object (key = 'bonds.txt')
response = obj.get ()

A ideia básica da nossa função Python é a seguinte:

  • Abra o arquivo bonds.txt;
  • Ler os cabeçalhos das colunas;
  • Quebrar registros página por página (10 coleções no nosso caso);
  • Selecione a página desejada;
  • Instantâneo o nome das colunas e registros;
  • Imprima o resultado na forma de coleções.

Não vamos gastar muito tempo com o código de implementação técnica e de função.

 para i no intervalo (0, len (lines_proc)): 
d = dict ((u ''. join (chave), u ''. join (valor)) para (chave, valor)
no zip (cabeçalhos, linhas_proc [i] .split (" t")))
 response_body.append (d) 
 Retorna { 
'statusCode': 200,
'page': num_page,
'body': response_body
}

Insira o código "ou escreva seu próprio" no bloco "Código de função" e clique no botão "Salvar" no canto superior direito da tela.

Insira Código

Criando eventos de teste. Depois de inserir o código, o recurso está disponível para execução e teste. Clique no botão “Test” e crie vários eventos de teste: iniciando a função lambda_handler com diferentes parâmetros. Nomeadamente:

  • Iniciando uma função com o parâmetro 'page': '100';
  • Iniciando a função com o parâmetro 'page': '1000000';
  • Iniciando a função com o parâmetro 'page': 'BlaBlaBla'
  • Execute a função sem o parâmetro 'page'.

Evento de teste Page100

Iniciando a função criada com a transferência da página do evento de teste == 100. Como pode ser visto na imagem abaixo, a função foi concluída com sucesso, retornou o status 200 (OK) , bem como um conjunto de coleções que correspondem ao centésimo página de dados separados usando paginação.

Evento de teste de lançamento Page100

Para a pureza do experimento, lançaremos outro evento de teste – “PageBlaBlaBla” . Neste caso, a função retorna o resultado com o código 415 e o comentário que você precisa verificar a exatidão dos parâmetros passados:

Evento de Teste PageBlaBlaBla

Lançando o Evento Page BlaBlaBla

Criação de API

Depois que todos os outros casos foram testados e há um entendimento de que a função Lambda funciona como esperamos, seguimos para a criação da API . Crie um ponto de acesso para a função Lambda criada acima e, além disso, instale a proteção contra lançamentos indesejados usando a chave da API .

  • Vá para o AWS API Gateway de serviço. Clique no botão “Criar API” , defina o nome da API“getAllBondsList”

Criando uma nova API

  • Adicione o método GET à API recém-criada. Para fazer isso, selecione Ações -> Criar método, na lista suspensa que aparece, selecione o método GET e clique na marca de seleção

Novo método GET

Além disso, ressaltamos que o método GET utilizará nossa função lambda getAllBondsList . Selecione-o e clique no botão Salvar .

Ligando Funções Lambda

  • Vamos implantar nossa API , obtendo assim o URL para a chamada da API .
    Clique em Ações -> Implementar API e, além disso, Implantação e -> Novo Estágio

É possível implantar a API em diferentes estágios e chamar esses estágios como desejar (por exemplo, DEV / QA / PROD). Vamos implantar imediatamente para o PROD.
Implantar API

Implantar API

  • Após a implantação, haverá um link para iniciar a API recém-criada. Vamos para essa URL na barra de endereços do navegador (ou executar o comando curl no terminal) – recebemos uma chamada de API e, como resultado, iniciamos a função Lambda:

URL da API

Para demonstrar como o AWS API Gateway funciona, utilizarei o aplicativo Postman. Pode ser bastante confortável depurar e testar o trabalho da API .

Primeiro teste de API

Parece que algo deu errado … a solicitação GET retornou uma resposta JSON com o código 400 e uma sugestão de que o parâmetro Page não foi especificado na chamada da API . Adicione suporte para parâmetros de solicitação da API .

  • Suporte para parâmetros passados na solicitação.
    Volte para as configurações de solicitação GET e vá para a etapa Solicitação do Método .

Solicitação de Método

Nas configurações detalhadas da Solicitação de Método, você deve expandir o bloco Parâmetros da Cadeia de Consulta da URL e adicionar um novo parâmetro "página" e torná-lo obrigatório (Obrigatório) :

Adicionar parâmetro

Voltamos à página Execução do Método e acessamos o Pedido de Integração. Chegamos ao final da página e abrimos o bloco "Mapping Templates" . Selecione “Quando não houver modelos (recomendado)” , no campo Content-Type, indique application / json e clique na marca de seleção. Nós rolamos a página abaixo e no campo de texto digite o código como mostrado na figura abaixo. Depois disso, clique no botão Salvar .

Solicitação de Método

Tendo feito a API de antemão, nós verificamos novamente, mas já com o parâmetro "page" passando:

Isso é um sucesso! Agora a consulta funcionou com sucesso e nos devolveu as coleções contidas na décima página! Viva!
Resta apenas proteger nossa API contra ataques externos indesejados.

  • Para fazer isso, você precisa configurar a API para funcionar de forma que, ao acessá-la, ela exija uma chave secreta que seja transmitida no cabeçalho.

Vá para a API Keys e crie um novo pacote principal de APIsKeyForBondsList .

Chaves de API

Depois que a Chave da API é criada com sucesso, você deve especificar que a API getAllBondsList deve exigir que a chave da API seja passada no cabeçalho da solicitação. E ligue uma chave KeyForBondsList específica à API getAllBondsList .

Vamos voltar às configurações de solicitação GET na Solicitação de Método e alterar o parâmetro Obrigatório da Chave da API de falso para verdadeiro. A API exigirá agora a transferência de uma chave de API .

Chave de API requerida

Vá para o Plano de Uso e crie um novo plano para usar a API .

Primeiro, damos a ele um nome e uma descrição e, em segundo lugar, aqui você pode definir limites para o lançamento da API, por exemplo, não mais do que uma partida por segundo, etc.

Criar plano de uso

Clique em Avançar e vá para a próxima página onde você precisa vincular os estágios da API com o plano de uso:

Etapa de vinculação ao plano de uso

Na próxima página, associamos a API Keys ao plano de uso da API. Clique no botão Adicionar chaves de API ao plano de uso e encontre os nomes das APIs de chaves nas etapas anteriores:

APIs de vinculação ao plano de uso

Tendo executado calorosamente e executar novamente a chamada GET de nossa API, obtemos a resposta: "Proibido", porque no cabeçalho da solicitação não há uma chave de API:

Vamos tentar adicioná-lo copiando Keys -> KeyForBondsList -> API key -> Show da API e colá-lo na seção apropriada da solicitação com a chave “x-api-key”

Tudo deu certo! Desta vez, a solicitação retorna dados sem problemas. A chamada da API é segura e protegida contra intrusos pela chave secreta da chave da API.

Conclusões

Neste artigo, analisamos a criação de uma API REST com autoescalonamento sem servidor usando os serviços de nuvem da Amazon. O artigo não foi o menor em termos de volume, mas tentei explicar todo o processo de criação de uma API o mais detalhadamente possível e reunir toda a sequência de ações.

Tenho certeza de que, após uma ou duas repetições das ações descritas no artigo, você poderá aumentar sua API da nuvem em cinco minutos e até mais rapidamente.

Devido à sua relativa simplicidade, baixo custo e potência, o serviço AWS API Gateway fornece aos desenvolvedores amplas oportunidades de uso em projetos comerciais e de trabalho. Para consolidar o material teórico deste artigo, tente obter uma assinatura anual gratuita do Amazon Web Services e siga as etapas acima para criar uma API REST por conta própria.