Eu criei várias funções Lambda usando o editor baseado na web. Por enquanto, tudo bem. Agora eu gostaria de começar a estender aqueles com módulos (como Q para promessas). Não consigo descobrir como enviar os módulos para o Lambda para que possam ser consumidos pelas minhas funções.
Eu li isso, mas parece envolver a configuração de um EC2 e a execução de funções Lambda a partir daí. Existe um mecanismo para fazer upload de um zip ao criar uma função, mas isso parece envolver o envio de funções desenvolvidas localmente. Como estou trabalhando no editor da Web, isso parece um fluxo de trabalho estranho.
Como posso simplesmente implantar alguns módulos para uso em minhas funções Lambda?
Respostas:
Você não pode carregar os módulos do NPM sem fazer upload de um
.zip
arquivo, mas é possível reduzir esse processo para duas linhas de comando rápidas.Aqui está como:
Coloque seu (s) arquivo (s) de função Lambda em um diretório separado. Isso ocorre porque você instala
npm
pacotes localmente para o Lambda e deseja poder isolar e testar o que fará o upload no Lambda.Instale seus pacotes NPM localmente
npm install packageName
enquanto estiver no diretório Lambda separado que você criou na etapa 1.Certifique-se de que sua função funcione ao executar localmente:
node lambdaFunc.js
(você pode simplesmente comentar as duasexport.handler
linhas no seu código para adaptá-lo à execução local com o Node).Vá para o diretório do Lambda e comprima o conteúdo , certifique-se de não incluir o próprio diretório.
Se você possui o
aws-cli
instalado, o que eu sugiro ter, se você deseja facilitar sua vida, agora você pode inserir este comando:(sem aspas ao redor da parte lambdaFunc acima, caso você queira saber como eu fiz)
Agora você pode clicar em teste no console do Lambda.
Sugiro adicionar um pequeno alias para os dois comandos acima. Aqui está o que tenho no meu para o comando de atualização do Lambda por muito mais tempo:
fonte
aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
--zip-file fileb://
contra--zip-file file://
ao usar estes passos--zip-file fileb:
vez defile
para mim. 2) no MacOS parece ser com 3 barras, por exemplo, comofileb:///Users/wio/Documents
.zip
É necessário um arquivo para incluir módulos npm no Lambda. E você realmente não deve usar o editor da Web Lambda para muitas coisas - como em qualquer código de produção, você deve estar desenvolvendo localmente, comprometendo-se com o git etc.MEU FLUXO:
1) Minhas funções Lambda são geralmente utilitários auxiliares para um projeto maior, por isso crio um diretório / aws / lambdas para abrigá-las.
2) Cada diretório lambda individual contém um arquivo index.js que contém o código da função, um arquivo package.json que define as dependências e um subdiretório / node_modules . (O arquivo package.json não é usado pelo Lambda, é apenas para que possamos executar o
npm install
comando localmente .)package.json:
3) Ignore todos os diretórios node_modules e arquivos .zip para que os arquivos gerados pelo npm sejam instalados e compactados não atrapalhem nosso repositório.
.gitignore:
4) Eu corro
npm install
de dentro do diretório para instalar módulos e desenvolvo / teste a função localmente.5) Eu zipo o diretório lambda e o carrego através do console.
( IMPORTANTE: Não use o utilitário 'compactar' do Mac do Finder para compactar o arquivo! Você deve executar o zip na CLI a partir da raiz do diretório - veja aqui )
NOTA:
Você pode ter problemas se instalar os módulos dos nós localmente no seu Mac, pois alguns módulos específicos da plataforma podem falhar quando implantados no ambiente Linux do Lambda. (Consulte https://stackoverflow.com/a/29994851/165673 )
A solução é compilar os módulos em uma instância do EC2 iniciada na AMI que corresponda ao tempo de execução do Lambda Node.js que você está usando (consulte esta lista de tempos de execução do Lambda e suas respectivas AMIs ).
Consulte também Pacote de implantação do AWS Lambda no Node.js - AWS Lambda
fonte
Agora você pode usar as Camadas Lambda para esse assunto. Basta adicionar uma camada contendo o pacote que você precisa e ele funcionará perfeitamente.
Siga esta publicação: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
fonte
Espero que isso ajude, com a estrutura sem servidor, você pode fazer algo assim:
plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch)
2. Em seguida, crie sua função Lambda, implemente-aserverless deploy
, o pacote incluído no serverless.yml estará lá para você.Para obter mais informações sobre sem servidor: https://serverless.com/framework/docs/providers/aws/guide/quick-start/
fonte
serverless plugin install --name pluginName
O módulo npm deve ser empacotado dentro do pacote nodejs e fazer upload para o AWS Lambda Layers como zip. Você precisará consultar o module / js como abaixo e usar os métodos disponíveis. const mymodule = require ('/ opt / nodejs / MyLogger');
fonte