

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

Lambda 始终为 .zip 部署包和带有 AWS KMS key的函数配置详细信息提供静态服务器端加密。默认情况下，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 API 创建对称的客户托管密钥。

**创建对称的客户托管密钥**：

请按照《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. 打开 Lamba 控制台的 [Functions page](https://console.aws.amazon.com/lambda/home#/functions)（函数页面）。

1. 选择 **Create function**（创建函数）。

1. 选择 **Author from scratch**（从头开始编写）或 **Container image**（容器映像）。

1. 在 **Basic information**（基本信息）中，执行以下操作：

   1. 对于 **Function name（函数名称）**，输入函数名称。

   1. 对于**Runtime**（运行时），请选择函数使用的语言版本。

1. 展开**高级设置**，然后选择**使用 AWS KMS 客户自主管理型密钥启用加密**。

1. 选择客户托管密钥。

1. 选择**创建函数**。

要删除客户自主管理型密钥加密或使用其他密钥，必须再次上传 .zip 部署包。

**向现有函数添加客户自主管理型密钥加密**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择一个函数的名称。

1. 在**代码源**窗格中，选择**上传自**。

1. 选择 **.zip 文件**或 **Amazon S3 位置**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/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`：指定 .zip 文件在 Amazon S3 存储桶（`S3Bucket`、`S3Key`、`S3ObjectVersion`）中的位置以及用于加密该文件的客户自主管理型密钥（`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`：指定 .zip 文件在 Amazon S3 存储桶中的位置。
+ `--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
```

------