無伺服器 - 包含/排除



我們已經在“部署函式”章節中看到,要將現有專案中的函式部署到 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/**即可完成任務。我們不需要分別提及每個檔案/資料夾。

廣告