首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用无服务器部署AWS Lambda函数不会在需要外部模块时部署

使用无服务器部署AWS Lambda函数不会在需要外部模块时部署
EN

Stack Overflow用户
提问于 2020-02-23 23:58:39
回答 1查看 1.9K关注 0票数 4

我目前正试图使用无服务器的方式部署AWS lambda函数。如果我不包括任何外部模块,我就可以得到正确部署和响应的函数,但是,只要我尝试包括dynogels和Joi,我就会立即做出响应:

代码语言:javascript
复制
const dynogels = require("dynogels");
const Joi = require("@hapi/joi");

serverless deploy命令将无法通过“打包外部模块”

不包括时的全部输出,包括外部模块:

代码语言:javascript
复制
❯ sls deploy
{ addHandler: './addHandler.js' }
Serverless: Bundling with Webpack...
   1 module
Serverless: No external modules needed
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service game-data-service.zip file to S3 (1.9 KB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............
Serverless: Stack update finished...
Service Information
service: game-data-service
stage: dev
region: ap-southeast-2
stack: game-data-service-dev
resources: 11
api keys:
  None
endpoints:
  POST - XXXXXXXXXXX/endpoint
functions:
  addData: game-data-service-dev-addData
layers:
  None
Serverless: Updated basepath mapping.
Serverless Domain Manager Summary
Domain Name
  XXXXXXXXXXX.com
Distribution Domain Name
  Target Domain: XXXXXXXXXXX
  Hosted Zone Id: XXXXXXXXXXX
Serverless: Removing old service artifacts from S3...
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

包含外部模块时的全部输出:

代码语言:javascript
复制
❯ sls deploy
{ addHandler: './addHandler.js' }
Serverless: Bundling with Webpack...
   3 modules
Serverless: Package lock found - Using locked versions
Serverless: Packing external modules: dynogels@^9.1.0, @hapi/joi@^17.1.0

软件包已经安装好了。我不明白为什么这不部署。我是否可以从部署中看到一些错误?--verbose似乎没有提供更多的额外信息。谢谢你的帮忙!

编辑 serverless.yml

代码语言:javascript
复制
service: game-data-service

provider:
  name: aws
  runtime: nodejs12.x
  stage: dev
  region: ap-southeast-2
  environment:
    SERVICE_NAME: ${self:service}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - dynamodb:BatchGetItem
      Resource: "arn:aws:dynamodb:ap-southeast-2:*:*"
    - Effect: Allow
      Action:
        - codepipeline:StartPipelineExecution
      Resource: "arn:aws:codepipeline:ap-southeast-2:*:*"
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:PutObjectAcl
      Resource: "arn:aws:s3:::XXXXXXXXXXX-assets-bucket/*"

plugins:
  - serverless-domain-manager
  - serverless-webpack

custom:
  stage: ${opt:stage, self:provider.stage}
  admin_arn: XXXXXXXXXX
  user_arn: XXXXXXXXXXX
  domains:
    prod: XXXXXXXXXXX.com
    staging: XXXXXXXXXXX.com
    dev: XXXXXXXXXXX.com
  webpack:
    webpackConfig: "webpack.config.js"
    includeModules: true # Node modules configuration for packaging
    packagePath: "../package.json"

  customDomain:
    basePath: gameData
    domainName: ${self:custom.domains.${self:custom.stage}}
    stage: "${self:custom.stage}"
    createRoute53Record: true

##############################################################
# Functions
##############################################################

functions:
  addData:
    handler: addHandler.hello
    events:
      - http: POST add

webpack.config.js

代码语言:javascript
复制
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
var path = require("path");
function resolve(dir) {
  return path.join(__dirname, dir);
}

console.log(slsw.lib.entries);
module.exports = {
  entry: slsw.lib.entries,
  target: "node",
  // Since 'aws-sdk' is not compatible with webpack,
  // we exclude all node dependencies
  externals: [nodeExternals()],
  resolve: {
    alias: {
      "@": resolve("../lib"),
      "=": resolve("../db")
    }
  },
  optimization: {
    minimize: false
  },
  mode: slsw.lib.webpack.isLocal ? "development" : "production",
  stats: "minimal"
};

addHandler.js

代码语言:javascript
复制
"use strict";

import { success, failure } from "@/response";
// import schema from "=/schema";
// import gameSchema from "=/gameSchema";

// const dynogels = require("dynogels");
// const Joi = require("@hapi/joi");
const cowsay = require("cowsay");


export const hello = (event, context, callback) => {
  console.log("Running ADD");
  console.log(cowsay.say({ text: "Mooodule" }));
  const body = JSON.parse(event.body);

  const table = body["table"];
  const data = body["data"];
  if (body["table"] == null) {
    callback(
      null,
      failure({
        error: "You must provide the table name in the body"
      })
    );
  }
  console.log(`Body recieved for table ${table}:`, data);
  callback(null, success({ message: `Data added to ${table}` }));
  // try {
  //   gameSchema[event.pathParameters.table].create(body, (err, res) => {
  //     if (err) {
  //       callback(null, failure({ error: err }));
  //       return;
  //     }

  //     callback(null, success(res));
  //   });
  //   callback(null, success(res));
  // } catch (err) {
  //   callback(null, failure({ error: err }));
  //   return;
  // }
};
EN

回答 1

Stack Overflow用户

发布于 2020-09-28 08:41:56

尝试为您的SAM应用程序使用Lambda层

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60368059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档