Como carregar módulos npm no AWS Lambda?

147

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?

Fook
fonte
7
Tudo está explicado nos documentos aqui - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Respostas:

196

Você não pode carregar os módulos do NPM sem fazer upload de um .ziparquivo, mas é possível reduzir esse processo para duas linhas de comando rápidas.

Aqui está como:

  1. Coloque seu (s) arquivo (s) de função Lambda em um diretório separado. Isso ocorre porque você instala npmpacotes localmente para o Lambda e deseja poder isolar e testar o que fará o upload no Lambda.

  2. Instale seus pacotes NPM localmente npm install packageNameenquanto estiver no diretório Lambda separado que você criou na etapa 1.

  3. Certifique-se de que sua função funcione ao executar localmente: node lambdaFunc.js(você pode simplesmente comentar as duas export.handlerlinhas no seu código para adaptá-lo à execução local com o Node).

  4. Vá para o diretório do Lambda e comprima o conteúdo , certifique-se de não incluir o próprio diretório.

    zip -r lambdaFunc.zip .
    
  5. Se você possui o aws-cliinstalado, o que eu sugiro ter, se você deseja facilitar sua vida, agora você pode inserir este comando:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (sem aspas ao redor da parte lambdaFunc acima, caso você queira saber como eu fiz)

  6. Agora você pode clicar em teste no console do Lambda.

  7. 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:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    
JohnAllen
fonte
10
Pode ser necessário declarar explicitamente a região que você está segmentando: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox 13/10
2
Embora pareça muito mais trabalho, passar por isso, é realmente uma maneira muito melhor de criar essas expressões lambda ... muito obrigado!
precisa
9
Eu tive que usar --zip-file fileb://contra --zip-file file://ao usar estes passos
McLovin
2
Certifique-se de compactar apenas o conteúdo do diretório e fazê-lo na CLI (o uso do comando 'compactar' do localizador de Mac NÃO funcionará ).
Yarin
2
Isso foi super útil .. pelo menos duas coisas estavam faltando para fazer isso funcionar para mim ... 1) foi em --zip-file fileb:vez de filepara mim. 2) no MacOS parece ser com 3 barras, por exemplo, comofileb:///Users/wio/Documents
Tobi
29

.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 installcomando localmente .)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

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:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Eu corro npm installde 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 )

zip -r ../yourfilename.zip * 

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

Yarin
fonte
9

Espero que isso ajude, com a estrutura sem servidor, você pode fazer algo assim:

  1. Adicione estas coisas no seu arquivo serverless.yml:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Em seguida, crie sua função Lambda, implemente-a serverless 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/

Toai
fonte
você precisa primeiro instalá-loserverless plugin install --name pluginName
Liad Livnat 04/04
1

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');

Sunil Chauraha
fonte