无服务器 - 包含/排除



我们已经在“部署函数”章节中看到,要将现有项目中的函数部署到 AWS Lambda,需要修改函数以接受**事件**和**上下文**作为参数,并需要在项目文件夹中添加一个 serverless.yml 文件,其中定义了函数。然后点击**serverless deploy**即可完成部署。

尤其是在需要将一些函数从大型现有项目迁移到 AWS Lambda 时,经常会面临大小方面的挑战。如果项目足够大,很可能会超过 AWS 对 Lambda 函数施加的大小限制(250 MB,包括应用程序代码及其依赖项)。

并且某些依赖项(例如 NumPy)本身就占用大量空间。例如,NumPy 大约 80 MB,SciPy 也差不多,等等。在这种情况下,应用程序代码的剩余空间非常有限,需要一种方法来从 Lambda 部署包中排除不需要的文件。幸运的是,serverless 使这变得非常容易。

include 和 exclude 字段

正如你可能猜到的那样,可以使用“exclude”标签指定要从部署构建中排除的文件和文件夹。默认情况下,在 exclude 部分中未指定的所有文件/文件夹都将包含在内。“include”标签有什么用呢?好吧,如果你想普遍排除某个文件夹,但又想包含该文件夹中的一些文件或子文件夹,则可以在“include”标签中指定这些文件/子文件夹。这样,该文件夹中的所有其他文件都将被排除,只有在“include”部分中指定的文件将保留。下面的示例将更好地解释这一点。

service: influx-archive-pipeline

provider:
   name: aws
   runtime: python3.6
   stage: prod
   region: us-east-2
   profile: yash-sanghvi
   timeout: 900
   memorySize: 1024
  
# you can add packaging information here
package:
   include:
      - src/models/config.py
      - src/models/lambda_apis/**
      - src/models/scheduled_lambdas/**

   exclude:
      - docs/**
      - models/**
      - notebooks/**
      - references/**
      - reports/**
      - src/data/**
      - src/visualization/**
      - src/models/**
      - utils/**
	
functions:
   user_details_api:
      handler: src/models/lambda_apis/user_details_api.sync_user_details
      events:
         - http:
            path: details/{user_id}
            method: get
            integration: lambda
            cors: true

   monitoring_lambda:
      handler: src/models/scheduled_lambdas/monitoring_lambda.periodic_monitoring
      events:
         - schedule: cron(15 16 * * ? *)

从上面的 serverless.yml 文件可以看出,我们排除了包含 serverless.yml 的根文件夹中的大多数文件夹。我们甚至排除了 src/models 文件夹。但是,我们想要包含 src/models 中的 2 个子文件夹和 1 个文件。因此,这些已在“include”部分中专门添加。请注意,默认情况下,任何不是 exclude 部分一部分的文件/文件夹都将包含在内。

请注意两个 Lambda 函数的路径。它们都位于 src/models 中。虽然 src/models 默认被排除,但这些函数专门位于“include”部分中提到的子文件夹中。因此,它们将可以正常执行。如果我添加一个位于 src/data 中的函数,则不允许这样做,因为 src/data 的所有内容都被排除了。

请注意,指定**/**表示该文件夹中的所有内容(文件/子文件夹)都将被包含。因此,如果 docs 文件夹包含 10 个子文件夹和 12 个文件,并且所有这些都需要排除,则**-docs/**即可完成任务。我们不需要分别提及每个文件/文件夹。

广告