

# 使用 .zip 文件存档部署 Rust Lambda 函数
<a name="rust-package"></a>

本页将介绍如何编译 Rust 函数，然后使用 [Cargo Lambda](https://www.cargo-lambda.info/guide/what-is-cargo-lambda.html) 将已编译的二进制文件部署到 AWS Lambda。此外，还会显示如何使用 AWS Command Line Interface 和 AWS Serverless Application Model CLI 部署已编译的二进制文件。

**Topics**
+ [先决条件](#rust-package-prerequisites)
+ [在 macOS、Windows 或 Linux 上构建 Rust 函数](#rust-package-build)
+ [使用 Cargo Lambda 部署 Rust 函数二进制文件](#rust-deploy-cargo)
+ [使用 Cargo Lambda 调用 Rust 函数](#rust-invoke-function)

## 先决条件
<a name="rust-package-prerequisites"></a>
+ [Rust](https://www.rust-lang.org/tools/install)
+ [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)

## 在 macOS、Windows 或 Linux 上构建 Rust 函数
<a name="rust-package-build"></a>

以下步骤将演示如何使用 Rust 为您的第一个 Lambda 函数创建项目，并使用 [Cargo Lambda](https://www.cargo-lambda.info/) 对其进行编译，作为 Cargo 命令行工具的第三方开源扩展程序，Cargo Lambda 可简化 Rust Lambda 函数的构建和部署过程。

1. 安装 [Cargo Lambda](https://www.cargo-lambda.info/guide/what-is-cargo-lambda.html)，这是 Cargo 命令行工具的第三方开源扩展程序，可简化 Rust Lambda 函数的构建和部署过程。

   ```
   cargo install cargo-lambda
   ```

   有关其他安装选项，请参阅 Cargo Lambda 文档中的[安装](https://www.cargo-lambda.info/guide/installation.html)。

1. 创建程序包结构。此命令可在 `src/main.rs` 中创建一些基本的函数代码。您可以使用此代码进行测试，也可以将其替换为您自己的代码。

   ```
   cargo lambda new my-function
   ```

1. 在程序包的根目录中，运行 [build](https://www.cargo-lambda.info/commands/build.html) 子命令以编译函数中的代码。

   ```
   cargo lambda build --release
   ```

   （可选）如果要在 Lambda 上使用 AWS Graviton2，请添加 `--arm64` 标志以针对 ARM CPU 编译代码。

   ```
   cargo lambda build --release --arm64
   ```

1. 在部署 Rust 函数之前，请在计算机上配置 AWS 凭证。

   ```
   aws configure
   ```

## 使用 Cargo Lambda 部署 Rust 函数二进制文件
<a name="rust-deploy-cargo"></a>

使用 [deploy](https://www.cargo-lambda.info/commands/deploy.html) 子命令将已编译的二进制文件部署到 Lambda。此命令可创建[执行角色](lambda-intro-execution-role.md)，然后创建 Lambda 函数。要指定现有的执行角色，请使用 [--iam-role 标志](https://www.cargo-lambda.info/commands/deploy.html#iam-roles)。

```
cargo lambda deploy my-function
```

### 使用 AWS CLI 部署 Rust 函数二进制文件
<a name="rust-deploy-aws-cli"></a>

您也可以使用 AWS CLI 部署二进制文件。

1. 使用 [build](https://www.cargo-lambda.info/commands/build.html) 子命令构建 .zip 部署包。

   ```
   cargo lambda build --release --output-format zip
   ```

1. 要将 .zip 包部署到 Lambda，请运行 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 命令。
   + 对于 `--runtime`，请指定 `provided.al2023`。这是[仅限操作系统的运行时](runtimes-provided.md)。仅限操作系统的运行时用于将编译的二进制文件和自定义运行时部署到 Lambda。
   + 对于 `--role`，指定[执行角色](lambda-intro-execution-role.md)的 ARN。

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

### 使用 AWS SAM CLI 部署 Rust 函数二进制文件
<a name="rust-deploy-sam-cli"></a>

您也可以使用 AWS SAM CLI 部署二进制文件。

1. 使用资源和属性定义创建 AWS SAM 模板。对于 `Runtime`，请指定 `provided.al2023`。这是[仅限操作系统的运行时](runtimes-provided.md)。仅限操作系统的运行时用于将编译的二进制文件和自定义运行时部署到 Lambda。

   有关使用 AWS SAM 部署 Lambda 函数的更多信息，请参阅《AWS Serverless Application Model 开发人员指南》**中的 [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)。  
**Example Rust 二进制文件的 SAM 资源和属性定义**  

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: SAM template for Rust binaries
   Resources:
     RustFunction:
       Type: AWS::Serverless::Function 
       Properties:
         CodeUri: target/lambda/my-function/
         Handler: rust.handler
         Runtime: provided.al2023
   Outputs:
     RustFunction:
       Description: "Lambda Function ARN"
       Value: !GetAtt RustFunction.Arn
   ```

1. 使用 [build](https://www.cargo-lambda.info/commands/build.html) 子命令编译函数。

   ```
   cargo lambda build --release
   ```

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

   ```
   sam deploy --guided
   ```

有关使用 AWS SAM CLI 构建 Rust 函数的更多信息，请参阅《AWS Serverless Application Model 开发人员指南》**中的[使用 Cargo Lambda 构建 Rust Lambda 函数](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/building-rust.html)。

## 使用 Cargo Lambda 调用 Rust 函数
<a name="rust-invoke-function"></a>

使用 [invoke](https://www.cargo-lambda.info/commands/invoke.html) 子命令，通过负载测试函数。

```
cargo lambda invoke --remote --data-ascii '{"command": "Hello world"}' my-function
```

### 使用 AWS CLI 调用 Rust 函数
<a name="rust-invoke-cli"></a>

您也可以使用 AWS CLI 调用函数。

```
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"command": "Hello world"}' /tmp/out.txt
```

如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [AWS CLI 支持的全局命令行选项](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。