

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

# 使用容器映像建立 Lambda 函數
<a name="images-create"></a>

 AWS Lambda 函數的程式碼包含指令碼或編譯的程式及其相依性。使用*部署套件*將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件：容器映像和 .zip 封存檔。

您可以透過三種方式為 Lambda 函數建置容器映像：
+ [使用 Lambda AWS 的基礎映像](#runtimes-images-lp)

  [AWS  基礎映像](#runtimes-images-lp)會預先載入語言執行期、用來管理 Lambda 與函數程式碼之間互動的執行期界面用戶端，以及用於本機測試的執行期界面模擬器。
+ [使用僅限 AWS 作業系統的基礎映像](#runtimes-images-provided)

  [AWS 僅限作業系統的基礎映像](https://gallery.ecr.aws/lambda/provided)包含 Amazon Linux 發行版本和[執行時間界面模擬器](https://github.com/aws/aws-lambda-runtime-interface-emulator/)。這些映像常用於為編譯語言 (如 [Go](go-image.md#go-image-provided) 和 [Rust](lambda-rust.md)) 和 Lambda 不提供基礎映像的語言或語言版本 (如 Node.js 19) 建置容器映像。您還可以使用僅限作業系統的基礎映像來實作[自訂執行期](runtimes-custom.md)。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。
+ [使用非AWS 基礎映像](#images-types)

  您可以使用其他容器登錄檔中的替代基礎映像 (例如 Alpine Linux 或 Debian)。您也可以使用組織建立的自訂映像。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。

**提示**  
若要縮短 Lambda 容器函數變成作用中狀態所需的時間，請參閱 Docker 文件中的[使用多階段建置](https://docs.docker.com/build/building/multi-stage/)。若要建置有效率的容器映像，請遵循[撰寫 Dockerfiles 的最佳實務](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)。

若要使用容器映像建立 Lambda 函數，請在本機建置映像，然後將映像上傳到 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。若您使用 [AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/container-based-products.html) 賣方提供的容器映像，需先將映像複製至私有 Amazon ECR 儲存庫。接著，請在建立函數時指定儲存庫 URI。Amazon ECR 儲存庫必須與 Lambda 函數位於相同的 AWS 區域 中。只要映像與 Lambda 函數位於相同的區域，您就可以使用不同 AWS 帳戶中的映像來建立函數。如需詳細資訊，請參閱[Amazon ECR 跨帳戶許可](#configuration-images-xaccount-permissions)。

**注意**  
Lambda 的容器映像不支援 Amazon ECR FIPS 端點。如果儲存庫 URI 包含 `ecr-fips`，則表示您正在使用 FIPS 端點。範例：`111122223333.dkr.ecr-fips.us-east-1.amazonaws.com`。

本頁面會說明建立 Lambda 相容容器映像檔的基礎映像類型和要求。

**注意**  
不能變更現有函數的[部署套件類型](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip 或容器映像)。例如，您不能轉換容器映像函數以使用 .zip 封存檔。您必須建立新的函數。

**Topics**
+ [要求](#images-reqs)
+ [使用 Lambda AWS 的基礎映像](#runtimes-images-lp)
+ [使用僅限 AWS 作業系統的基礎映像](#runtimes-images-provided)
+ [使用非AWS 基礎映像](#images-types)
+ [執行時期介面用戶端](#images-ric)
+ [Amazon ECR 許可](#gettingstarted-images-permissions)
+ [函數生命週期](#images-lifecycle)

## 要求
<a name="images-reqs"></a>

安裝 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和 [Docker CLI](https://docs.docker.com/get-docker)。此外也請注意下列請求：
+ 該容器映像必須實作 [針對自訂執行時期使用 Lambda 執行時期 API](runtimes-api.md)。 AWS 開放原始碼 [ 執行期界面用戶端](#images-ric)會實作 API。您可以將執行期介面用戶端新增至您的偏好基礎映像中，以使其與 Lambda 相容。
+ 容器映像必須能夠在僅唯讀檔案系統上執行。您的函數程式碼可以存取具有 512 MB 和 10,240 MB 儲存空間的可寫入 `/tmp` 目錄，增量為 1 MB。
+ 預設 Lambda 使用者必須能夠讀取執行函數程式碼所需的所有檔案。Lambda 透過定義具有最低權限許可的預設 Linux 使用者來遵守安全最佳實務。這表示您不需要在 Dockerfile 中指定 [USER](https://docs.docker.com/reference/dockerfile/#user)。確認您的應用程式的程式碼不依賴其他 Linux 使用者無法執行的檔案。
+ Lambda 僅支援 Linux 容器映像。
+ Lambda 會提供多架構基礎映像。不過，您為函數建置的映像必須只以其中一個架構為目標。Lambda 不支援使用多架構容器映像的函數。

## 使用 Lambda AWS 的基礎映像
<a name="runtimes-images-lp"></a>

您可以使用 Lambda 的其中一個 [AWS  基礎映像](https://gallery.ecr.aws/lambda/) 來建置函數程式碼的容器映像。基礎映像會預先載入語言執行期，以及在 Lambda 上執行容器映像所需的其他元件。您可以將函數程式碼和相依項新增至基礎映像，然後將其封裝為容器映像。

AWS 會定期更新 Lambda AWS 的基礎映像。如果您的 Dockerfile 包含 FROM 屬性的映像名稱，則您的 Docker 用戶端會從 [Amazon ECR 儲存庫](https://gallery.ecr.aws/lambda/) 提取最新版本的映像。若要使用更新的基礎映像，必須重建容器映像並[更新函數程式碼](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)。

Node.js 20、Python 3.12、Java 21、.NET 8、Ruby 3.3 及更新版本的基礎映像，均以 [Amazon Linux 2023 最小容器映像](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)為基礎。舊版基礎映像使用 Amazon Linux 2。與 Amazon Linux 2 相比，AL2023 具有多項優點，包括更小的部署足跡和更新版本的程式庫，如 `glibc`。

以 AL2023 為基礎的映像使用 `microdnf` (符號連結為 `dnf`) 而不是 `yum` 作為套件管理工具，後者是 Amazon Linux 2 中的預設套件管理工具。`microdnf` 是 `dnf` 的獨立實作。對於以 AL2023 為基礎的映像中包含的套件清單，請參閱 [Comparing packages installed on Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html) 中的 **Minimal Container** 欄。如需 AL2023 和 Amazon Linux 2 之間差異的詳細資訊，請參閱 AWS 運算部落格上的 [Introducing the Amazon Linux 2023 runtime for AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)。

**注意**  
若要在本機執行AL2023-based映像，包括搭配 AWS Serverless Application Model (AWS SAM)，您必須使用 Docker 20.10.10 版或更新版本。

若要使用 AWS 基礎映像建置容器映像，請選擇您慣用語言的說明：
+ [Node.js](nodejs-image.md#nodejs-image-instructions)
+ [TypeScript](typescript-image.md#base-image-typescript)(使用 Node.js 的基礎映像)
+ [Python](python-image.md#python-image-instructions)
+ [Java](java-image.md#java-image-instructions) 
+ [Go](go-image.md#go-image-provided)
+ [.NET](csharp-image.md#csharp-image-instructions)
+ [Ruby](ruby-image.md#ruby-image-instructions)

## 使用僅限 AWS 作業系統的基礎映像
<a name="runtimes-images-provided"></a>

[AWS 僅限作業系統的基礎映像](https://gallery.ecr.aws/lambda/provided)包含 Amazon Linux 發行版本和[執行時間界面模擬器](https://github.com/aws/aws-lambda-runtime-interface-emulator/)。這些映像常用於為編譯語言 (如 [Go](go-image.md#go-image-provided) 和 [Rust](lambda-rust.md)) 和 Lambda 不提供基礎映像的語言或語言版本 (如 Node.js 19) 建置容器映像。您還可以使用僅限作業系統的基礎映像來實作[自訂執行期](runtimes-custom.md)。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。


| Tags (標籤) | 執行期 | 作業系統 | Dockerfile | 棄用 | 
| --- | --- | --- | --- | --- | 
| al2023 | 僅限作業系統的執行期 | Amazon Linux 2023 | [GitHub 上僅限作業系統之執行期的 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2023/Dockerfile.provided.al2023) |   2029 年 6 月 30 日   | 
| al2 | 僅限作業系統的執行期 | Amazon Linux 2 | [GitHub 上僅限作業系統之執行期的 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2/Dockerfile.provided.al2) |   2026 年 7 月 31 日   | 

Amazon Elastic Container Registry 公有資源庫：[gallery.ecr.aws/lambda/provided](https://gallery.ecr.aws/lambda/provided)

## 使用非AWS 基礎映像
<a name="images-types"></a>

Lambda 支援符合下列其中一種映像資訊清單格式的任何映像：
+ Docker 映像資訊清單 V2，結構描述 2 (需搭配 1.10 或更新版本的 Docker 使用)
+ 開放容器計劃 (OCI) 規範 (v1.0.0 及以上版本)

Lambda 支援的未壓縮影像大小上限為 10 GB，包括所有圖層。

**注意**  
若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。
為取得最佳效能，建議將映像資訊清單大小保持在 25,400 位元組以下。若要縮小映像資訊清單大小，建議盡可能減少映像中的層數量與註釋內容。

## 執行時期介面用戶端
<a name="images-ric"></a>

如果您使用[僅限作業系統的基礎映像](#runtimes-images-provided)或替代的基礎映像，則必須在映像中加入執行期介面用戶端。執行時間界面用戶端必須擴展 [針對自訂執行時期使用 Lambda 執行時期 API](runtimes-api.md)，以管理 Lambda 與函數程式碼之間的互動。 為下列語言 AWS 提供開放原始碼執行時間界面用戶端：
+  [Node.js](nodejs-image.md#nodejs-image-clients) 
+  [Python](python-image.md#python-image-clients) 
+  [Java](java-image.md#java-image-clients) 
+  [.NET](csharp-image.md#csharp-image-clients) 
+  [Go](go-image.md#go-image-clients) 
+  [Ruby](ruby-image.md#ruby-image-clients) 
+  [Rust](lambda-rust.md) – 

如果您使用的語言沒有 AWS提供的執行時間界面用戶端，您必須建立自己的 。

## Amazon ECR 許可
<a name="gettingstarted-images-permissions"></a>

使用容器映像建立 Lambda 函數之前，您必須先在本機建置映像，並將其上傳至 Amazon ECR 儲存庫。建立函數時，請指定 Amazon ECR 儲存庫 URI。

確定建立函數之使用者或角色的許可包含 `GetRepositoryPolicy`、`BatchGetImage`、 `SetRepositoryPolicy`和 `GetDownloadUrlForLayer`。

例如，使用 IAM 主控台建立具有下列政策的角色：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecr:SetRepositoryPolicy",
        "ecr:GetRepositoryPolicy",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world"
    }
  ]
}
```

------

### Amazon ECR 儲存庫政策
<a name="configuration-images-permissions"></a>

若為與 Amazon ECR 中的容器映像位於相同帳戶中的函數，您可以將 `ecr:BatchGetImage` 和 `ecr:GetDownloadUrlForLayer` 許可新增至 Amazon ECR 儲存庫政策。以下範例顯示最低政策：

```
{
        "Sid": "LambdaECRImageRetrievalPolicy",
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": [
          "ecr:BatchGetImage",
          "ecr:GetDownloadUrlForLayer"
        ]
    }
```

如需 Amazon ECR 儲存庫許可的詳細資訊，請參閱《Amazon Elastic Container Registry 使用者指南》**中的[私有儲存庫政策](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)。

如果 Amazon ECR 儲存庫不包含這些許可，Lambda 會嘗試自動新增這些許可。只有當呼叫 Lambda 的主體擁有 `ecr:getRepositoryPolicy` 和 `ecr:setRepositoryPolicy` 許可時，Lambda 才會新增許可。

若要檢視或編輯 Amazon ECR 儲存庫許可，請遵循《Amazon Elastic Container Registry 使用指南》**中[設定私有儲存庫政策聲明](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)中的指示。

#### Amazon ECR 跨帳戶許可
<a name="configuration-images-xaccount-permissions"></a>

相同區域中的不同帳戶可以建立使用您帳戶擁有的容器映像之函數。在下列範例中，您的 [Amazon ECR 儲存庫許可政策](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)需要下列陳述式才能為帳戶編號 123456789012 授予存取權。
+ **CrossAccountPermission** – 允許帳戶 123456789012 建立和更新使用此 ECR 儲存庫中映像的 Lambda 函數。
+ **LambdaECRImageCrossAccountRetrievalPolicy** – 如果很長一段時間內未被調用，Lambda 最終會將函數的狀態設定為非作用中。必須提供此陳述式，讓 Lambda 可以擷取容器映像來最佳化，並代表 123456789012 所擁有的函數進行快取。

**Example - 將跨帳戶許可新增至儲存庫**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CrossAccountPermission",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    },
    {
      "Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Condition": {
        "ArnLike": {
          "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*"
        }
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    }
  ]
}
```

若要授與多個帳戶的存取權，您需將帳戶 ID 新增至 `CrossAccountPermission` 政策中的主體清單，也要新增至 `LambdaECRImageCrossAccountRetrievalPolicy` 中的條件評估清單。

如果您在 AWS 組織中使用多個帳戶，建議您列舉 ECR 許可政策中的每個帳戶 ID。此方法符合在 IAM 政策中設定窄許可 AWS 的安全性最佳實務。

除了 Lambda 許可之外，建立函數的使用者或角色還必須具有 `BatchGetImage` 和 `GetDownloadUrlForLayer` 許可。

## 函數生命週期
<a name="images-lifecycle"></a>

上傳新增或更新的容器映像之後，Lambda 會先最佳化該映像，函數才能處理呼叫。最佳化程序可能需要幾秒鐘。該函數會保持`Pending`狀態，直至程序完成，而後狀態會轉變為`Active`。在函數達到`Active`狀態之前，您無法調用函數。

如果函數在多個星期未被叫用，Lambda 會回收其最佳化版本，並將函數轉換為 `Inactive` 狀態。若要重新啟用函數，您必須叫用它。Lambda 拒絕第一次叫用，並且該函數進入 `Pending` 狀態，直到 Lambda 重新最佳化映像。函數隨後會傳回 `Active` 狀態。

Lambda 會定期從 Amazon ECR 儲存庫中擷取關聯的容器映像。如果對應的容器映像不再存在於 Amazon ECR 或是已撤銷許可，該函數會進入 `Failed` 狀態，並且針對任何函數叫用 Lambda 都會傳回失敗。

您可以使用 Lambda API 來取得函數狀態的相關資訊。如需詳細資訊，請參閱[Lambda 函數狀態](functions-states.md)。