View a markdown version of this page

自我管理 S3 程式碼儲存 - AWS Lambda

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

自我管理 S3 程式碼儲存

根據預設,當您從 .zip 檔案封存建立或更新 Lambda 函數或 layer 時,Lambda 會將程式碼的副本存放在 Lambda 受管儲存體中。每個 AWS 帳戶每個區域都有 300 GB 的 Lambda 受管儲存配額。

使用自我管理的 S3 程式碼儲存,您可以設定 Lambda 直接從您帳戶中的 S3 儲存貯體參考您的程式碼。Lambda 不會儲存程式碼的副本,因此程式碼不會計入您的 Lambda 受管儲存配額。Lambda 會直接從 S3 儲存貯體存取您的程式碼。

自我管理的 S3 程式碼儲存適用於使用 .zip 檔案封存建立和更新的所有函數和層。它與 Glacier 儲存類別以外的所有 S3 儲存類別相容。

注意

自我管理的 S3 程式碼儲存體不會變更最大 .zip 部署套件大小,這會保持在 250 MB (解壓縮)。

設定自我管理 S3 程式碼儲存

若要使用自我管理的 S3 程式碼儲存,請完成下列步驟:

  1. 建立 S3 儲存貯體或使用您帳戶中的現有儲存貯體。

  2. 啟用儲存貯體的 S3 版本控制。Lambda 需要 S3 版本控制來追蹤要使用的來源物件版本。每次上傳新的 .zip 套件時,S3 都會建立新的版本,讓 Lambda 可以區分更新。

  3. 將 .zip 部署套件上傳至 S3 儲存貯體。

  4. 授予來源物件的 Lambda 服務主體s3:GetObjects3:GetObjectVersion許可。請參閱設定許可

  5. 建立或更新您的函數或 layer,指定 S3 物件、S3 金鑰、S3 物件版本,並將 S3ObjectStorageMode 設定為 REFERENCE

設定許可

若要使用自我管理的 S3 程式碼儲存,請授予 Lambda 服務主體 (lambda.amazonaws.com) 存取來源物件的許可。新增下列 S3 儲存貯體政策:

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

建立具有自我管理 S3 儲存的函數

您可以使用 AWS CLI 或 建立具有自我管理 S3 程式碼儲存的函數 AWS CloudFormation。

使用 AWS CLI

使用 create-function命令搭配 S3ObjectStorageMode=REFERENCE 參數:

aws lambda create-function \ --function-name my-function \ --runtime python3.12 \ --role arn:aws:iam::111122223333:role/lambda-execution-role \ --handler lambda_function.lambda_handler \ --code S3Bucket=my-bucket,\ S3Key=my-function.zip,\ S3ObjectVersion=abc123def456,\ S3ObjectStorageMode=REFERENCE

若要更新現有函數以使用自我管理的 S3 儲存體:

aws lambda update-function-code \ --function-name my-function \ --s3-bucket my-bucket \ --s3-key my-function.zip \ --s3-object-version abc123def456 \ --s3-object-storage-mode REFERENCE
重要

您必須在每次呼叫 S3ObjectStorageMode=REFERENCE時指定 update-function-code。如果您省略 S3ObjectStorageMode,它會預設為 COPY,Lambda 會將您的程式碼儲存在 Lambda 受管儲存體中。

使用 AWS CloudFormation

在 CloudFormation 範本中,將 AWS::Lambda::Function 資源的 Code 屬性REFERENCE中的 S3ObjectStorageMode 設定為 :

Resources: MyFunction: Type: AWS::Lambda::Function Properties: FunctionName: my-function Runtime: python3.12 Handler: lambda_function.lambda_handler Role: !GetAtt LambdaExecutionRole.Arn Code: S3Bucket: my-bucket S3Key: my-function.zip S3ObjectVersion: abc123def456 S3ObjectStorageMode: REFERENCE

搭配 layer 使用自我管理的 S3 儲存

您也可以針對 layer 版本使用自我管理的 S3 程式碼儲存。使用 publish-layer-version命令搭配 S3ObjectStorageMode=REFERENCE

aws lambda publish-layer-version \ --layer-name my-layer \ --content S3Bucket=my-bucket,S3Key=my-layer.zip,S3ObjectStorageMode=REFERENCE \ --compatible-runtimes python3.12

您可以使用 Lambda 受管和自我管理儲存的任意組合做為函數程式碼和層程式碼。

在儲存模式之間切換

您可以在更新函數程式碼或發佈新的層版本時,在 Lambda 受管和自我管理的 S3 程式碼儲存之間切換。S3ObjectStorageMode 設定為 COPYREFERENCE

  • COPY (預設) – Lambda 會將您的原始程式碼複製到 Lambda 受管儲存體。

  • REFERENCE – Lambda 會直接從 S3 儲存貯體參考原始程式碼,而不儲存複本。

當您從 切換COPY到 時REFERENCE,Lambda 會刪除原始程式碼的 Lambda 受管副本。當您從 切換REFERENCE到 時COPY,Lambda 會在 Lambda 受管儲存體中複製您的原始程式碼。如果您超過 Lambda 受管程式碼儲存限制,切換到 COPY 失敗。

具有自我管理儲存的函數生命週期

Lambda 會定期從 S3 儲存貯體存取來源物件,以重新最佳化函數程式碼。您必須維護對 函數來源物件的存取,才能保持作用中狀態。

  • 如果 Lambda 無法存取函數的來源物件,函數會轉換為 Inactive 狀態。若要還原函數,請還原來源物件的存取權並更新函數。

  • 如果 Lambda 無法存取 layer 的來源物件,則函數會保持 Active。您可以更新函數組態 (無需更新圖層)、更新函數程式碼,或使用新圖層更新函數組態。不過,使用無法存取的 layer 更新函數組態會失敗。

跨帳戶和跨區域用量

您可以從不同帳戶和不同區域中 S3 儲存貯體的原始程式碼建立函數和層。跨區域物件擷取會產生額外的 S3 資料傳輸成本。如需詳細資訊,請參閱 S3 定價

考量事項

  • 自我管理的 S3 程式碼儲存僅適用於 .zip 檔案封存函數和層。容器映像函數會繼續使用 Amazon ECR。

  • .zip 部署套件大小上限 (250 MB 解壓縮) 保持不變。

  • 對於存放在自我管理儲存貯體中的程式碼,您需要支付標準 Amazon S3 儲存費率。Lambda 不會針對相同區域內的 S3 物件擷取收費。

  • 自我管理的 S3 程式碼儲存與 Glacier 儲存類別以外的所有 S3 儲存類別相容。

  • 您可以使用 S3 跨區域複寫等 S3 功能,跨區域和 S3 生命週期政策共用成品來管理物件。 S3