serverless / serverless/examples

Import in node js file for aws lambda function is not working when I deployed it with serverless

Open
#646 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
JavaScript
Stars
11.5k
Forks
4.4k
Avg merge
2h 55m
Merged PRs (30d)
3

Description

Hi,

So I was trying to build a slack app and deploy it to aws. I built the app and it works fine but when I try and create other js files to import them in my main, the aws post url doesn't work.

The structure of my project(app) is:

Slack-app:
-------------- app.js
-------------- app_home.js
-------------- package.json
-------------- package-lock.json
-------------- serverless.yml

..... The others are node_modules, .serverless etc.

So basically, without the import of app_home.js, the code works when deployed to aws lambda. On the slack app, it sends a message back when you type in hello. But when I add an import, the whole thing, doesn't work.

This works:

"use strict";

const { App, AwsLambdaReceiver, WorkflowStep } = require('@slack/bolt');


// Initialize your custom receiver
const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});

// Initializes your app with your bot token and the AWS Lambda ready receiver
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  receiver: awsLambdaReceiver,
  // The `processBeforeResponse` option is required for all FaaS environments.
  // It allows Bolt methods (e.g. `app.message`) to handle a Slack request
  // before the Bolt framework responds to the request (e.g. `ack()`). This is
  // important because FaaS immediately terminate handlers after the response.
  processBeforeResponse: true
});

// Listens to incoming messages that contain "hello"
app.message('hello', async ({ message, say }) => {
  // say() sends a message to the channel where the event was triggered
  await say({
    text: `Hey there <@${message.user}>! \n Have any questions or concerns, Please contact the IT team.`
  });
});

// Handle the Lambda function event
module.exports.handler = async (event, context, callback) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
}

Where as, this doesn't work at all:


"use strict";

const { App, AwsLambdaReceiver, WorkflowStep } = require('@slack/bolt');

// THIS IS THE LINE THAT I CHANGED FROM THE PREVIOUS CODE
const app_home = require('./app_home')

// Initialize your custom receiver
const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});

// Initializes your app with your bot token and the AWS Lambda ready receiver
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  receiver: awsLambdaReceiver,
  // The `processBeforeResponse` option is required for all FaaS environments.
  // It allows Bolt methods (e.g. `app.message`) to handle a Slack request
  // before the Bolt framework responds to the request (e.g. `ack()`). This is
  // important because FaaS immediately terminate handlers after the response.
  processBeforeResponse: true
});

// Listens to incoming messages that contain "hello"
app.message('hello', async ({ message, say }) => {
  // say() sends a message to the channel where the event was triggered
  await say({
    text: `Hey there <@${message.user}>! \n Have any questions or concerns, Please contact the IT team.`
  });
});

// Handle the Lambda function event
module.exports.handler = async (event, context, callback) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
}

So, I was just working, if it is a deployment issue?

My code for serverless is:

service: slack-app-bolt-js-forto
frameworkVersion: '2'
provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
  profile: default
  timeout: 5
  stage: ${opt:stage, 'dev'}
  memorySize: 512
  environment:
    SLACK_SIGNING_SECRET: ${env:SLACK_SIGNING_SECRET}
    SLACK_BOT_TOKEN: ${env:SLACK_BOT_TOKEN}

functions:
  slack:
    handler: app.handler
    memorySize: 1536
    timeout: 30
    events:
      - http:
          path: slack/events
          method: post
          
plugins:
  - serverless-offline

package.json looks like this

{
  "name": "bolt-js-getting-started-app",
  "version": "2.0.0",
  "description": "Getting Started ⚡️ Bolt for JavaScript",
  "main": "app.js",
  "scripts": {
    "ngrok": "ngrok http 3000",
    "start": "node app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "license": "MIT",
  "dependencies": {
    "@slack/bolt": "^3.6.0",
    "axios": "^0.21.4"
  },
  "devDependencies": {
    "serverless": "^2.59.0",
    "serverless-offline": "^8.2.0"
  }
}

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by comparing app.js, app_home.js, serverless.yml, and package.json, then deploy the version with the import and inspect the AWS Lambda logs for the failure. The issue does not include app_home.js or an error message, so confirm the failing import and deployment behavior before making a change; done means the Slack POST endpoint works with the split files.

Written by the indexing model from the issue text.

Assessment

Tech stack
aws, javascript, node.js
Domain
backend, cloud
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.