Codice di imballaggio per AWS Lambda

Sto cercando di impacchettare il codice per AWS Lambda. Lambda ha varie restrizioni, come l’uso del Nodo 6.10, e non ha un passo di costruzione, come fa AWS EB. Sto anche utilizzando i moduli NPM, quindi questi dovranno essere forniti in bundle con il gestore di Lambda AWS.

Ecco cosa mi piacerebbe fare:

  • Definire e utilizzare i moduli NPM (solo moduli JS puri)
  • Trasponi tutto il codice (compresi i moduli NPM) in una versione JS supportata dal nodo 6.10
  • Collega in modo statico tutti i moduli NPM in un unico file JS
  • Carica quel singolo file su AWS Lambda

Ad esempio, supponiamo di avere un modulo NPM foo ( node_modules/foo/index.js ):

 export default { x: 1 }; 

e ho il mio codice (‘index.js’):

 import foo from 'foo'; export const handler = (event, context, callback) => { console.log(foo); // Will appear in CloudWatch logs callback(null, 'OK'); }; 

L’output sarebbe simile a questo (‘dist / bundle.js’):

 var foo = { x: 1 }; exports.handler = function(event, context, callback) { console.log(foo); callback(null, 'OK'); }; 

Dovrei essere in grado di caricare ed eseguire bundle.js su AWS Lambda senza ulteriori modifiche.

Come posso ottenere questo risultato utilizzando gli strumenti JS esistenti?

È ansible utilizzare serverless con serverless-webpack

Quindi distribuisci il tuo bundle con la serverless deploy

Si scopre che questo è ansible , ma richiede alcune complicate configurazioni. Ho creato un repository di piastre per caldaie da utilizzare per gli altri.

Ecco i bit importanti …

Innanzitutto, è necessario un file .babelrc che si .babelrc Node.js 6.10 :

 { "presets": [ [ "env", { "targets": { "node": "6.10" }, "loose": false, "spec": true } ] ] } 

Successivamente, è necessario configurare Webpack per generare un node targeting della libreria commonjs :

 const path = require('path'); const webpack = require('webpack'); const debug = process.env.NODE_ENV !== 'production'; module.exports = { context: __dirname, entry: [ 'babel-polyfill', './index.js' ], output: { path: path.join(__dirname, 'out'), filename: 'index.js', libraryTarget: 'commonjs' }, devtool: debug ? 'source-map' : false, module: { rules: [ { test: /\.js$/, use: { loader: 'babel-loader', options: { babelrc: true, compact: !debug } } } ], }, target: 'node', plugins: [ new webpack.DefinePlugin({ 'global.GENTLY': false }) ] }; 

Si noti che non si vuole ignorare la cartella node_modules , poiché ciò impedirebbe il collegamento statico.

Il plugin babel-polyfill è anche cruciale se si desidera utilizzare le funzionalità JS moderne.

Il tuo codice di gestore effettivo dovrebbe avere export denominata che corrisponda a ciò che hai impostato nella console AWS:

 export const handler = (event, context, callback) => callback(null, 'OK'); 

Non farlo così!

 // Bad! export default { handler: (event, context, callback) => callback(null, 'OK'), }; 

Quando impacchetti il ​​codice, assicurati di aggiungere index.js al livello più alto dello zip:

 zip -j bundle.zip ./out/index.js