

# 将 Lambda 函数部署为 .zip 文件归档
<a name="configuration-function-zip"></a>

创建 Lambda 函数时，您可将函数代码打包到部署程序包中。Lambda 支持两种类型的部署程序包：容器镜像和 .zip 文件归档。创建函数的工作流取决于部署包类型。使用 [使用容器映像创建 Lambda 函数](images-create.md) 控制台创建定义为容器镜像的函数。

您可使用 Lambda 控制台和 Lambda API 创建定义为 .zip 文件归档的 Lambda 函数。此外，您还可上载更新的 .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 函数时，请选择代码模板、语言版本及函数的执行角色。您可以在 Lambda 创建函数后添加函数代码。

**创建函数**

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

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

1. 选择 **Author from scratch**（从头开始创作）或者 **Use a blueprint**（使用蓝图）创建函数。

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

   1. 对于 **Function name**（函数名称），输入函数名称。函数名称的长度限制为 64 个字符。

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

   1. （可选）对于**架构**，选择要用于函数的指令集架构。默认架构为 x86\$164。为您的函数构建部署包时，请确保它与此[指令集架构](foundation-arch.md)兼容。

1. （可选）在 **Permissions**（权限）下，展开 **Change default execution role**（更改默认执行角色）。您可以使用现有角色，也可以创建一个**执行角色**。

1. （可选）展开 **Advanced settings**（高级设置）。您可以为函数选择**代码签名配置**。您还可以为要访问的函数配置 (Amazon VPC)。

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

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\$1 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 文件归档。如果文件大于 50MB，请将文件从 Simple Storage Service (Amazon S3) 存储桶上载到函数。

**将函数代码以 .zip 归档上载**

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

1. 选择要更新的函数，然后选择 **Code**（代码）选项卡。

1. 在 **Code source**（代码源）下，选择 **Upload from**（上载自）。

1. 选择 **.zip file** (.zip 文件)，然后选择 **Upload file** (上载文件)。

   1. 在文件选择器中，选择新映像版本，然后依次选择 **Open** (打开)、**Save** (保存)。

1. （步骤 4 的替代方案）选择 **Amazon S3 location**（Simple Storage Service (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. 打开 Lamba 控制台的 [Functions page](https://console.aws.amazon.com/lambda/home#/functions)（函数页面）。

1. 选择要更新的函数，然后选择 **Code**（代码）选项卡。

1. 向下滚动至位于代码编辑器下方的 **Runtime settings**（运行时设置）部分。

1. 选择**编辑**。

   1. 对于 **Runtime**（运行时），请选择运行时标识符。

   1. 对于 **Handler**（处理程序），请为您的函数指定文件名和处理程序。

   1. 对于**架构**，选择要用于您的函数的指令集架构。

1. 选择**保存**。

## 更改架构
<a name="configuration-function-arch"></a>

在更改指令集架构之前，您需要确保函数的代码与目标架构兼容。

如果您使用 Node.js、Python 或 Ruby 并在嵌入式编辑器中编辑函数代码，则现有代码可以在不修改的情况下运行。

但是，如果您使用 .zip 文件归档部署包提供函数代码，则必须准备一个新的 .zip 文件归档，针对目标运行时和指令集架构正确编译和构建此归档。有关说明，请参阅函数运行时的处理程序页面。

**更改指令集架构**

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

1. 选择要更新的函数，然后选择 **Code**（代码）选项卡。

1. 在 **Runtime settings**（运行时设置）中，选择 **Edit**（编辑）。

1. 对于**架构**，选择要用于您的函数的指令集架构。

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. 打开 Lamba 控制台的[函数](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 始终为 .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
```

------