如何在无服务器应用程序中通过 YAML 添加自定义文件夹和文件

How to add a custom folder and file via YAML in Serverless app

我正在使用 SAM 编写无服务器应用程序。我创建了一个配置文件夹来保存一些 table 信息和一些其他信息。然后我将它加载到我的 app.js 中。

当我使用 SAM 部署在本地部署 app.js 时,我发现配置文件夹将不包含。你介意告诉我如何在 .aws-sam\build 文件夹中的最终构建文件夹中添加配置文件夹吗?

我的 Yaml 文件

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample SAM Template for test

Globals:
  Function:
    Timeout: 120

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

另外,当我 运行 项目处于调试模式时,我收到此错误:

{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module '../config/config.js'"
}

我加载的js文件如下:

"use strict";

let response;
const AWS = require('aws-sdk');
const config = require('../config/config.js');

要包含您需要在多个函数中重复使用的自定义文件,例如您案例中的配置文件。然后你可以使用lambda层。

在您的 template.yml 中,您将包含一个图层,如下所示:

  ConfigLayer:
    Type: "AWS::Serverless::LayerVersion"
    Properties:
      CompatibleRuntimes:
        - nodejs10.x
      ContentUri: ./config/

然后将其添加到您的 lambda 函数定义中:

    Type: AWS::Serverless::Function
    Properties:
      Handler: cmd/lambdas/hello-world/app.lambdaHandler
      CodeUri: src/
      Runtime: nodejs10.x
      Layers:
        - Ref: ConfigLayer
      Events:
        CatchAll:
          Type: Api
          Properties:
            Path: /hello-world
            Method: GET

config/ 目录的内容将在 /opt/ 路径中可用。

这意味着 config.js 的完整路径将是 /opt/config.js,您可以从使用该层的任何 lambda 访问它。