使用容器映像部署 Lambda 函數 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用容器映像部署 Lambda 函數

由拉姆·康達斯瓦米(AWS)創建

環境:生產

技術:容器與微服務; CloudNative DevelopmentAndTesting;無伺服器

工作負載:所有其他工作

AWS 服務:Amazon EC2 容器登錄;AWS Lambda

Summary

AWS Lambda 支援容器映像檔做為部署模型。此模式示範如何透過容器映像部署 Lambda 函數。 

Lambda 是一種無伺服器、事件驅動的運算服務,您可以使用它為幾乎任何類型的應用程式或後端服務執行程式碼,而無需佈建或管理伺服器。透過 Lambda 函數的容器映像支援,您可獲得應用程式成品最高 10 GB 儲存空間的優勢,以及使用熟悉的容器映像開發工具的能力。

此模式中的範例使用 Python 做為基礎程式設計語言,但您可以使用其他語言,例如 Java、Node.js 或 Go。該模式使用 AWS CodeCommit 作為來源,但您也可以使用 GitHub Bitbucket 或 Amazon Simple Storage Service (Amazon S3)。

先決條件和限制

先決條件

  • Amazon Elastic Container Registry (Amazon ECR) 激活

  • 應用程式碼

  • 帶有運行時界面客戶端和最新版本的 Python 的碼頭圖像

限制

  • 支援的最大影像大小為 10 GB。

  • 以 Lambda 為基礎的容器部署的執行時間上限為 15 分鐘。

架構

目標技術堆疊

  • Python 编程语言

  • AWS CodeBuild

  • AWS CodeCommit

  • Docker 映像檔

  • Amazon ECR

  • AWS Identity and Access Management (IAM)

  • AWS Lambda

  • Amazon CloudWatch 日誌

目標架構

描述如下圖所示。
  1. 您可以建立儲存庫並使用提交應用程式程式碼 CodeCommit。

  2. 對進行變更時,會啟動 CodeBuild 專案 CodeCommit,並將其用作來源提供者。

  3. 該 CodeBuild 項目創建碼頭映像並將圖像發佈到 Amazon ECR。

  4. 您可以使用 Amazon ECR 中的映像來建立 Lambda 函數。

自動化和規模

您可以使用 AWS CloudFormation、AWS Cloud Development Kit (AWS CDK) 或開發套件中的 API 操作來自動化此模式。Lambda 可以根據請求數量自動擴展,您可以使用並行參數對其進行調整。如需詳細資訊,請參閱 L ambda 文件

工具

AWS 服務

  • AWS CloudFormation 設計師提供整合的 JSON 和 YAML 編輯器,可協助您檢視和編輯 CloudFormation 範本。

  • AWS CodeBuild 是全受管的建置服務,可協助您編譯原始程式碼、執行單元測試,以及產生準備好部署的成品。

  • AWS CodeCommit 是一種版本控制服務,可協助您以私密方式存放和管理 Git 儲存庫,而無需管理自己的原始檔控制系統。

  • AWS CodeStar 是一種雲端服務,可在 AWS 上建立、管理和使用軟體開發專案。對於此模式,您可以使用 AWS CodeStar 或其他開發環境。

  • Amazon Elastic Container Registry (Amazon ECR) 是安全、可擴展且可靠的受管容器映像登錄服務。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

其他工具

  • Docker 是一組平台即服務 (PaaS) 產品,它們在作業系統層級使用虛擬化,在容器中提供軟體。

最佳實務

  • 使您的功能盡可能高效和小,以避免加載不必要的文件。

  • 努力在 Docker 文件列表中使靜態圖層更高,並將更頻繁變化的圖層放置在較低的位置。這改善了緩存,從而提高了性能。

  • 映像擁有者負責更新和修補映像。將該更新節奏添加到您的操作流程中。如需詳細資訊,請參閱 AWS Lambda 文件

史诗

任務描述所需技能

創建一個 CodeCommit 存儲庫。

創建一個包含 Docker 文件,文件和應用程序源代碼的 CodeCommit 存儲庫。buildspec.yaml如需詳細資訊,請參閱 AWS CodeCommit 文件

開發人員

建立 CodeBuild 專案。

在 CodeBuild 控制台上,創建一個使用 CodeCommit repo 和buildspec.yaml文件的新項目。您將使用該 CodeBuild 項目來創建映像。

確認已啟用特權模式。要構建碼頭圖像,這是必要的。否則,映像檔將無法成功建置。

提供專案名稱和描述的值。對於來源提供者,請選擇 CodeCommit。如需詳細資訊,請參閱 AWS 文件

開發人員

編輯碼頭文件。

Docker 文件應位於您正在開發應用程序的頂級目錄中。Python 代碼應該在src文件夾中。

建立映像檔時,請使用 Lambda 官方支援的映像檔。否則,將發生引導錯誤,從而使打包過程更加困難。

如需詳細資訊,請參閱其他資訊一節。

開發人員

在 Amazon ECR 中創建一個存儲庫。

在 Amazon ECR 中建立容器儲存庫。在下面的示例命令中,創建的存儲庫的名稱是cf-demo。儲存庫將在buildspec.yaml檔案中重複使用。

aws ecr create-repository --cf-demo
AWS 管理員、開發人員

將映像推送至 Amazon ECR。

您可以使用執 CodeBuild 行映像構建過程。 CodeBuild 需要與 Amazon ECR 互動並與 S3 合作的權限。作為流程的一部分,Docker 映像檔會建立並推送至 Amazon ECR 登錄。如需範本和程式碼的詳細資訊,請參閱其他資訊一節。

開發人員

確認映像檔位於存放庫中。

若要驗證映像檔是否位於儲存庫中,請在 Amazon ECR 主控台上選擇儲存庫。如果在 Amazon ECR 設定中開啟了該功能,則應列出影像並附有標籤,並附上弱點掃描報告的結果。 如需詳細資訊,請參閱 AWS 文件

開發人員
任務描述所需技能

建立 Lambda 函數。

在 Lambda 主控台上,選擇 [建立函數],然後選擇 [容器映像檔]。輸入 Amazon ECR 儲存庫中映像檔的函數名稱和 URI,然後選擇 [建立函數]。如需詳細資訊,請參閱 AWS Lambda 文件

應用程式開發人員

測試 Lambda 函數。

若要叫用並測試函數,請選擇 [測試]。如需詳細資訊,請參閱 AWS Lambda 文件

應用程式開發人員

故障診斷

問題解決方案

構建不成功。

  1. 檢查項目的特權模式是否已打 CodeBuild 開。

  2. 確保 Docker 相關命令具有必要的權限。嘗試添sudo加到命令。

  3. 確認與相關聯的 IAM 角色具 CodeBuild 有包含適當動作的政策,可與 Amazon ECR、Amazon S3 和 CloudWatch 日誌互動。

相關資源

其他資訊

編輯碼頭文件

下列程式碼顯示您在 Docker 檔案中編輯的命令。

FROM public.ecr.aws/lambda/python:3.11 # Copy function code COPY app.py ${LAMBDA_TASK_ROOT} COPY requirements.txt ${LAMBDA_TASK_ROOT} # install dependencies RUN pip3 install --user -r requirements.txt # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.lambda_handler" ]

FROM命令值對應於在公共 Amazon ECR 映像存儲庫中使用 Lambda 函數的 Python 3.11 基本映像。 

此命COPY app.py ${LAMBDA_TASK_ROOT}令會將程式碼複製到 Lambda 函數將使用的工作根目錄。此命令使用環境變量,因此我們不必擔心實際路徑。要運行的函數作為參數傳遞給命CMD [ "app.lambda_handler" ]令。

COPY requirements.txt命令捕獲代碼所需的依賴關係。 

此命RUN pip install --user -r requirements.txt令會將相依性安裝至本機使用者目錄。 

若要建立映像檔,請執行下列命令。

docker build -t <image name> .

在 Amazon ECR 中添加圖像

在下面的代碼中,替換aws_account_id為帳戶號碼,us-east-1如果您使用的是不同的區域進行替換。buildspec檔案會使用 CodeBuild 組建編號,將映像版本唯一識別為標籤值。您可以變更此選項以符合您的需求。

構建規格的自定義代碼

phases: install: runtime-versions: python: 3.11 pre_build: commands: - python3 --version - pip3 install --upgrade pip - pip3 install --upgrade awscli - sudo docker info build: commands: - echo Build started on `date` - echo Building the Docker image... - ls - cd app - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER . - docker container ls post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER