Add Support for ES6/ES7 JavaScript

From @appernetic on Mon Jan 08 2018 18:59:22 GMT+0000 (UTC)

I intend to use it for user data and each user has only 347 B of data. It will be read each time user signs in and written one time each month when subscription date is updated. Sounds like a perfect use case for SimpleDB.

From @appernetic on Mon Jan 08 2018 21:52:35 GMT+0000 (UTC)

I have researched both SimpleDB, DynamoDB and Aurora Serverless and DynamoDB seems to be the best option.

From @takeuchie on Thu Jan 25 2018 06:53:36 GMT+0000 (UTC)

@jayair hey man…if i want to add ‘src’ directory to store all my codes, what do i need to add or change in the webpack.config.js file …? thanks.

From @jayair on Thu Jan 25 2018 20:28:57 GMT+0000 (UTC)

@takeuchie You just need to change the line in serverless.yml where the handler is referenced with the new path. So handler: create.main changes to handler: src/create.main.

From @takeuchie on Fri Jan 26 2018 09:18:27 GMT+0000 (UTC)

@jayair thanks mate…

From @rudyhadoux on Sun Feb 25 2018 14:39:22 GMT+0000 (UTC)

I do prefer a Typescript AWS Lambda function like here :

From @Malouda on Sun Apr 01 2018 14:59:40 GMT+0000 (UTC)

Error running “serverless invoke local --function create --path mocks/create-event.json”
i get the following error

ERROR in Entry module not found: Error: Can’t resolve ‘./src’ in ‘/var/www/html/learning/notes-app-api’
here is my webpack.config.js

const slsw=require("serverless-webpack");
const nodeExternals=require("webpack-node-externals");


module.export={
    entry:slsw.lib.entries,
    target:'node',
    externals:[nodeExternals()],
    mode:slsw.lib.webpack.islocal?"development":"production",
    optimization:{
        minimize:false
    },
    performance:{
        hints:false
    },
    module:{
        rules:[
            {
                test:/\.js$/,
                loaders:['babel-loader'],
                include:__dirname,
                exclude:/node_modules/
            }
        ]
    }
};

Here is my serverless.yml

service: notes-app-api

# Use serverless-webpack plugin to transpile ES6/ES7
plugins:
  - serverless-webpack

# serverless-webpack configuration
# Enable auto-packing of external modules
custom:
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true

provider:
  name: aws
  runtime: nodejs6.10
  stage: prod
  region: us-east-1

  # 'iamRoleStatement' defines the permission policy for the Lambda function.
  # In this case Lambda functions are granted with permissions to access DynamoDB.
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:us-east-1:*:*"

functions:
  # Defines an HTTP API endpoint that calls the main function in create.js
  # - path: url path is /notes
  # - method: POST request
  # - cors: enabled CORS (Cross-Origin Resource Sharing) for browser cross
  #     domain api call
  # - authorizer: authenticate using the AWS IAM role
  create:
    handler: create.main
    events:
      - http:
          path: notes
          method: post
          cors: true
          authorizer: aws_iam

here is mys package.json

{
  "name": "notes-app-api",
  "version": "1.0.0",
  "description": "",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "aws-sdk": "^2.218.1",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-stage-3": "^6.24.1",
    "serverless-webpack": "^5.1.1",
    "webpack": "^4.4.1",
    "webpack-cli": "^2.0.13",
    "webpack-node-externals": "^1.6.0"
  },
  "dependencies": {
    "babel-runtime": "^6.26.0",
    "uuid": "^3.2.1"
  }
}

here is my create.js

import uuid from "uuid";
import AWS from "aws-sdk";


AWS.config.update({region:"us-east-1"});
const dynamoDB=new AWS.DynamoDB.DocumentClient();


export function main(event,contenxt,callback){

    const data=JSON.parse(event.body);


    const params={
        TableName:"noted",
        Item:{
            userId:event.requestContext.identity.cognitoIdentityId,
            noteId:uuid.content,
            attachment:data.attachment,
            createdAt:new Date().getTime()
        }
    };


dynamoDB.put(params,(error,data)=>{
    const headers={
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Credentials": true
    };

    if(error){
        const response={
            statusCode:500,
            headers:headers,
            body:JSON.stringify({status:false})
        };

        callback(null,response);

        return;
    }

    const response={
        statusCode:200,
        headers:headers,
        body:JSON.stringify(params.Item)
    };
    callback(null,response);
});
   
}


From @jayair on Mon Apr 02 2018 18:24:23 GMT+0000 (UTC)

@Malouda Where is the ./src coming from?

From @lepirlouit on Tue Apr 10 2018 13:25:49 GMT+0000 (UTC)

aws announced support for node 8.10 : https://aws.amazon.com/about-aws/whats-new/2018/04/aws-lambda-supports-nodejs/?nc1=h_ls

is it as simple to replace 6 by 8 in .babelrc and in serverless.yml files

From @jayair on Tue Apr 10 2018 18:22:20 GMT+0000 (UTC)

@lepirlouit Yes it is. We’ll update the tutorial soon.

In the serverless.yml configuration, where do we specify the AWS account to use? I see the name of table and dynamoDB being mentioned but how does it connect to correct AWS account?

I followed the tutorial and ran the mock test and verified the mock note in dynamoDB and it works. Just want to know where it got info about my AWS account.

It uses the default credentials that’s in your local machine: $ cat ~/.aws/credentials.

You can setup multiple profiles here and specific them in your serverless.yml.

Node 12 support for AWS Lambda available. https://aws.amazon.com/about-aws/whats-new/2019/11/aws-lambda-supports-node-js-12/

We use Node 12 now but the serverless-bundle plugin is still needed to have our JS match the one on the frontend.

Has the team considered moving the webpack, sourcemap, and other boilerplate code from each deployed lambda to a common layer? Would this be in the serverless-bundle plugin or need to be handled in the framework proper?

A layer isn’t the best use case for this. Since this will change for each function. We aren’t really deploying Webpack, we are just using it to generate an optimized bundle for each function.

I have just started going though this tutorial and ran into an issue when running the step “serverless invoke local --function hello”

I am using the latest version of git-bash along with node v14.16.1 npm 6.14.12 and python 3.8.1

Any help would be appreciated.

The following comes up in the logs and it just hangs:

Serverless: DOTENV: Could not find .env file.
Serverless: Deprecation warning: CLI options definitions were upgraded with "type" property (which could be one of "string", "boolean", "multiple"). Below listed plugins do not predefine type for introduced options:
             - ServerlessPlugin for "out"
             - ServerlessOffline for "apiKey", "binPath", "cacheInvalidationRegex", "corsAllowHeaders", "corsAllowOrigin", "corsDisallowCredentials", "corsExposedHeaders", "disableCookieValidation", "enforceSecureCookies", "exec", "hideStackTraces", "host", "httpsProtocol", "location", "noAuth", "noEnvironment", "port", "prefix", "preserveTrailingSlash", "printOutput", "providedRuntime", "region", "resourceRoutes", "showDuration", "skipCacheInvalidation", "stage", "useSeparateProcesses", "websocketPort"
            Please report this issue in plugin issue tracker.
            Starting with next major release, this will be communicated with a thrown error.
            More Info: https://www.serverless.com/framework/docs/deprecations/#CLI_OPTIONS_SCHEMA
Serverless: Deprecation warning: Resolution of lambda version hashes was improved with better algorithm, which will be used in next major release.
            Switch to it now by setting "provider.lambdaHashingVersion" to "20201221"
            More Info: https://www.serverless.com/framework/docs/deprecations/#LAMBDA_HASHING_VERSION_V2

Installing the serverless bundle, we get:

pm ERR! code 1
npm ERR! path /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass
npm ERR! command failed
npm ERR! command sh -c node scripts/build.js
npm ERR! Building: /usr/local/bin/node /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp verb cli [
npm ERR! gyp verb cli   '/usr/local/bin/node',
npm ERR! gyp verb cli   '/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/bin/node-gyp.js',
npm ERR! gyp verb cli   'rebuild',
npm ERR! gyp verb cli   '--verbose',
npm ERR! gyp verb cli   '--libsass_ext=',
npm ERR! gyp verb cli   '--libsass_cflags=',
npm ERR! gyp verb cli   '--libsass_ldflags=',
npm ERR! gyp verb cli   '--libsass_library='
npm ERR! gyp verb cli ]
npm ERR! gyp info using node-gyp@3.8.0
npm ERR! gyp info using node@16.0.0 | darwin | x64
npm ERR! gyp verb command rebuild []
npm ERR! gyp verb command clean []
npm ERR! gyp verb clean removing "build" directory
npm ERR! gyp verb command configure []
npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb `which` succeeded python2 /usr/bin/python2
npm ERR! gyp verb check python version `/usr/bin/python2 -c "import sys; print "2.7.16
npm ERR! gyp verb check python version .%s.%s" % sys.version_info[:3];"` returned: %j
npm ERR! gyp verb get node dir no --target version specified, falling back to host node version: 16.0.0
npm ERR! gyp verb command install [ '16.0.0' ]
npm ERR! gyp verb install input version string "16.0.0"
npm ERR! gyp verb install installing version: 16.0.0
npm ERR! gyp verb install --ensure was passed, so won't reinstall if already installed
npm ERR! gyp verb install version is already installed, need to check "installVersion"
npm ERR! gyp verb got "installVersion" 9
npm ERR! gyp verb needs "installVersion" 9
npm ERR! gyp verb install version is good
npm ERR! gyp verb get node dir target node version installed: 16.0.0
npm ERR! gyp verb build dir attempting to create "build" dir: /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/build
npm ERR! gyp verb build dir "build" dir needed to be created? /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/build
npm ERR! gyp verb build/config.gypi creating config file
npm ERR! gyp verb build/config.gypi writing out config file: /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/build/config.gypi
npm ERR! (node:43890) [DEP0150] DeprecationWarning: Setting process.config is deprecated. In the future the property will be read-only.
npm ERR! (Use `node --trace-deprecation ...` to show where the warning was created)
npm ERR! gyp verb config.gypi checking for gypi file: /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/config.gypi
npm ERR! gyp verb common.gypi checking for gypi file: /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/common.gypi
npm ERR! gyp verb gyp gyp format was not specified; forcing "make"
npm ERR! gyp info spawn /usr/bin/python2
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   '/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'make',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass/build/config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   '/Users/trevor/.node-gyp/16.0.0/include/node/common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=/Users/trevor/.node-gyp/16.0.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=/Users/trevor/.node-gyp/16.0.0/<(target_arch)/node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.
npm ERR! 
npm ERR! No receipt for 'com.apple.pkg.DeveloperToolsCLILeo' found at '/'.
npm ERR! 
npm ERR! No receipt for 'com.apple.pkg.DeveloperToolsCLI' found at '/'.
npm ERR! 
npm ERR! gyp: No Xcode or CLT version detected!
npm ERR! gyp ERR! configure error 
npm ERR! gyp ERR! stack Error: `gyp` failed with exit code: 1
npm ERR! gyp ERR! stack     at ChildProcess.onCpExit (/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/lib/configure.js:345:16)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:365:28)
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12)
npm ERR! gyp ERR! System Darwin 20.4.0
npm ERR! gyp ERR! command "/usr/local/bin/node" "/Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
npm ERR! gyp ERR! cwd /Users/trevor/Documents/Websites/serverless/notes-api/node_modules/node-sass
npm ERR! gyp ERR! node -v v16.0.0
npm ERR! gyp ERR! node-gyp -v v3.8.0
npm ERR! gyp ERR! not ok 
npm ERR! Build failed with error code: 1

Cant get any further

Update to the latest version and give it a try. Talked about it here:

We updated the starter project to fix this.

Can you try using the SLS_DEBUG=* flag for the command and it should give some extra info.