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