首页 > 解决方案 > AWS SAM:无法从函数安装,因为它不包含 package.json 文件

问题描述

我在 Visual Studio Code 中使用 AWS SAM 来设置一些 Node.js lambda 函数。我正在使用 Windows 10。我只是从 AWS SAM 开始,我已经使用命令面板生成了示例 Hello World 应用程序,它可以工作。我开始通过添加第二个功能来扩展应用程序,并重新构建目录结构以开始添加更多功能。我的目录结构现在如下所示:

|--my-app
|  |--event-handlers
|  |  |--hello-world
|  |  |  |--app.js
|  |  |--hello-world-2
|  |  |  |--app.js
|  |--package.json
|  |--template.yml

当我运行时,sam build我收到错误Could not install from ..\my-app\event-handlers\hello-world 因为它不包含 package.json 文件。如果我将 package.json 文件复制到每个子目录hello-worldhello-world-2 中,则sam build可以正常工作。但是我需要为每个函数指定一个单独的 package.json 文件似乎不正确,因为它违反了 DRY 原则。如果我像这样构造它,我期待它应该使用根目录中的 package.json 来处理我的所有 lambda 函数。

我真的需要为每个 lambda 函数复制 package.json 文件吗?就定义多个 lambda 函数的 SAM 应用程序的目录结构而言,最佳实践是什么?为什么它没有从我的根目录中获取我的 package.json 文件?

作为参考,我也包含了我的 template.yaml 文件的一部分

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: event-handlers/hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Events:
        HelloWorld:
          Type: Api 
          Properties:
            Path: /hello
            Method: get

  HelloWorldFunction2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: event-handlers/hello-world-2/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Events:
        MyScheduledEvent:
          Type: Schedule
          Properties:
            Schedule: rate(2 minutes)
            Name: app.lambdaHandler
            Description: Interval at which node function should be called
            Enabled: True

标签: node.jsaws-lambdaaws-sam

解决方案


每个 lambda 都部署有自己的依赖堆栈。在我遇到的大多数情况下,这是一件好事。具有完全相同依赖关系的两个 lambda 表示其中一个函数中存在重复的功能或未使用的依赖关系。

我遇到了和你一样的错误,但是因为我在根文件夹中没有。package.json生成的hello-world示例项目sam init在根文件夹中也没有,但不知何故sam build构建它没有问题。


推荐阅读