Indo sem servidor com funções do AWS Lambda – 2

Ankit Prakash Gupta Blocked Desbloquear Seguir Seguindo 13 de janeiro

Como discutido anteriormente, as Funções Lambda podem ser escritas para executar operações complexas, o que pode exigir várias bibliotecas ou módulos. Por exemplo – Extraindo rosto de imagens usando o MXNET, baixando imagens usando links. Para esses casos de uso, precisaremos de várias bibliotecas compactadas no ambiente de execução, já que codificá-las a partir do zero será muito complexo. Portanto, para implantar, teremos que fornecer as bibliotecas necessárias para as instâncias lambda, pois as instâncias lambda só têm bibliotecas específicas para trabalhar.

Só mais uma coisa a notar é que as instâncias do AWS Lambda são na verdade instâncias baseadas no Amazon Linux, que são diferentes dos ambientes do Ubuntu e podem ter códigos diferentes para módulos diferentes. Devido a esse motivo, muitas pessoas enfrentaram problemas de importação da biblioteca PIL com python ao usá-lo em Lambda Functions.

Para superar esse problema, sugiro usar o docker para criar ambientes de tempo de execução para scripts e instalar bibliotecas e testá-lo no mesmo ambiente. Gostaria de informá-lo sobre o uso do docker no download de módulos para instâncias do Amazon Linux. Poste isso, veremos como formar camadas personalizadas e configurar camadas para as funções do AWS Lambda, juntamente com a criação de uma função lambda acionada usando a Criação de objeto no bucket do S3 e o download de imagens usando dados nos arquivos.

Começando com o uso do docker para baixar módulos para instâncias do Amazon Linux. O Docker facilita a conteinerização ou a virtualização no nível do sistema operacional. Primeiro precisamos instalar o docker.

Para instalar o docker no Ubuntu (Xenial ou Bionic) e saber mais sobre os princípios básicos do Docker, consulte Virtualizando o ambiente Cuda usando o Nvidia-Docker e implementando APIs :

Depois de instalar o docker, teremos que executar o contêiner do Docker do AWS Lambda Instance e executar seu shell.
sudo docker run [ --rm] -it -v <code_dir>:/code lambci/lambda:<runtime> sh
Vamos discutir mais sobre o Runtime da Função Lambda disponível aqui:
lambci/lambda:<runtime> : Imagem da Lambda Instance, não precisamos nos preocupar se a imagem está disponível localmente ou não, só precisamos de uma conexão ativa com a internet e a imagem do docker será instalada automaticamente. Podemos escolher na lista a seguir as opções de tempo de execução das Instâncias Lambda.

  • build-nodejs8.10
  • build-nodejs4.3
  • build-nodejs6.10
  • build-python2.7
  • build-python3.6
  • build-python3.7
  • build-ruby2.5
  • build-go1.x
  • build-java8
  • build-dotnetcore2.0
  • build-dotnetcore2.1

Para o ambiente de tempo de execução python3.6, executarei o seguinte comando.

 sudo docker run — rm -it -v /path/to/code/:/code/ lambci/lambda:build-python3.6 sh 

4. Agora, depois de correr para o shell interativo, nós usaríamos o pip3 para baixar os módulos necessários. Para fazer o download do módulo PIL e pedidos, nós executaríamos o seguinte comando no shell do Lambda.
pip3 install pillow
pip3 install requests

Agora, como já instalamos os requisitos, teremos que localizar os módulos necessários e copiá-los no diretório /code/ . Por padrão, a maioria dos pacotes baixados é baixada no diretório /var/lang/lib/python3.6/site-packages/ .

Vamos copiar o módulo PIL e request junto com suas dependências na pasta /code/ usando os seguintes comandos que também podemos acessar após fechar o container docker usando o ubuntu no diretório /path/to/code/ .

 cp -r /var/lang/lib/python3.6/site-packages/PIL / code / 
cp -r /var/lang/lib/python3.6/site-packages/Pillow-5.3.0.dist-info / code /
cp -r /var/lang/lib/python3.6/site-packages/requests / code /
cp -r /var/lang/lib/python3.6/site-packages/urllib3 / code /
cp -r /var/lang/lib/python3.6/site-packages/urllib3–1.24.1.dist-info/ / code /
cp -r /var/lang/lib/python3.6/site-packages/chardet / code /
cp -r /var/lang/lib/python3.6/site-packages/chardet-3.0.4.dist-info/ / code /
cp -r /var/lang/lib/python3.6/site-packages/idna / code /
cp -r /var/lang/lib/python3.6/site-packages/idna-2.7.dist-info/ / code /
cp -r /var/lang/lib/python3.6/site-packages/certifi / code /
cp -r /var/lang/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/ / code /

Agora, depois de ter os módulos necessários em um diretório definido, nós fizemos o download corretamente das bibliotecas necessárias. Agora, vamos nos concentrar em formar camadas personalizadas na AWS.

Depois de fazer o login no Console da AWS e abrir o painel do Lambda. Abra o painel de camadas e clique em "Criar camada".

Posteriormente, estaremos na tela seguinte e, como você pode ver, precisamos preencher o nome da Camada, a descrição da camada, selecionar os tempos de execução compatíveis e carregar um arquivo compactado com os módulos. Mas os módulos ou bibliotecas precisam estar em uma estrutura específica. Vamos passar por isso também.

Tela de criação de camadas

Para incluir bibliotecas em uma camada, coloque-as em uma das pastas suportadas pelo seu tempo de execução mencionado abaixo:

  • Node.js : nodejs / node_modules, nodejs / node8 / node_modules (NODE_PATH)
  • Python : python, python / lib / python3.7 / site-packages (diretórios do site)
  • Java – java / lib (caminho de classe)
  • Ruby – rubi / gemas / 2.5.0 (GEM_PATH), rubi / lib (RUBY_LIB)
  • All – bin (PATH), lib (LD_LIBRARY_PATH)

Vamos criar um diretório no formato acima mencionado. Em primeiro lugar, teremos que alterar as permissões de leitura / gravação da pasta /path/to/code/ usando o seguinte comando, pois estávamos usando o docker com permissões sudo . Então, ou teremos que alterar as permissões da pasta ou mudar para um usuário com permissões sudo (superuser do).
sudo chmod 777 -R /path/to/code/
Poste o que, vamos criar uma pasta dentro do /path/to/code/ named python.
mkdir /path/to/code/python
Mover todas as pastas no diretório python, exceto o próprio diretório python

 cd /path/to/code 
mv !(python) -t ./python/

Depois de pressionar todas essas bibliotecas nos diretórios acima, feche a pasta e faça o upload na tela de criação de camadas da AWS. Podemos usar o seguinte comando para fazer isso.

  1. Baixe o zip no Ubuntu.
    sudo apt-get install zip
  2. Execute os seguintes comandos para zipar a pasta
 cd /path/to/code 
zip -r ~ / lambda-layer_1.zip python

Agora, clique no botão Upload na tela Create Layer, Browse, selecione o arquivo lambda-layer_1.zip e clique em Create.

Nós criamos a camada com sucesso. Também podemos criar versões de camada única e também baixar o pacote da camada criada.

Agora, continuando com a criação de uma função do Lambda que baixa imagens forneceu uma lista de IDs de canal do Youtube e seu link de imagem de perfil como um arquivo no S3 e carrega as imagens em um arquivo compactado no S3. Para isso, vamos criar uma função para funções lambda, que permite que a função lambda crie logs do Cloudwatch e forneça acesso total ao S3.

Tela de criação de função

Abra o serviço IAM no AWS Console e selecione Funções. Clique em Create Role e escolha Lambda como o serviço que usará essa função e clique em Next: Permissions.

Tela de Revisão de Função

Agora, selecione as políticas necessárias para Acesso Completo ao S3 (AmazonS3FullAccess) e à Política de Criação de Log do Lambda Cloudwatch (AWSLambdaBasicExecutionRole). E clique em Next: Tags e pode fornecer pares de valor-chave, vamos pular as tags por enquanto e clicar em Next: Review. Eventualmente, Fornecendo nome e descrição sobre a Função e verificando as Políticas na Função, clicaremos no botão Criar Função para concluir o Processo de Criação de Função.

Agora vamos criar uma função Lambda, usando a função criada acima e a camada.

Depois de clicar, botão Criar Função, selecione S3 Trigger e selecione Evento de Criação de Objeto e forneça o Prefixo do Caminho no qual você irá carregar o arquivo de entrada e clique em Adicionar.

Configuração do gatilho S3

Agora, vamos configurar o Layer para a função Lambda, clique em Layers no Lambda Designer e depois clique em Add a layer. Selecione a camada relevante e sua versão e clique em Adicionar.

Configurando Camada para uma Função Lambda

Eventualmente, altere o código no editor in-line. Use o código a seguir para baixar as imagens em um formato compactado, altere o tempo limite e as configurações de memória da CPU e salve a função lambda.

Agora, para testar a função Lambda, faça o upload de um arquivo no bucket do Target S3 com json sendo despejado em todas as linhas. Eu copiei manualmente links de fotos de perfil de várias pessoas e as coloquei nesse arquivo.

 1546760133 
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAwK4vgc4xY4WEkqBN-L5PAMxMk78S7N9FjL_Q = s800-mo-c-c0xffffffff-rj-k-no", "num": "1"}
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAXXDERjWHJoIOMzk3oGIb9AW4epd59EIZoV3w = s800-mo-c-c0xffffffff-rj-k-no", "num": "2"}
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAxTMaIX7mBvmGmHAdYhZe1C9UuqmH6TWG5nxQ = s800-mo-c-c0xffffffff-rj-k-no", "num": "3"}
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAwaRnCUkcxfZW1LkRPQNqnrNmaTGWWuSyEvSA = s800-mo-c-c0xffffffff-rj-k-no", "num": "4"}
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAwgXwU1xHh7-WauvK-4OY7" "qq" "5"}
{"thumbnail": "https: / / yt3.ggpht.com / a - / AN66SAxtsoYVvKUkLEokTKHi9KznmpeXRlWIzXyhBQ = s800-mo-c-c0xffffffff-rj-k-no", "num": "6"}

Após o envio, veremos um novo diretório “output_files” criado no diretório lambda_test, onde as imagens zipadas e os arquivos de erros serão carregados no S3.

Espero que isso tenha lhe proporcionado uma visão geral completa de como funciona a função do AWS Lambda e como você pode desenvolver facilmente as funções do Lambda com bibliotecas diferentes e resolver seus casos de uso facilmente.

Espero que você encontre este artigo informativo e fácil de aprender, se você tiver alguma dúvida não hesite em contactar-me em info.ankitp@gmail.com