

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

# 加密 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
```

------