

# 使用 .zip 文件归档部署 Go Lambda 函数
<a name="golang-package"></a>

您的 AWS Lambda 函数代码由脚本或编译的程序及其依赖项组成。您可以使用*部署包*将函数代码部署到 Lambda。Lambda 支持两种类型的部署包：容器镜像和 .zip 文件归档。

本页将介绍如何创建 .zip 文件作为 Go 运行时系统的部署包，然后使用 .zip 文件通过 AWS 管理控制台、AWS Command Line Interface（AWS CLI）和 AWS Serverless Application Model（AWS SAM）将函数代码部署到 AWS Lambda。

请注意，Lambda 使用 POSIX 文件权限，因此在创建 .zip 文件归档之前，您可能需要[为部署包文件夹设置权限](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/)。

**Topics**
+ [在 macOS 和 Linux 上创建 .zip 文件](#golang-package-mac-linux)
+ [在 Windows 上创建 .zip 文件](#golang-package-windows)
+ [使用 .zip 文件创建和更新 Go Lambda 函数](#golang-package-create-function)

## 在 macOS 和 Linux 上创建 .zip 文件
<a name="golang-package-mac-linux"></a>

以下步骤显示如何使用 `go build` 命令编译可执行文件并为 Lambda 创建 .zip 文件部署包。在编译代码之前，请确保您已从 GitHub 安装 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 程序包。此模块提供运行时系统接口的实现，用于管理 Lambda 与函数代码之间的交互。要下载此库，请运行以下命令。

```
go get github.com/aws/aws-lambda-go/lambda
```

如果您的函数使用 适用于 Go 的 AWS SDK，请下载标准的开发工具包模块集以及应用程序所需的任何 AWS 服务 API 客户端。要了解如何安装适用于 Go 的开发工具包，请参阅 [适用于 Go 的 AWS SDK V2 入门](https://github.com/aws/aws-sdk-go-v2?tab=readme-ov-file#getting-started)。

### 使用提供的运行时系列
<a name="golang-package-mac-linux-al2"></a>

Go 的实施方式与其他托管式运行时系统不同。由于 Go 本机编译为可执行的二进制文件，因此它不需要专用的语言运行时。使用[仅限操作系统的运行时](runtimes-provided.md)（`provided` 运行时系列）将 Go 函数部署到 Lambda。

**创建 .zip 部署包（macOS/Linux）**

1. 在包含应用程序的 `main.go` 文件的项目目录中，编译可执行文件。请注意以下几点：
   + 可执行文件必须命名为 `bootstrap`。有关更多信息，请参阅 [处理程序命名约定](golang-handler.md#golang-handler-naming)。
   + 设置目标[指令集架构](foundation-arch.md)。仅 OS 运行时支持 arm64 和 x86\$164。
   + 您可以使用可选的 `lambda.norpc` 标签排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 库的远程过程调用（RPC）组件。只有在使用已弃用的 Go 1.x 运行时系统时才需要 RPC 组件。排除 RPC 会减小部署包的大小。

   对于 arm64 架构：

   ```
   GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go
   ```

   对于 x86\$164 架构：

   ```
   GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
   ```

1. （可选）您可能需要使用 Linux 上的 `CGO_ENABLED=0` 编译程序包：

   ```
   GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap -tags lambda.norpc main.go
   ```

   此命令为标准 C 库 (`libc`) 版本创建稳定的二进制程序包，这在 Lambda 和其他设备上可能有所不同。

1. 通过将可执行文件打包为 .zip 文件来创建部署程序包。

   ```
   zip myFunction.zip bootstrap
   ```
**注意**  
`bootstrap` 文件必须位于 .zip 文件的根目录中。

1. 创建函数。请注意以下几点：
   + 二进制文件必须命名为 `bootstrap`，但处理程序名称可以是任何名称。有关更多信息，请参阅 [处理程序命名约定](golang-handler.md#golang-handler-naming)。
   + 仅在使用 arm64 时，必须使用 `--architectures` 选项。默认值为 x86\$164。
   + 对于 `--role`，指定[执行角色](lambda-intro-execution-role.md)的 Amazon 资源名称（ARN）。

   ```
   aws lambda create-function --function-name myFunction \
   --runtime provided.al2023 --handler bootstrap \
   --architectures arm64 \
   --role arn:aws:iam::111122223333:role/lambda-ex \
   --zip-file fileb://myFunction.zip
   ```

## 在 Windows 上创建 .zip 文件
<a name="golang-package-windows"></a>

以下步骤演示如何从 GitHub 下载用于 Windows 的 [build-lambda-zip](https://github.com/aws/aws-lambda-go/tree/main/cmd/build-lambda-zip) 工具、如何编译可执行文件，以及如何创建 .zip 部署包。

**注意**  
如果您尚未完成此操作，则必须安装 [git](https://git-scm.com/)，然后将 `git` 可执行文件添加到您的 Windows `%PATH%` 环境变量。

在编译代码之前，请确保您已从 GitHub 安装 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 库。要下载此库，请运行以下命令。

```
go get github.com/aws/aws-lambda-go/lambda
```

如果您的函数使用 适用于 Go 的 AWS SDK，请下载标准的开发工具包模块集以及应用程序所需的任何 AWS 服务 API 客户端。要了解如何安装适用于 Go 的开发工具包，请参阅 [适用于 Go 的 AWS SDK V2 入门](https://aws.github.io/aws-sdk-go-v2/docs/getting-started/)。

### 使用提供的运行时系列
<a name="golang-package-windows-al2"></a>

Go 的实施方式与其他托管式运行时系统不同。由于 Go 本机编译为可执行的二进制文件，因此它不需要专用的语言运行时。使用[仅限操作系统的运行时](runtimes-provided.md)（`provided` 运行时系列）将 Go 函数部署到 Lambda。

**创建 .zip 部署包（Windows）**

1. 从 GitHub 下载 **build-lambda-zip** 工具。

   ```
   go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
   ```

1. 使用来自 `GOPATH` 的工具创建 .zip 文件。如果您有 Go 的默认安装，则该工具通常在 `%USERPROFILE%\Go\bin` 中。否则，请导航到安装 Go 运行时的位置，然后执行以下任一操作：

------
#### [ cmd.exe ]

   在 cmd.exe 中，根据目标[指令集架构](foundation-arch.md)运行以下任一命令。仅 OS 运行时支持 arm64 和 x86\$164。

   您可以使用可选的 `lambda.norpc` 标签排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 库的远程过程调用（RPC）组件。只有在使用已弃用的 Go 1.x 运行时系统时才需要 RPC 组件。排除 RPC 会减小部署包的大小。

**Example – 对于 x86\$164 架构**  

   ```
   set GOOS=linux
   set GOARCH=amd64
   set CGO_ENABLED=0
   go build -tags lambda.norpc -o bootstrap main.go
   %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

**Example – 对于 arm64 架构**  

   ```
   set GOOS=linux
   set GOARCH=arm64
   set CGO_ENABLED=0
   go build -tags lambda.norpc -o bootstrap main.go
   %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

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

   在 PowerShell 中，根据目标[指令集架构](foundation-arch.md)运行以下任一命令。仅 OS 运行时支持 arm64 和 x86\$164。

   您可以使用可选的 `lambda.norpc` 标签排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 库的远程过程调用（RPC）组件。只有在使用已弃用的 Go 1.x 运行时系统时才需要 RPC 组件。排除 RPC 会减小部署包的大小。

   对于 x86\$164 架构：

   ```
   $env:GOOS = "linux"
   $env:GOARCH = "amd64"
   $env:CGO_ENABLED = "0"
   go build -tags lambda.norpc -o bootstrap main.go
   ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

   对于 arm64 架构：

   ```
   $env:GOOS = "linux"
   $env:GOARCH = "arm64"
   $env:CGO_ENABLED = "0"
   go build -tags lambda.norpc -o bootstrap main.go
   ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

------

1. 创建函数。请注意以下几点：
   + 二进制文件必须命名为 `bootstrap`，但处理程序名称可以是任何名称。有关更多信息，请参阅 [处理程序命名约定](golang-handler.md#golang-handler-naming)。
   + 仅在使用 arm64 时，必须使用 `--architectures` 选项。默认值为 x86\$164。
   + 对于 `--role`，指定[执行角色](lambda-intro-execution-role.md)的 Amazon 资源名称（ARN）。

   ```
   aws lambda create-function --function-name myFunction \
   --runtime provided.al2023 --handler bootstrap \
   --architectures arm64 \
   --role arn:aws:iam::111122223333:role/lambda-ex \
   --zip-file fileb://myFunction.zip
   ```

## 使用 .zip 文件创建和更新 Go Lambda 函数
<a name="golang-package-create-function"></a>

 创建 .zip 部署包后，您可以用其创建新的 Lambda 函数或更新现有的 Lambda 函数。您可以使用 Lambda 控制台、AWS Command Line Interface 和 Lambda API 部署 .zip 程序包。您也可以使用 AWS Serverless Application Model（AWS SAM）和 CloudFormation 创建和更新 Lambda 函数。

Lambda 的 .zip 部署包的最大大小为 250MB（已解压缩）。请注意，此限制适用于您上传的所有文件（包括任何 Lambda 层）的组合大小。

Lambda 运行时需要权限才能读取部署包中的文件。在 Linux 权限八进制表示法中，Lambda 对于不可执行文件（rw-r--r--）需要 644 个权限，对于目录和可执行文件需要 755 个权限（rwxr-xr-x）。

在 Linux 和 MacOS 中，使用 `chmod` 命令更改部署包中文件和目录的文件权限。例如，要为不可执行文件提供正确的权限，请运行以下命令。

```
chmod 644 <filepath>
```

要在 Windows 中更改文件权限，请参阅 Microsoft Windows 文档中的 [Set, View, Change, or Remove Permissions on an Object](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10))。

**注意**  
如果您不向 Lambda 授予访问部署包中目录所需的权限，Lambda 会将这些目录的权限设置为 755（rwxr-xr-x）。

### 使用控制台通过 .zip 文件创建和更新函数
<a name="golang-package-create-console"></a>

 要创建新函数，必须先在控制台中创建该函数，然后上传您的 .zip 归档。要更新现有函数，请打开函数页面，然后按照相同的步骤添加更新的 .zip 文件。

 如果您的 .zip 文件小于 50MB，则可以通过直接从本地计算机上传该文件来创建或更新函数。对于大于 50MB 的 .zip 文件，必须首先将您的程序包上传到 Amazon S3 存储桶。有关如何使用 AWS 管理控制台 将文件上传到 Amazon S3 存储桶的说明，请参阅 [Amazon S3 入门](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)。要使用 AWS CLI 上传文件，请参阅《AWS CLI 用户指南**》中的[移动对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

**注意**  
您无法将现有容器映像函数转换为使用 .zip 归档。您必须创建新函数。

**创建新函数（控制台）**

1. 打开 Lambda 控制台的[“函数”页面](https://console.aws.amazon.com/lambda/home#/functions)，然后选择**创建函数**。

1. 选择**从头开始创作**。

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

   1. 对于**函数名称**，输入函数的名称。

   1. 对于 **Runtime (运行时)**，请选择 `provided.al2023`。

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

1. 选择**创建函数**。Lambda 使用您选择的运行时系统创建基本“Hello world”函数。

**从本地计算机上传 .zip 归档（控制台）**

1. 在 Lambda 控制台的[“函数”页面](https://console.aws.amazon.com/lambda/home#/functions)中，选择要为其上传 .zip 文件的函数。

1. 选择**代码**选项卡。

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

1. 选择 **.zip 文件**。

1. 要上传 .zip 文件，请执行以下操作：

   1. 选择**上传**，然后在文件选择器中选择您的 .zip 文件。

   1. 选择**打开**。

   1. 选择**保存**。

**从 Amazon S3 存储桶上传 .zip 归档（控制台）**

1. 在 Lambda 控制台的[“函数”页面](https://console.aws.amazon.com/lambda/home#/functions)中，选择要为其上传新 .zip 文件的函数。

1. 选择**代码**选项卡。

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

1. 选择 **Amazon S3 位置**。

1. 粘贴 .zip 文件的 Amazon S3 链接 URL，然后选择**保存**。

### 使用 AWS CLI 通过 .zip 文件创建和更新函数
<a name="golang-package-create-cli"></a>

 您可以使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 创建新函数或使用 .zip 文件更新现有函数。使用 [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 和 [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 命令部署 .zip 程序包。如果您的 .zip 文件小于 50MB，则可以从本地生成计算机上的文件位置上传 .zip 程序包。对于较大的文件，必须从 Amazon S3 存储桶上传 .zip 程序包。有关如何使用 AWS CLI 将文件上传到 Amazon S3 存储桶的说明，请参阅《AWS CLI 用户指南**》中的[移动对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

**注意**  
如果您使用 AWS CLI 从 Amazon S3 存储桶上传 .zip 文件，则该存储桶必须与您的函数位于同一个 AWS 区域 中。

 要通过 AWS CLI 使用 .zip 文件创建新函数，则必须指定以下内容：
+ 函数的名称 (`--function-name`)
+ 函数的运行时系统 (`--runtime`)
+ 函数的[执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) (`--role`) 的 Amazon 资源名称（ARN）
+ 函数代码 (`--handler`) 中处理程序方法的名称

 还必须指定 .zip 文件的位置。如果 .zip 文件位于本地生成计算机上的文件夹中，请使用 `--zip-file` 选项指定文件路径，如以下示例命令所示。

```
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 要指定 .zip 文件在 Amazon S3 存储桶中的位置，请使用 `--code` 选项，如以下示例命令所示。您只需对版本控制对象使用 `S3ObjectVersion` 参数。

```
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 要使用 CLI 更新现有函数，请使用 `--function-name` 参数指定函数的名称。您还必须指定要用于更新函数代码的 .zip 文件的位置。如果 .zip 文件位于本地生成计算机上的文件夹中，请使用 `--zip-file` 选项指定文件路径，如以下示例命令所示。

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

 要指定 .zip 文件在 Amazon S3 存储桶中的位置，请使用 `--s3-bucket` 和 `--s3-key` 选项，如以下示例命令所示。您只需对版本控制对象使用 `--s3-object-version` 参数。

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

### 使用 Lambda API 通过 .zip 文件创建和更新函数
<a name="golang-package-create-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)

### 使用 AWS SAM 通过 .zip 文件创建和更新函数
<a name="golang-package-create-sam"></a>

 AWS Serverless Application Model（AWS SAM）是一个工具包，可帮助简化在 AWS 上构建和运行无服务器应用程序的过程。您可以在 YAML 或 JSON 模板中为应用程序定义资源，并使用 AWS SAM 命令行界面（AWS SAM CLI）构建、打包和部署应用程序。当您通过 AWS SAM 模板构建 Lambda 函数时，AWS SAM 会使用您的函数代码和您指定的任何依赖项自动创建 .zip 部署包或容器映像。要了解有关使用 AWS SAM 构建和部署 Lambda 函数的更多信息，请参阅《AWS Serverless Application Model 开发人员指南**》中的 [AWS SAM 入门](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)。

您可以使用 AWS SAM 创建使用现有 .zip 文件归档的 Lambda 函数。要使用 AWS SAM 创建 Lambda 函数，您可以将 .zip 文件保存在 Amazon S3 存储桶或生成计算机上的本地文件夹中。有关如何使用 AWS CLI 将文件上传到 Amazon S3 存储桶的说明，请参阅《AWS CLI 用户指南**》中的[移动对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

 在 AWS SAM 模板中，`AWS::Serverless::Function` 资源将指定 Lambda 函数。在此资源中，设置以下属性以创建使用 .zip 文件归档的函数：
+ `PackageType` – 设置为 `Zip`
+ `CodeUri` – 设置为函数代码的 Amazon S3 URI、本地文件夹的路径或 [FunctionCode](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functioncode.html) 对象
+ `Runtime` – 设置为您选择的运行时系统

 使用 AWS SAM，如果 .zip 文件大于 50MB，则不需要先将其上传到 Amazon S3 存储桶。AWS SAM 可以从本地生成计算机上的某个位置上传最大允许大小为 250MB（已解压缩）的 .zip 程序包。

 要了解有关在 AWS SAM 中使用 .zip 文件部署函数的更多信息，请参阅《AWS SAM 开发人员指南**》中的 [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)。

**示例：使用 AWS SAM，通过 provided.al2023 构建 Go 函数**

1. 创建具有以下属性的 AWS SAM 模板：
   + **BuildMethod**：为应用程序指定编译器。使用 `go1.x`。
   + **Runtime**：使用 `provided.al2023`。
   + **CodeUri**：输入代码路径。
   + **Architectures**：对于 arm64 架构，使用 `[arm64]`。对于 x86\$164 指令集架构，使用 `[amd64]` 或删除 `Architectures` 属性。  
**Example template.yaml**  

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: 'AWS::Serverless-2016-10-31'
   Resources:
     HelloWorldFunction:
       Type: AWS::Serverless::Function
       Metadata:
         BuildMethod: go1.x
       Properties:
         CodeUri: hello-world/ # folder where your main program resides
         Handler: bootstrap
         Runtime: provided.al2023
         Architectures: [arm64]
   ```

1. 使用 [sam build](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html) 命令编译可执行文件。

   ```
   sam build
   ```

1. 使用 [sam deploy](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html) 命令将函数部署到 Lambda。

   ```
   sam deploy --guided
   ```

### 使用 CloudFormation 通过 .zip 文件创建和更新函数
<a name="golang-package-create-cfn"></a>

 您可以使用 CloudFormation 创建使用 .zip 文件归档的 Lambda 函数。要从 .zip 文件创建 Lambda 函数，必须先将您的文件上传到 Amazon S3 存储桶。有关如何使用 AWS CLI 将文件上传到 Amazon S3 存储桶的说明，请参阅《AWS CLI 用户指南**》中的[移动对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

在 CloudFormation 模板中，`AWS::Lambda::Function` 资源将指定 Lambda 函数。在此资源中，设置以下属性以创建使用 .zip 文件归档的函数：
+ `PackageType` – 设置为 `Zip`
+ `Code` – 在 `S3Bucket` 和 `S3Key` 字段中输入 Amazon S3 存储桶名称和 .zip 文件名。
+ `Runtime` – 设置为您选择的运行时系统

 CloudFormation 生成的 .zip 文件不能超过 4MB。要了解有关在 CloudFormation 中使用 .zip 文件部署函数的更多信息，请参阅《CloudFormation 用户指南**》中的 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)。