使用 AWS Lambda 部署容器 - AWS Prescriptive Guidance

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

使用 AWS Lambda 部署容器

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

環境:生產

技術:容器與微服務;商業生產力;原生雲端;成本管理;軟體開發與測試;現代化;無伺服器

工作負載:所有其他工作負載

AWS 服務:AWS EC2 Container Registry;AWS Lambda

Summary

AWS Lambda 支援容器做為部署套件。此模式顯示如何使用 Lambda 服務部署容器。該模式也討論何時選擇 Lambda 而不是其他產品,例如亞馬遜 Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS)。

AWS Lambda 的最大優勢在於無伺服器方法以及部署映像的簡易性。Amazon ECS 和 Amazon EKS 主要著重在在虛擬私有雲端 (VPC) 內執行容器映像。它們適合需要精細組態選項且容器映像的執行時間必須超過 15 分鐘的案例。Lambda 提供立即可用的產品,並根據記憶體自動設定組態選項。使用案例適用於從幾秒鐘到最多 15 分鐘的容器。如需 Lambda 和亞馬遜 ECS、亞馬遜 EKS 和 AWS Fargate 之間的其他比較,請參閱其他資訊區段。

先決條件和限制

先決條件

  • 已啟動 Amazon Elastic Container Registry (Amazon ECR)

  • 應用程式碼

  • Docker 映像與執行時間界面用戶端

限制

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

  • Lambda 型容器部署的執行階段上限為 15 分鐘。

Architecture

目標技術堆疊

  • AWS CodeBuild

  • AWS CodeCommit

  • Docker 影像

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS Identity and Access Management (IAM)

  • AWS Lambda

  • Amazon CloudWatch Logs

目標架構

  1. 您建立儲存庫,並使用 CodeCommit 認可應用程式的程式碼。

  2. CodeBuild 專案會建立,使用程式 CodeCommit 供程式碼提供者。

  3. 代 CodeBuild 運行創建碼頭映像。

  4. CodeBuild 將映像發佈到 Amazon ECR。

  5. 您可以使用亞馬遜 ECR 中的圖像創建 Lambda 函數。

自動化和擴展

您可以使用 AWS CloudFormation、AWS Cloud Development Kit (AWS CDK) 或開發套件中的 API 操作來自動化此模式。Lambda 可以根據要求數量自動調整規模,而且您可以使用並行參數來調整它。

Tools

工具

  • AWS CloudFormation Designer整合式 JSON 和 YAML 編輯器 — AWS CloudFormation 設計工具提供整合式 JSON 和 YAML 編輯器,用於檢視和編輯範本詳細資料。例如,您可以使用 整合式編輯器 來定義資源的屬性或變更範本參數。

  • AWS CodeBuild— AWS CodeBuild 是在雲端的全受管組建服務。CodeBuild 可編譯原始碼、執行單元測試,並產生可立即部署的成品。

  • AWS CodeCommit— AWS CodeCommit 是由 AWS 託管的版本控制服務。您可以使用 CodeCommit,以私下在雲端存放和管理資產 (例如,文件、原始程式碼和二進位檔案)。

  • AWS CodeStar或其他開發環境 — AWS CodeStar 是一種雲端服務,用於建立、管理和處理 AWS 上的軟體開發專案。

  • Amazon ECR— Amazon Elastic Container Registry (Amazon ECR) 是 AWS 受管的容器映像登錄檔服務,具安全性、可擴展性和可靠性。

  • AWS Lambda— AWS Lambda 是一項運算服務,可支援執行程式碼,無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼,可自動從每天數項請求擴展成每秒數千項請求。只需為使用的運算時間支付費用,一旦未執行程式碼,就會停止計費。

  • Docker— Docker 是一種軟體平台,用於建置、測試和部署應用程式。Docker 將軟體封裝成標準化單元,稱為容器,其中包含軟體需要執行的一切,包括程式庫、系統工具、程式碼和執行階段。

Epics

任務描述所需技能
建立 CodeCommit 儲存庫。

下面的方法使用 Python 作為基礎編程語言,但您可以使用其他語言,如 Java,Node.js 或 Go。

要存儲配置文件和將包含代碼的文件,創建一個 CodeCommit 存儲庫。

開發人員
創建一個 CodeBuild 項目。

在 CodeBuild 主控台上,建立新的專案。

提供專案名稱描述的值。指定來源供應商。這個範例會使用 CodeCommit。其他選項包括 GitHub、Bitbucket 或 Amazon Simple Storage Service (Amazon S3)。

開發人員
編輯 Dockerfile。

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

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

如需詳細資訊,請參閱其他資訊區段。

開發人員
在 Amazon ECR 中新增映像。

構建映像並將其發佈到映像存儲庫。使用 CodeBuild 來執行影像建置程序。然後將映像推送到 Amazon ECR 登錄檔。如需詳細資訊和程式碼,請參閱其他資訊區段。

開發人員
確認影像位於存放庫中。

若要確認映像是否在存放庫中,請在 Amazon ECR 主控台上選擇儲存庫。如果 Amazon ECR 設定中已開啟該功能,則應該會列出影像,並附有標籤和弱點掃描報告的結果。 

開發人員
建立 Lambda 函數。

在 Lambda 主控台中,請選擇建立函數,然後選擇容器映像。輸入 Amazon ECR 存放庫中映像的函數名稱和 URI,然後選擇建立函數

開發人員
測試 Lambda 函數。

若要叫用和測試函數,請選擇測試

開發人員

其他資訊

與 AWS Fargate 的比較

下表比較 Lambda 與 Fargate。

AWS LambdaFargate,與亞馬遜 ECS 或亞馬遜 EKS
環境VPC optional; can run without VPC settingsRuns in a VPC, requiring configuration of the VPC, subnets, security groups, task definitions, and service details
儲存空間Does not support Amazon Elastic Block Store (Amazon EBS) attachmentSupports Amazon EBS attachment
相依性Requires the Lambda runtime APIFargate requires an orchestrator (either Amazon ECS or Amazon EKS).
執行時間Maximum runtime of 15 minutesNo maximum runtime
執行Starts with a Lambda function handlerStarts with an entry point mentioned in the task definition
任務置放Provides the ability to configure a task placement strategy and add constraints

Lambda 和 Fargate 的定價模式也有所不同。若要比較,請參閱AWS Lambda 定價AWS Fargate 定價

編輯 Dockerfile

以下螢幕擷取畫面顯示用於編輯 Dockerfile 的命令。

 

所以此FROM命令值會對應於在公用 Amazon ECR 映像存放庫中使用 Lambda 函數的 Python 3.8 基礎映像。 

所以此COPY requirements.txt命令會擷取程式碼所需的相依性。 

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

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

在亞馬遜 ECR 中添加圖像

在下列程式碼中,取代11111111替換為帳戶號碼,並取代us-east-1(如果您使用的是不同的區域)。所以此buildspec檔案會使用 CodeBuild 組建編號,將影像版本唯一識別為標籤值。您可以變更此選項以符合您的需求。

組建規格自訂程式碼

phases: install: runtime-versions: python: 3.8 pre_build: commands: - python3 --version - pip3 install --upgrade pip - pip3 install --upgrade awscli - 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 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 111111111.dkr.ecr.us-east-1.amazonaws.com - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER 11111111.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER - docker push 111111111.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER