diff --git a/README.md b/README.md index 42f1048a4..520447e37 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ serverless install -u https://github.com/serverless/examples/tree/master/folder- | [Dropbox](https://github.com/serverless/examples/tree/master/aws-node-oauth-dropbox-api)
dropbox integration | nodeJS | | [Aws Node Puppeteer](https://github.com/serverless/examples/tree/master/aws-node-puppeteer)
When it comes to AWS Lambda functionΒ , they have their own limits as follows ![AWS Limits](./images/aws_limits.png) SoΒ , When you try to use Puppeteer your deployment package size(unzipped) easily go's above 250 mb because When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. | nodeJS | | [Aws Node Rekognition Analysis S3 Image](https://github.com/serverless/examples/tree/master/aws-node-rekognition-analysis-s3-image)
Analyse an Image from an S3 Bucket with Amazon Rekognition | nodeJS | +| [Serverless Babel Webpack Sample](https://github.com/serverless/examples/tree/master/aws-node-rest-api-babel-webpack)
A simple way to create an AWS API Gateway lambda | nodeJS | | [Aws Node Restapi Mongodb](https://github.com/serverless/examples/tree/master/aws-node-rest-api-mongodb)
Serverless REST API with MongoDB using Mongoose and Bluebird | nodeJS | | [Aws Node Rest Api Typescript](https://github.com/serverless/examples/tree/master/aws-node-rest-api-typescript-simple) | nodeJS | | [Aws Node Typescript Rest Api](https://github.com/serverless/examples/tree/master/aws-node-rest-api-typescript)
This is simple REST API example for AWS Lambda By Serverless framwork with TypeScript and MongoDB Atlas. | nodeJS | diff --git a/aws-node-rest-api-babel-webpack/.babelrc b/aws-node-rest-api-babel-webpack/.babelrc new file mode 100755 index 000000000..9c1c6ecb8 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/.babelrc @@ -0,0 +1,13 @@ +{ + "plugins": ["source-map-support"], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "8.10" + } + } + ] + ] +} diff --git a/aws-node-rest-api-babel-webpack/.gitignore b/aws-node-rest-api-babel-webpack/.gitignore new file mode 100644 index 000000000..64f0cabf7 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/.gitignore @@ -0,0 +1,10 @@ +# Dependency directories +node_modules/ +jspm_packages/ + +# Build folders/files +.serverless +.webpack +.docker +jsconfig.json + diff --git a/aws-node-rest-api-babel-webpack/README.md b/aws-node-rest-api-babel-webpack/README.md new file mode 100644 index 000000000..8eeda57aa --- /dev/null +++ b/aws-node-rest-api-babel-webpack/README.md @@ -0,0 +1,72 @@ +# Serverless + Webpack + Babel Sample +--- + +![badgen](https://badgen.net/badge/built%20with/love/red) +![badgen](https://badgen.net/badge/built%20with/javascript/yellow) +[![serverless](https://camo.githubusercontent.com/547c6da94c16fedb1aa60c9efda858282e22834f/687474703a2f2f7075626c69632e7365727665726c6573732e636f6d2f6261646765732f76332e737667)](http://www.serverless.com) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/0c62da09be11447b9427e85176e70a89)](https://www.codacy.com/gh/pcrodrigues0/serverless-babel-webpack/dashboard?utm_source=github.com&utm_medium=referral&utm_content=pcrodrigues0/serverless-babel-webpack&utm_campaign=Badge_Grade) +![GitHub last commit](https://img.shields.io/github/last-commit/pcrodrigues0/serverless-babel-webpack) +[![Made By](https://img.shields.io/badge/made%20by-Paulo%20Rodrigues-blue)](https://www.linkedin.com/in/pcqrodrigues/) +--- +#### Setup +You need to: +* [Configure the aws credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) +* [Serverless framework](https://serverless.com) installed. +* [Node.js](https://nodejs.org/) +* [Yarn](https://yarnpkg.com/) or [Npm](https://www.npmjs.com/) + +### To Test It Locally πŸ’» + +* Run ```npm install``` or ```yarn``` to install all the necessary dependencies. +* Run ```npm start:local``` or ```yarn start:local``` use serverless offline to test locally. + +The expected result should be similar to: + +``` +Serverless: Bundling with Webpack... +Time: 659ms +Built at: 10/27/2020 7:18:32 PM + Asset Size Chunks Chunk Names + src/index.js 5.99 KiB src/index [emitted] src/index +src/index.js.map 4.58 KiB src/index [emitted] [dev] src/index +Entrypoint src/index = src/index.js src/index.js.map +[./src/helpers/response.js] 238 bytes {src/index} [built] +[./src/index.js] 209 bytes {src/index} [built] +[source-map-support/register] external "source-map-support/register" 42 bytes {src/index} [built] +Serverless: Watching for changes... +offline: Starting Offline: local/us-east-1. +offline: Offline [http for lambda] listening on http://localhost:3002 + + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ + β”‚ GET | http://localhost:3000/local/test β”‚ + β”‚ POST | http://localhost:3000/2015-03-31/functions/getTeste/invocations β”‚ + β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +offline: [HTTP] server ready: http://localhost:3000 πŸš€ +offline: +offline: Enter "rp" to replay the last request +``` + +### Deploy on AWS πŸš€ + +``` +$ npm run deploy:{yourStage} +``` +or +``` +$ yarn deploy:{yourStage} +``` + +## Usage πŸŽ‰ + +send an HTTP request directly to the endpoint using a tool like curl + +``` +curl https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/{stage}/test +``` + +## Scaling πŸ” + +By default, AWS Lambda limits the total concurrent executions across all functions within a given region to 100. The default limit is a safety limit that protects you from costs due to potential runaway or recursive functions during initial development and testing. To increase this limit above the default, follow the steps in [To request a limit increase for concurrent executions](http://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html#increase-concurrent-executions-limit). diff --git a/aws-node-rest-api-babel-webpack/environments.yml b/aws-node-rest-api-babel-webpack/environments.yml new file mode 100644 index 000000000..60c0ee683 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/environments.yml @@ -0,0 +1,2 @@ +default: + SLS_STAGE: ${self:custom.stage} diff --git a/aws-node-rest-api-babel-webpack/functions.yml b/aws-node-rest-api-babel-webpack/functions.yml new file mode 100644 index 000000000..b3390cf10 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/functions.yml @@ -0,0 +1,11 @@ +getTeste: + name: teste-${self:custom.stage}-query + description: Test Query for sample api gateway lambda + handler: ${self:custom.basePath, ''}src/index.handler + memorySize: 128 + timeout: 30 + events: + - http: + path: test + method: get + cors: true diff --git a/aws-node-rest-api-babel-webpack/package.json b/aws-node-rest-api-babel-webpack/package.json new file mode 100755 index 000000000..7b8295489 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/package.json @@ -0,0 +1,36 @@ +{ + "name": "serverless-babel-webpack-sample", + "version": "1.0.1", + "description": "A simple way to create an AWS API Gateway lambda", + "scripts": { + "lint": "eslint .", + "start:local": "sls offline", + "deploy:dev": "sls deploy --stage dev", + "deploy:qa": "sls deploy --stage qa", + "deploy:staging": "sls deploy --stage staging", + "deploy:prod": "AWS_PROFILE=your-production-profile SLS_STAGE=prod serverless deploy --stage prod" + }, + "devDependencies": { + "eslint": "^5.15.3", + "eslint-config-airbnb-base": "^10.0.1", + "eslint-plugin-import": "^2.16.0", + "@babel/core": "^7.2.2", + "@babel/preset-env": "^7.3.1", + "babel-loader": "^8.0.5", + "babel-plugin-source-map-support": "^2.0.1", + "serverless-offline": "^6.5.0", + "webpack": "^4.29.3" + }, + "dependencies": { + "serverless-webpack": "^5.2.0", + "source-map-support": "^0.5.10", + "webpack-node-externals": "^1.7.2" + }, + "engines": { + "node": ">= 12.18", + "yarn": ">= 1.22.5" + }, + "author": "Paulo Rodrigues ", + "license": "MIT", + "private": true +} diff --git a/aws-node-rest-api-babel-webpack/serverless.yml b/aws-node-rest-api-babel-webpack/serverless.yml new file mode 100755 index 000000000..6be285402 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/serverless.yml @@ -0,0 +1,42 @@ +service: sample-api-gateway + +plugins: + - serverless-webpack + - serverless-offline + +custom: + stage: ${opt:stage, 'local'} + basePath: '' + webpack: + webpackConfig: ./webpack.config.js + includeModules: true + packager: yarn + +provider: + name: aws + runtime: nodejs12.x + tags: + projeto: sample-api-gateway + stage: ${opt:stage, 'dev'} + apiName: ${self:service} + stackName: ${self:service}-${self:custom.stage} + deploymentBucket: + name: dev-projectname-deploys + memorySize: 256 + timeout: 30 + versionFunctions: true + logRetentionInDays: 14 + + environment: ${file(./environments.yml):${self:custom.stage}, file(./environments.yml):default} + +functions: ${file(./functions.yml)} + +package: + individually: true + excludeDevDependencies: true + exclude: + - README.md + - .serverless/** + - .webpack/** + - test/** + - /*.yml diff --git a/aws-node-rest-api-babel-webpack/src/helpers/response.js b/aws-node-rest-api-babel-webpack/src/helpers/response.js new file mode 100644 index 000000000..5a39ff227 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/src/helpers/response.js @@ -0,0 +1,7 @@ +export default (statusCode, message) => ({ + statusCode, + headers: { + 'Access-Control-Allow-Origin': '*', + }, + body: JSON.stringify(message), +}); diff --git a/aws-node-rest-api-babel-webpack/src/index.js b/aws-node-rest-api-babel-webpack/src/index.js new file mode 100755 index 000000000..a647b472a --- /dev/null +++ b/aws-node-rest-api-babel-webpack/src/index.js @@ -0,0 +1,6 @@ +import createResponse from './helpers/response'; + +export const handler = async () => + createResponse(200, { + message: 'Encountered a test!', + }); diff --git a/aws-node-rest-api-babel-webpack/webpack.config.js b/aws-node-rest-api-babel-webpack/webpack.config.js new file mode 100755 index 000000000..433a8adb9 --- /dev/null +++ b/aws-node-rest-api-babel-webpack/webpack.config.js @@ -0,0 +1,26 @@ +const slsw = require('serverless-webpack'); +const nodeExternals = require('webpack-node-externals'); + +module.exports = { + entry: slsw.lib.entries, + target: 'node', + devtool: 'source-map', + externals: [nodeExternals()], + mode: slsw.lib.webpack.isLocal ? 'development' : 'production', + optimization: { + minimize: false, + }, + performance: { + hints: false, + }, + module: { + rules: [ + { + test: /\.js$/, + loader: 'babel-loader', + include: __dirname, + exclude: /node_modules/, + }, + ], + }, +};