View a markdown version of this page

從 Amazon S3 部署 Web 函數程式碼 - AWS Lambda

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

從 Amazon S3 部署 Web 函數程式碼

您可以在 Amazon S3 儲存貯體中提供 Lambda Web 函數程式碼做為 .zip 部署套件。這是為 Web 函數提供程式碼的唯一方法。當您建立 Web 函數或修訂時,請在 s3Object 欄位中指定物件,該物件會巢狀在請求的 codeConfig內buildConfig。在 中s3Object,包含儲存貯體、金鑰和選用的 versionId。Lambda 會直接從您的儲存貯體參考您的程式碼。由於 Lambda 會將每個修訂釘選為特定物件版本,因此您的部署可以重現。您可以在帳戶和 AWS 區域之間重複使用單一部署套件。

先決條件

從 Amazon S3 部署 Web 函數程式碼之前,請確定您的儲存貯體和部署套件符合下列要求:

S3 版本控制

儲存貯體必須啟用 S3 版本控制。Lambda 使用物件版本來追蹤修訂使用的程式碼版本。

版本 ID

versionId 參數在請求中是選用的。如果您省略它,Lambda 會在建立時使用最新版本的物件。無論哪種方式,Lambda 都會將修訂綁定到特定物件版本。

最大部署套件大小

512 MB (解壓縮)。

項目檔案

部署套件必須包含您應用程式的項目檔案。根據預設,執行時間index.js會在套件的根目錄載入。若要使用不同的項目檔案,請將修訂版上的 AWS_LAMBDA_NODEJS_ENTRYPOINT 環境變數設定為相對於套件根目錄的檔案路徑。載入項目檔案後,執行時間會等待 HTTP 伺服器開始接聽AWS_LAMBDA_HTTP_ENDPOINT來自環境變數的主機和連接埠。如果執行時間無法解析項目檔案,或伺服器從未開始接聽,初始化會失敗,且對端點的請求會失敗。

Lambda 不會確認您的伺服器在建立或更新端點以使用修訂時開始接聽。Active 在這些情況下,修訂和端點仍然可以顯示。每次部署後,傳送測試請求並檢查您的應用程式日誌。

儲存貯體位置

儲存貯體可以位於與 Web 函數不同的 AWS 帳戶和區域 AWS 。儲存貯體必須與 Web 函數位於相同的 AWS 分割區中。儲存貯體不能位於選擇加入區域 (預設為未啟用的區域)。如果不符合任一條件,Lambda 會拒絕請求。跨區域物件擷取會產生額外的 Amazon S3 資料傳輸成本。如需定價的詳細資訊,請參閱 Amazon S3 定價。

所需的許可

若要從 Amazon S3 部署 Web 函數程式碼,您必須設定呼叫身分和 Lambda 服務主體的許可。

來電者許可

若要建立 Web 函數或修訂,您的 IAM 身分需要 S3 物件的下列許可:

  • s3:GetObject

  • s3:GetObjectVersion

對於跨帳戶儲存貯體,儲存貯體政策也必須授予對物件的呼叫身分存取權。

Lambda 的儲存貯體政策

儲存貯體政策必須授予 Lambda 服務主體 (lambda.amazonaws.com) s3:GetObject和 s3:GetObjectVersion 許可。使用符合修訂 ARN 模式aws:SourceArn的條件來範圍政策。使用 ArnLike 搭配萬用字元做為修訂 ID,因為 Lambda 會在您建立修訂時產生修訂 ID。

如果物件使用 AWS KMS 金鑰 (SSE-KMS) 加密,則金鑰政策也必須允許 lambda.amazonaws.com 對該金鑰kms:Decrypt呼叫 。當您建立修訂時,Lambda 會檢查服務主體的存取權,並在缺少存取權時拒絕請求。

下列範例儲存貯體政策授予 Lambda 讀取部署套件的存取權,以用於指定 Web 函數的任何修訂。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLambdaWebFunctionCodeAccess", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::my-bucket/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" } } } ] }

若要限制存取存放部署套件的金鑰字首,請將Resource值變更為 arn:aws:s3:::my-bucket/my-prefix/*,其中 my-bucket 是您的儲存貯體名稱,my-prefix 是金鑰字首。將 保留/*在字首的結尾。請勿在 中變更revision/*萬用字元aws:SourceArn。

使用來自 Amazon S3 的程式碼建立 Web 函數

您可以在 的 codeConfig區段中指定 S3 部署套件buildConfig。下列程序說明如何建立 Web 函數,以及如何使用 建立新的修訂 AWS CLI。

使用來自 Amazon S3 的程式碼建立 Web 函數 (AWS CLI)
  • 執行下列命令來建立參考 Amazon S3 中 .zip 部署套件的 Web 函數。

    aws lambda-web create-web-function \ --function-name my-web-app \ --revision-config '{ "buildConfig": { "codeConfig": { "s3Object": { "bucket": "my-bucket", "key": "my-app.zip" } }, "runtimeConfig": { "runtime": "nodejs24.x" } }, "serviceConfig": { "executionRoleArn": "arn:aws:iam::111122223333:role/my-web-function-role" } }' \ --endpoint-config '{ "endpointName": "my-endpoint", "endpointType": "HomeRegion", "authType": "ApplicationManaged" }'

    當您省略 時versionId,Lambda 會在建立時使用最新版本的物件。

使用特定物件版本建立新的修訂 (AWS CLI)
  • 執行下列命令來建立使用特定版本部署套件的新修訂版。

    aws lambda-web create-web-function-revision \ --function-name my-web-app \ --build-config '{ "codeConfig": { "s3Object": { "bucket": "my-bucket", "key": "my-app.zip", "versionId": "abc123def456" } }, "runtimeConfig": { "runtime": "nodejs24.x" } }' \ --service-config '{ "executionRoleArn": "arn:aws:iam::111122223333:role/my-web-function-role" }'

    透過指定 versionId,您可以將修訂鎖定到物件的確切版本,而不是最新版本。

物件生命週期

請勿刪除 S3 物件或移除作用中修訂的 Lambda 存取權

Lambda 參考來自 Amazon S3 儲存貯體的程式碼。如果您刪除修訂使用的 S3 物件,或修訂使用的特定物件版本,則當 Lambda 下次驗證物件的存取權時,修訂會移至 Failed 狀態,然後無法再為流量提供服務。保留您仍在使用的所有修訂的物件版本。

移除 Lambda 服務主體對儲存貯體的存取權具有相同的效果。如果您修改儲存貯體政策以拒絕或移除 的 s3:GetObject和 s3:GetObjectVersion許可lambda.amazonaws.com,參考該儲存貯體中物件的現有修訂會移至 Failed 狀態。只要任何修訂參考這些物件,即可同時維護物件和 Lambda 服務主體的讀取存取權。

Failed 狀態為永久性。還原已刪除的物件或儲存貯體許可不會將修訂版傳回 Active 狀態。若要復原,請建立參考可用物件版本的新修訂,然後更新端點的修訂權重,以將流量路由到該版本。如需部署模式,請參閱 部署模式。

Lambda 不會自動將流量移離Failed修訂版。以 HTTP 狀態碼 409 和 的lambda-web-error-type回應標頭拒絕端點路由至Failed修訂的請求Platform.RevisionNotActive。如果端點對多個修訂的流量進行加權,則只會影響路由至Failed修訂的請求共用;路由至正常運作修訂的請求會正常提供。若要停止失敗,請更新端點的修訂權重以移除Failed修訂。

使用新的上傳覆寫物件會建立新的 S3 版本。這不會影響現有的修訂:當您建立修訂時,Lambda 會解析並鎖定確切的物件版本,即使您省略 versionId。不過,如果您刪除修訂參考的舊物件版本,則該修訂會移至 Failed 狀態。上傳替換物件沒有幫助,因為替換是具有不同版本 ID 的新版本。

多區域部署

對於具有 MultiRegion或 PerRegion端點的 Web 函數,Lambda 會從您指定的儲存貯體讀取來源物件,位於儲存貯體所在的任何區域中。然後,Lambda 會將從該物件衍生的準備程式碼成品複寫到其他區域。您不需要將部署套件複製到其他 區域中的儲存貯體。如需 Lambda 複寫項目的詳細資訊,請參閱 Lambda 複寫的內容。