使用 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。

請確保建立函數的使用者或角色的許可包含 AWS 受管政策 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 授予存取權。

  • CrossAccountPermission— 允許帳戶 123456789012 建立和更新使用來自此 ECR 儲存庫之映像的 Lambda 函數。

  • L@@ ambdaecr ImageCrossAccountRetrievalPolicy-如果長時間未調用函數,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 安全性最佳實務一致。

容器映像設定

以下是常見的容器映像設定。如果您在 Dockerfile 中使用這些設定,請注意 Lambda 解讀和處理這些設定的狀況:

  • ENTRYPOINT - 指定應用程式進入點的絕對路徑。

  • CMD - 指定要使用 ENTRYPOINT 傳入的參數。

  • WORKDIR - 指定工作目錄的絕對路徑。

  • ENV - 指定 Lambda 函數的環境變數。

如需有關 Docker 如何使用容器映像設定的詳細資訊,請參閱 Docker Docs 網站上 Dockerfile 參考中的 ENTRYPOINT。如需有關使用 ENTRYPOINT 和 CMD 的詳細資訊,請參閱 AWS 開放原始碼部落格上的揭秘 Docker 中的 ENTRYPOINT 和 CMD

建置映像後,您即可在 Dockerfile 中指定容器映像設定。您還可以使用 Lambda 主控台或 Lambda API 來覆寫這些組態。這可讓您部署多個函數,可用於部署相同的容器映像,但具有不同的執行期組態。

警告

當您在 Dockerfile 中指定 ENTRYPOINT 或 CMD 或作為覆寫時,請確保您輸入絕對路徑。另外,請勿使用符號連結作為容器的進入點。

覆寫容器映像中的組態值
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇要更新的函數。

  3. 映像組態 下,選擇 編輯

  4. 輸入任何覆寫設定的新值,然後選擇 儲存

  5. (選用) 若要新增或覆寫環境變數,請在 環境變數 下選擇 編輯

如需更多詳細資訊,請參閱 使用 Lambda 環境變數