使用容器映像檔建立 Lambda 函數 - AWS Lambda

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

使用容器映像檔建立 Lambda 函數

你的 AWS Lambda 函數的代碼由腳本或編譯的程序及其依賴關係組成。使用部署套件將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件:容器映像和 .zip 封存檔。

您可以透過三種方式為 Lambda 函數建置容器映像:

提示

若要縮短 Lambda 容器函數變成作用中狀態所需的時間,請參閱 Docker 文件中的使用多階段建置。若要建置有效率的容器映像,請遵循撰寫 Dockerfiles 的最佳實務

若要使用容器映像建立 Lambda 函數,請在本機建置映像,然後將映像上傳到 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。接著,請在建立函數時指定儲存庫 URI。Amazon ECR 儲存庫必須與 Lambda 函數位於 AWS 區域 相同。只要映像與 Lambda 函數位於相同的區域,您就可以使用不同 AWS 帳戶中的映像檔建立函數。如需詳細資訊,請參閱 Amazon ECR 跨帳戶許可

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

注意

您無法變更現有函數的部署套件類型 (.zip 或容器映像檔)。例如,您無法將容器映像函數轉換為使用 .zip 檔案封存。您必須建立新的函數。

要求

安裝 AWS Command Line Interface (AWS CLI) 版本 2Docker CLI。此外也請注意下列請求:

  • 該容器映像必須實作 Lambda 執行階段 API。 AWS 開放原始碼 執行期界面用戶端會實作 API。您可以將執行期介面用戶端新增至您的偏好基礎映像中,以使其與 Lambda 相容。

  • 容器映像必須能夠在僅唯讀檔案系統上執行。您的函數程式碼可以存取具有 512 MB 和 10,240 MB 儲存空間的可寫入 /tmp 目錄,增量為 1 MB。

  • 預設 Lambda 使用者必須能夠讀取執行函數程式碼所需的所有檔案。Lambda 透過定義具有最低權限許可的預設 Linux 使用者來遵守安全最佳實務。確認您的應用程式的程式碼不依賴其他 Linux 使用者無法執行的檔案。

  • Lambda 僅支援 Linux 容器映像。

  • Lambda 會提供多架構基礎映像。不過,您為函數建置的映像必須只以其中一個架構為目標。Lambda 不支援使用多架構容器映像的函數。

使用 Lambda 的 AWS 基本映像

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

AWS 定期提供 Lambda 基 AWS 礎映像檔的更新。如果您的 Dockerfile 包含 FROM 屬性的映像名稱,則您的 Docker 用戶端會從 Amazon ECR 儲存庫 提取最新版本的映像。若要使用更新的基礎映像,必須重建容器映像並更新函數程式碼

該 Node.js 20, Python 3.12, Java 21, AL2023, 和更高版本的基礎映像基於 Amazon Linux 2023 最小容器映像. 早期的基本映像使用 Amazon Linux 2。與 Amazon Linux 2 相比,AL2023 具有多項優點,包括更小的部署足跡和更新版本的程式庫,如 glibc

基於 Al2023 的圖像使用microdnf(符號鏈接為dnf)作為軟件包管理器而不是yum,這是 Amazon Linux 2 中的默認軟件包管理器。 microdnf是的獨立實作dnf。如需以 AL2023 為基礎之映像檔中包含的套件清單,請參閱比較 Amazon Linux 2023 容器映像上安裝的套件中的最小容器欄。如需有關 AL2023 和 Amazon Linux 2 之間差異的詳細資訊,請參閱 AWS 運算部落格 AWS Lambda上的介紹 Amazon Linux 2023 執行階段

注意

要在本地運行基於 AL2023 的映像,包括使用 AWS Serverless Application Model (AWS SAM),您必須使用碼頭版本 20.10.10 或更高版本。

若要使用 AWS 基本映像檔建立容器映像檔,請選擇您偏好語言的指示:

使用 AWS 僅限作業系統的基本影像

AWS 僅限作業系統的基本映像檔包含 Amazon Linux 散發和執行階段介面模擬器。這些映像常用於為編譯語言 (如 GoRust) 和 Lambda 不提供基礎映像的語言或語言版本 (如 Node.js 19) 建置容器映像。您還可以使用僅限作業系統的基礎映像來實作自訂執行期。若要使映像檔與 Lambda 相容,您必須在映像中加入您語言的 執行期介面用戶端

標籤 執行期 作業系統 Dockerfile 棄用

al2023

僅限作業系統的執行期 Amazon Linux 2023 僅適用於 OS 的運行時的碼頭文件 GitHub

al2

僅限作業系統的執行期 Amazon Linux 2 僅適用於 OS 的運行時的碼頭文件 GitHub

Amazon Elastic Container Registry 公有資源庫:gallery.ecr.aws/lambda/provided

使用非AWS 基本圖像

Lambda 支援符合下列其中一種映像資訊清單格式的任何映像:

  • Docker 映像資訊清單 V2,結構描述 2 (需搭配 1.10 或更新版本的 Docker 使用)

  • 開放容器計劃 (OCI) 規範 (v1.0.0 及以上版本)

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

注意

若要使映像檔與 Lambda 相容,您必須在映像中加入您語言的 執行期介面用戶端

執行期介面用戶端

如果您使用僅限作業系統的基礎映像或替代的基礎映像,則必須在映像中加入執行期介面用戶端。執行階段介面用戶端必須擴充Lambda 執行階段 API,以管理 Lambda 與函數程式碼之間的互動。 AWS 提供下列語言的開放原始碼執行階段介面用戶端

如果您使用的語言沒有 AWS提供的運行時界面客戶端,則必須創建自己的語言。

Amazon ECR 許可

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

請確定建立函數之使用者或角色的權限包含GetRepositoryPolicySetRepositoryPolicy

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

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

Amazon ECR 儲存庫政策

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

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

如需 Amazon ECR 儲存庫許可的詳細資訊,請參閱《Amazon Elastic Container Registry 使用者指南》中的私有儲存庫政策

如果 Amazon ECR 儲存庫不包含這類許可,Lambda 會將 ecr:BatchGetImageecr:GetDownloadUrlForLayer 新增至容器映像儲存庫許可。只有當呼叫 Lambda 的委託人擁有 ecr:getRepositoryPolicyecr:setRepositoryPolicy 許可時,Lambda 才會新增這些許可。

若要檢視或編輯 Amazon ECR 儲存庫許可,請遵循《Amazon Elastic Container Registry 使用指南》設定私有儲存庫政策聲明中的指示。

Amazon ECR 跨帳戶許可

相同區域中的不同帳戶可以建立使用您帳戶擁有的容器映像之函數。在下列範例中,您的 Amazon ECR 儲存庫許可政策需要下列陳述式才能為帳戶編號 123456789012 授予存取權。

  • CrossAccount權限 — 允許帳戶 123456789012 建立和更新使用此 ECR 儲存庫映像的 Lambda 函數。

  • L@@ ambdaecr ImageCross AccountRetrieval 政策 — 如果長時間未叫用函數,Lambda 最終會將函數的狀態設定為非作用中。必須提供此陳述式,讓 Lambda 可以擷取容器映像來最佳化,並代表 123456789012 所擁有的函數進行快取。

範例 - 將跨帳戶許可新增至儲存庫
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

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

如果您正在使用 AWS 組織中的多個帳戶,建議您在 ECR 權限原則中列舉每個帳戶 ID。此方法符合在 IAM 政策中設定狹窄許可的 AWS 安全性最佳做法。

除了 Lambda 權限之外,建立函數的使用者或角色也必須具有BatchGetImageGetDownloadUrlForLayer權限。

函數生命週期

上傳新增或更新的容器映像之後,Lambda 會先最佳化該映像,函數才能處理呼叫。最佳化程序可能需要幾秒鐘。該函數會保持 Pending 狀態,直至程序完成。函數隨後會轉換為 Active 狀態。狀態為 Pending 時,您可以叫用該函數,但該函數的其他操作會失敗。映像更新進行中時若發生叫用,則會執行上一個映像的程式碼。

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

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

您可以使用 Lambda API 來取得函數狀態的相關資訊。如需更多詳細資訊,請參閱 Lambda 函數狀態