

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

# 以 .zip 封存檔形式部署 Lambda 函數
<a name="configuration-function-zip"></a>

當您建立 Lambda 函數時，可以將函數程式碼封裝到部署套件中。Lambda 支援兩種類型的部署套件：容器映像和 .zip 封存檔。建立函數的工作流程取決於部署套件類型。若要設定一個定義為容器映像的函數，請參閱[使用容器映像建立 Lambda 函數](images-create.md)。

可使用 Lambda 主控台和 Lambda API 來建立以 .zip 封存檔定義的函數。也可以上傳更新的 .zip 檔案來變更函數程式碼。

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

**Topics**
+ [建立函數](#configuration-function-create)
+ [使用主控台程式碼編輯器](#configuration-functions-console-update)
+ [更新函數程式碼](#configuration-function-update)
+ [變更執行階段](#configuration-function-runtime)
+ [變更架構](#configuration-function-arch)
+ [使用 Lambda API](#configuration-function-api)
+ [下載函式程式碼](#configuration-function-download)
+ [CloudFormation](#configuration-function-cloudformation)
+ [加密 Lambda .zip 部署套件](encrypt-zip-package.md)

## 建立函數
<a name="configuration-function-create"></a>

當您建立以 .zip 封存檔定義的函數時，您可以選擇函數的程式碼範本、語言版本和執行角色。Lambda 建立函數後，您可以新增函數程式碼。

**建立函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始編寫) 或 **Use a blueprint** (使用藍圖) 來建立函數。

1. 在 **基本資訊** 下，請執行下列動作：

   1. 針對 **函數名稱**，輸入函數名稱。函數名稱的長度限制為 64 個字元。

   1. 對於**執行時間**，選擇函數要使用的語言版本。

   1. (選用) 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。預設架構值為 x86\$164。為您的函數建置部署套件時，確定它與此[指令集架構](foundation-arch.md)相容。

1. (選用) 在**許可**下，展開**變更預設執行角色**。您可建立新的**執行角色**，或使用現有的角色。

1. (選用) 展開 **Advanced settings (進階設定)**。您可對函數選擇**程式碼簽署組態**。您也可以為函數設定 (Amazon VPC) 進行存取。

1. 選擇**建立函數**。

Lambda 建立新函數。您現在可以使用主控台來新增函數程式碼，並設定其他函數參數與功能。如需程式碼部署指示，請參閱函數所用執行時間的處理常式頁面。

------
#### [ Node.js ]

[使用 .zip 封存檔部署 Node.js Lambda 函數](nodejs-package.md) 

------
#### [ Python ]

 [使用 .zip 封存檔部署 Python Lambda 函數](python-package.md) 

------
#### [ Ruby ]

 [使用 .zip 封存檔部署 Ruby Lambda 函數](ruby-package.md) 

------
#### [ Java ]

 [使用 .zip 或 JAR 封存檔部署 Java Lambda 函數](java-package.md) 

------
#### [ Go ]

 [使用 .zip 封存檔部署 Go Lambda 函數](golang-package.md) 

------
#### [ C\$1 ]

 [使用 .zip 封存檔建置和部署 C＃ Lambda 函數](csharp-package.md) 

------
#### [ PowerShell ]

 [使用 .zip 封存檔部署 PowerShell Lambda 函數](powershell-package.md) 

------

## 使用主控台程式碼編輯器
<a name="configuration-functions-console-update"></a>

主控台將建立具有單一來源檔案的 Lambda 函數。對於指令碼語言，您可以使用內建的程式碼編輯器編輯該檔案並新增更多檔案。選擇 **Save** (儲存) 以儲存變更。然後，若要執行程式碼，請選擇 **Test** (測試)。

當您儲存函數程式碼時，Lambda 主控台會建立 .zip 封存檔部署套件。當您在主控台之外開發函數程式碼 (使用 IDE) 時，您需要[建立部署套件](nodejs-package.md)將您的程式碼上傳到 Lambda 函數。

## 更新函數程式碼
<a name="configuration-function-update"></a>

對於指令碼語言 (Node.js、Python 和 Ruby)，您可以在內嵌的程式碼編輯器中編輯函數程式碼。如果程式碼大於 3MB，或如果您需要新增程式庫，或對於編輯器不支援的語言 (Java、Go、C\$1)，必須將函數程式碼上傳為 .zip 封存。如果 .zip 封存檔小於 50 MB，您可以從本機電腦上傳 .zip 封存檔。如果此檔案大於 50 MB，請將該檔案從 Amazon S3 儲存貯體上傳至函數。

**若要將函數程式碼上傳為 .zip 封存**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 在**程式碼來源**下，選擇**上傳自**。

1. 選擇 **.zip file** (.zip 檔案)，然後選擇 **Upload** (上傳)。

   1. 在檔案選擇器中，選取新的映像版本、選擇 **Open** (開啟)，然後選擇 **Save** (儲存)。

1. (替代步驟 4) 選擇 **Amazon S3 location** (Amazon S3 位置)。

   1. 在文字方塊中，輸入 .zip 封存檔的 S3 連結 URL，然後選擇 **Save** (儲存)。

## 變更執行階段
<a name="configuration-function-runtime"></a>

如果您將函數組態更新為使用新的執行階段，則可能需要更新函數程式碼，才能與新執行階段相容。如果您將函數組態更新為使用不同的執行時間，則**必須**提供與執行時間和架構相容的新函數程式碼。如需如何為函數程式碼建立部署套件的指示，請參閱函數所使用之執行時間的處理常式頁面。

Node.js 20、Python 3.12、Java 21、.NET 8、Ruby 3.3 和更新的基礎映像是以 Amazon Linux 2023 最小容器映像為基礎。舊版基礎映像使用 Amazon Linux 2。與 Amazon Linux 2 相比，AL2023 具有多項優點，包括更小的部署足跡和更新版本的程式庫，如 `glibc`。如需詳細資訊，請參閱 AWS 運算部落格上的[隆重介紹適用於 AWS Lambda的 Amazon Linux 2023 執行期](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)。

**變更執行階段**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 向下捲動到 **Runtime settings** (執行時間設定) 區段 (在程式碼編輯器下)。

1. 選擇**編輯**。

   1. 請在 **Runtime** (執行階段) 選取執行階段識別符。

   1. 對於 **Handler** (處理常式)，指定函數的處理常式。

   1. 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。

1. 選擇**儲存**。

## 變更架構
<a name="configuration-function-arch"></a>

在可以變更指令集架構之前，您需要確保函數的程式碼與目標架構相容。

如果您使用 Node.js、Python 或 Ruby，並在內嵌的編輯器中編輯您的函數程式碼，則現有的程式碼可能無需修改即可執行。

不過，如果您使用 .zip 封存檔部署套件來提供函數程式碼，則必須準備新的 .zip 封存檔，該封存檔會針對目標執行時間和指令集架構正確地進行編譯和建置。如需指示，請參閱函數執行時間的處理常式頁面。

**變更指令集架構**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 在 **Runtime settings** (執行時間設定) 中，選擇 **Edit** (編輯)。

1. 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。

1. 選擇**儲存**。

## 使用 Lambda API
<a name="configuration-function-api"></a>

若要建立及設定使用 .zip 封存檔的函數，請使用下列 API 操作：
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)

## 下載函式程式碼
<a name="configuration-function-download"></a>

您可以透過 Lambda 主控台下載函式程式碼 .zip 的目前未發布 (`$LATEST`) 版本。若要執行此操作，請先確定您具有下列 IAM 許可：
+ `iam:GetPolicy`
+ `iam:GetPolicyVersion`
+ `iam:GetRole`
+ `iam:GetRolePolicy`
+ `iam:ListAttachedRolePolicies`
+ `iam:ListRolePolicies`
+ `iam:ListRoles`

**若要下載函式程式碼 .zip**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要下載其函式程式碼 .zip 的函式。

1. 在**函式概觀**頁面中，點選**下載**按鈕，接著選擇**下載函式程式碼 .zip**。

   1. 或者，根據函數的組態，選擇**下載 AWS SAM 檔案**以產生和下載 SAM 範本。您也可以選擇**下載兩者**，同時下載 .zip 與 SAM 範本。

## CloudFormation
<a name="configuration-function-cloudformation"></a>

您可以使用 CloudFormation 建立使用 .zip 檔案封存的 Lambda 函數。在您的 CloudFormation 範本中，`AWS::Lambda::Function`資源會指定 Lambda 函數。如需 `AWS::Lambda::Function` 資源中的屬性說明，請參閱 *AWS CloudFormation 使用者指南*中的 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)。

在 `AWS::Lambda::Function` 資源中，設定下列屬性，以建立定義為 .zip 封存檔的函數：
+ AWS::Lambda::Function
  + PackageType - 設定為 `Zip`。
  + 程式碼 — 在 `S3Bucket` 和 `S3Key` 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。對於 Node.js 或 Python，您可以提供 Lambda 函數的內嵌原始碼。
  + 執行時間 — 設定執行時間值。
  + 架構 – 將架構值設定為 `arm64` 以使用 AWS Graviton2 處理器。依預設，架構值為 `x86_64`。

# 加密 Lambda .zip 部署套件
<a name="encrypt-zip-package"></a>

Lambda 一般使用 AWS KMS key為 .zip 部署套件和函數組態詳細資訊提供靜態伺服器端加密。預設情況下，Lambda 使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)。如果此預設行為符合您的工作流程，您不需要設定任何其他項目。 AWS 不會向您收取使用此金鑰的費用。

如果您願意，您可以改為提供 AWS KMS 客戶受管金鑰。您可以這樣做以控制 KMS 金鑰的輪換或滿足您的組織對管理 KMS 金鑰的請求。當您使用客戶受管的金鑰時，只有您帳戶中具有 KMS 金鑰存取權的使用者才能檢視或管理函數的程式碼或組態。

客戶受管金鑰會產生標準 AWS KMS 費用。如需詳細資訊，請參閱 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing/)。

## 建立客戶自管金鑰
<a name="create-key"></a>

 您可以使用 AWS 管理主控台或 AWS KMS APIs 來建立對稱客戶受管金鑰。

**建立對稱客戶受管金鑰**

請依照《AWS Key Management Service 開發人員指南》中的[建立對稱加密，建立對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)步驟執行。**

### 許可
<a name="enable-zip-permissions"></a>

**金鑰政策**

[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策，其中包含決定誰可以使用金鑰及其使用方式的陳述式。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[如何變更金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to)。

使用客戶受管金鑰來加密 .zip 部署套件時，Lambda 不會為金鑰新增[授權](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。相反地，您的 AWS KMS 金鑰政策必須允許 Lambda 代表您呼叫下列 AWS KMS API 操作：
+ [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

下列範例金鑰政策允許帳戶 111122223333 中的所有 Lambda 函數呼叫指定客戶受管金鑰的必要 AWS KMS 操作：

**Example AWS KMS 金鑰政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:*"
                }
            }
        }
    ]
}
```

如需有關[故障診斷金鑰存取](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam)的詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**。

**主體許可**

當您使用客戶受管金鑰來加密 .zip 部署套件時，只有可存取該金鑰的[主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html)才能存取 .zip 部署套件。例如，無法存取客戶受管金鑰的主體無法使用包含在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) 回應中的預先簽章 S3 URL 下載 .zip 套件。回應的 `Code` 區段中會傳回 `AccessDeniedException`。

**Example AWS KMS AccessDeniedException**  

```
{
    "Code": {
        "RepositoryType": "S3",
        "Error": {
            "ErrorCode": "AccessDeniedException",
            "Message": "KMS access is denied. Check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: User: arn:aws:sts::111122223333:assumed-role/LambdaTestRole/session is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:111122223333:key/key-id with an explicit deny in a resource-based policy"
        },
        "SourceKMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id"
    },
	...
```

如需 AWS KMS 金鑰許可的詳細資訊，請參閱 [的身分驗證和存取控制 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

## 將客戶受管金鑰用於 .zip 部署套件
<a name="enable-zip-custom-encryption"></a>

使用下列 API 參數來設定 .zip 部署套件的客戶受管金鑰：
+ [SourceKMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionCode.html#lambda-Type-FunctionCode-SourceKMSKeyArn)：加密來源 .zip 部署套件 (您上傳的檔案)。
+ [KMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-KMSKeyArn)：加密[環境變數](configuration-envvars-encryption.md)和 [Lambda SnapStart](snapstart.md) 快照。

指定 `SourceKMSKeyArn` 和 `KMSKeyArn` 時，Lambda 會使用 `KMSKeyArn` 金鑰來加密 Lambda 用來調用函數的解壓縮套件版本。當已指定 `SourceKMSKeyArn` 但未指定 `KMSKeyArn` 時，Lambda 會使用 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 來加密套件的解壓縮版本。

------
#### [ Lambda console ]

**若要在建立函數時新增客戶受管金鑰加密**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始撰寫) 或 **Container image** (容器映像)。

1. 在 **基本資訊** 下，請執行下列動作：

   1. 針對 **函數名稱**，輸入函數名稱。

   1. 對於**執行時間**，選擇函數要使用的語言版本。

1. 展開**進階設定**，然後選取**使用 AWS KMS 客戶受管金鑰啟用加密**。

1. 選擇客戶受管金鑰。

1. 選擇**建立函數**。

若要移除客戶受管金鑰加密，或使用不同的金鑰，必須再次上傳 .zip 部署套件。

**若要將客戶受管金鑰加密新增至現有函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 在**程式碼來源**窗格中選擇**上傳來源**。

1. 選擇 **.zip 檔案**或 **Amazon S3 位置**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/upload-zip.png)

1. 上傳檔案或輸入 Amazon S3 位置。

1. 選擇**使用 AWS KMS 客戶受管金鑰啟用加密**。

1. 選擇客戶受管金鑰。

1. 選擇**儲存**。

------
#### [ AWS CLI ]

**若要在建立函數時新增客戶受管金鑰加密**

在下列 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 範例中：
+ `--code`：指定 .zip 部署套件的本機路徑 (`ZipFile`) 和客戶受管金鑰來加密它 (`SourceKMSKeyArn`)。
+ `--kms-key-arn`：指定客戶受管金鑰，以加密環境變數和部署套件的解壓縮版本。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x \
  --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code ZipFile=fileb://myFunction.zip,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

在下列 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 範例中：
+ `--code`：指定 Amazon S3 儲存貯體 (`S3Bucket`、`S3Key`、`S3ObjectVersion`) 中 .zip 檔案的位置，以及用於加密檔案的客戶受管金鑰 ()`SourceKMSKeyArn`。
+ `--kms-key-arn`：指定客戶受管金鑰，以加密環境變數和部署套件的解壓縮版本。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

**若要將客戶受管金鑰加密新增至現有函數**

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中：
+ `--zip-file`：指定 .zip 部署套件的本機路徑。
+ `--source-kms-key-arn`：指定客戶受管金鑰，以加密部署套件的壓縮版本。Lambda 使用 AWS 擁有的金鑰來加密用於函式調用的解壓縮套件。如果您想要使用客戶受管金鑰來加密套件的解壓縮版本，請使用 `--kms-key-arn` 選項執行 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip \
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中：
+ `--s3-bucket`：指定 Amazon S3 儲存貯體中 .zip 檔案的位置。
+ `--s3-key`：指定部署套件的 Amazon S3 金鑰。
+ `--s3-object-version`：對於版本控制的物件，要使用的部署套件物件版本。
+ `--source-kms-key-arn`：指定客戶受管金鑰，以加密部署套件的壓縮版本。Lambda 使用 AWS 擁有的金鑰來加密用於函式調用的解壓縮套件。如果您想要使用客戶受管金鑰來加密套件的解壓縮版本，請使用 `--kms-key-arn` 選項執行 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。

```
aws lambda update-function-code \
  --function-name myFunction \
  --s3-bucket amzn-s3-demo-bucket \
  --s3-key myFileName.zip \
  --s3-object-version myObject Version
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

**若要從現有函數中移除客戶受管金鑰加密**

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中，`--zip-file`指定 .zip 部署套件的本機路徑。當您在沒有 `--source-kms-key-arn`選項的情況下執行此命令時，Lambda 會使用 AWS 擁有的金鑰來加密部署套件的壓縮版本。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip
```

------