

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

# 使用容器映像部署 Lambda 函數
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy，Amazon Web Services*

## 總結
<a name="deploy-lambda-functions-with-container-images-summary"></a>

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

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

此模式中的範例使用 Python 做為基礎程式設計語言，但您可以使用其他語言，例如 Java、Node.js 或 Go。對於來源，請考慮 Git 型系統，例如 GitHub、GitLab 或 Bitbucket，或使用 Amazon Simple Storage Service (Amazon S3)。

## 先決條件和限制
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**先決條件**
+ 已啟用 Amazon Elastic Container Registry (Amazon ECR)
+ 應用程式碼
+ 具有執行時間介面用戶端和最新版本 Python 的 Docker 映像
+ Git 的工作知識

**限制**
+ 支援的影像大小上限為 10 GB。
+ Lambda 型容器部署的執行時間上限為 15 分鐘。

## Architecture
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

**目標架構**

![\[建立 Lambda 函數的四步驟程序。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. 您可以建立 Git 儲存庫，並將應用程式程式碼遞交至儲存庫。

1.  AWS CodeBuild 專案由遞交變更觸發。

1. CodeBuild 專案會建立 Docker 映像，並將建置的映像發佈至 Amazon ECR。

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

**自動化和擴展**

此模式可以透過使用 SDK 中的 AWS CloudFormation AWS Cloud Development Kit (AWS CDK)或 API 操作來自動化。Lambda 可以根據請求數量自動擴展，您可以使用並行參數進行調整。如需詳細資訊，請參閱 [Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html)。

## 工具
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) AWS CloudFormationhelps設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期進行管理 AWS 區域。此模式使用 [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html)，可協助您以視覺化方式檢視和編輯 CloudFormation 範本。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一種全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。

**其他工具**
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories)、[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html) 和 [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) 是一些常用的 Git 型來源控制系統，用於追蹤來源碼變更。

## 最佳實務
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ 讓您的函數盡可能有效率且小，以避免載入不必要的檔案。
+ 努力在 Docker 檔案清單中提高靜態層，並放置更頻繁地降低變更的層。這可改善快取，進而改善效能。
+ 映像擁有者負責更新和修補映像。將更新節奏新增至您的操作程序。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code)。

## 史詩
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### 在 CodeBuild 中建立專案
<a name="create-a-project-in-codebuild"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Git 儲存庫。 | 建立包含應用程式原始碼、Dockerfile 和 `buildspec.yaml` 檔案的 Git 儲存庫。 | 開發人員 | 
| 建立 CodeBuild 專案。 | 若要使用 CodeBuild 專案建立自訂 Lambda 映像，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 開發人員 | 
| 編輯 Dockerfile。 | Dockerfile 應位於您要開發應用程式的頂層目錄中。Python 程式碼應該位於 `src` 資料夾中。當您建立映像時，請使用[官方的 Lambda 支援映像](https://gallery.ecr.aws/lambda?page=1)。否則會發生引導錯誤，使封裝程序更困難。如需詳細資訊，請參閱[其他資訊](#deploy-lambda-functions-with-container-images-additional)一節。 | 開發人員 | 
| 在 Amazon ECR 中建立儲存庫。 | 在 Amazon ECR 中建立容器儲存庫。在下列範例命令中，建立的儲存庫名稱為 `cf-demo`：<pre>aws ecr create-repository --cf-demo </pre>儲存庫將在 `buildspec.yaml` 檔案中參考。 | AWS 管理員、開發人員 | 
| 將映像推送至 Amazon ECR。 | 您可以使用 CodeBuild 來執行映像建置程序。CodeBuild 需要與 Amazon ECR 互動和使用 S3 的許可。在此程序中，會建置 Docker 映像並推送至 Amazon ECR 登錄檔。如需範本和程式碼的詳細資訊，請參閱[其他資訊](#deploy-lambda-functions-with-container-images-additional)一節。 | 開發人員 | 
| 確認映像位於儲存庫中。 | 若要驗證映像是否在儲存庫中，請在 Amazon ECR 主控台上選擇**儲存庫**。如果已在 Amazon ECR 設定中開啟該功能，則應使用標籤和漏洞掃描報告的結果列出映像。 如需詳細資訊，請參閱 [AWS 文件](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html)。 | 開發人員 | 

### 建立 Lambda 函數以執行映像
<a name="create-the-lambda-function-to-run-the-image"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數。 | 在 Lambda 主控台上，選擇**建立函數**，然後選擇**容器映像**。輸入 Amazon ECR 儲存庫中映像的函數名稱和 URI，然後選擇**建立函數**。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html)。 | 應用程式開發人員 | 
| 測試 Lambda 函數。 | 若要叫用和測試函數，請選擇**測試**。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html)。 | 應用程式開發人員 | 

## 疑難排解
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 組建未成功。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## 相關資源
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Lambda 的基礎映像](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [CodeBuild 的 Docker 範例](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [傳遞臨時登入資料](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## 其他資訊
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**編輯 Dockerfile**

下列程式碼顯示您在 Dockerfile 中編輯的命令：

```
FROM public.ecr.aws/lambda/python:3.xx

# 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`命令中，針對 Lambda 支援的 Python 版本使用適當的值 （例如，`3.12`)。這將是公有 Amazon ECR 映像儲存庫中可用的基礎映像。 

`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 組建編號，將影像版本唯一識別為標籤值。您可以變更此項目以符合您的需求。

*buildspec 自訂程式碼*

```
phases:
  install:
    runtime-versions:
       python: 3.xx
  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
```