

# 使用 Visual Studio Code 远程调试 Lambda 函数
<a name="debugging"></a>

使用 [AWS Toolkit for Visual Studio Code](https://aws.amazon.com/visualstudiocode/) 中的远程调试功能，您可以直接调试在 AWS 云中运行的 Lambda 函数。这在调查难以在本地复现的问题或仅凭日志无法诊断的问题时非常有用。

通过远程调试，您可以：
+ 在 Lambda 函数代码中设置断点。
+ 实时地逐步执行代码。
+ 运行时检查变量和状态。
+ 调试部署到 AWS 的 Lambda 函数，包括 VPC 中的函数或拥有特定 IAM 权限的函数。

## 支持的运行时
<a name="debugging-runtimes"></a>

以下运行时支持远程调试：
+ Python (AL2023)
+ Java
+ JavaScript/Node.js (AL2023)

**注意**  
x86\$164 和 arm64 架构都支持远程调试。

## 安全和远程调试
<a name="debugging-security"></a>

远程调试在现有的 Lambda 安全边界内运行。用户可以使用 `UpdateFunctionConfiguration` 权限将层附加到某个函数，该权限已具备访问函数环境变量和配置的能力。远程调试不会超出这些现有权限。相反，远程调试通过安全隧道和自动会话管理来增强安全控制。此外，远程调试完全是一项由客户控制的功能，它需要显式权限和操作：
+ **IoT 安全隧道的创建**：AWS Toolkit 必须创建 IoT 安全隧道，这只有在获得用户显式权限的情况下才能使用 `iot:OpenTunnel` 来创建。
+ **调试层附加和令牌管理**：调试过程通过以下控制措施保持安全性：
  + 调试层必须附加到 Lambda 函数，这一过程需要如下权限：`lambda:UpdateFunctionConfiguration` 和 `lambda:GetLayerVersion`。
  + 在每次调试会话之前，必须在函数环境变量中更新安全令牌（通过 `iot:OpenTunnel` 生成），这也需要 `lambda:UpdateFunctionConfiguration` 权限。
  + 为安全起见，该令牌会自动轮换，调试层将在每次调试会话结束时自动移除，且不能重复使用。

**注意**  
x86\$164 和 arm64 架构都支持远程调试。

## 先决条件
<a name="debugging-prerequisites"></a>

在开始远程调试之前，请您确保已拥有以下各项：

1. 部署到 AWS 账户的 Lambda 函数。

1. AWS Toolkit for Visual Studio Code。有关安装说明，请参阅[设置 AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html)。

1. 您安装的 AWS Toolkit 版本为 **3.69.0** 或更高版本。

1. AWS Toolkit for Visual Studio Code 中配置的凭证 AWS。有关更多信息，请参阅 [身份验证和访问控制](foundation-iac-local-development.md#lambda-functions-vscode-authentication-and-access-control)。

## 远程调试 Lambda 函数
<a name="debugging-procedure"></a>

按照以下步骤启动远程调试会话：

1. 通过选择左侧栏中的 AWS 图标，从而在 VS Code 中打开 AWS Explorer。

1. 展开 Lambda 部分以查看函数。

1. 右键单击想要调试的函数。

1. 从上下文菜单中，选择**远程调用**。

1. 在打开的调用窗口中，选中**启用调试**复选框。

1. 单击**调用**以启动远程调试会话。

**注意**  
Lambda 函数对函数代码和所有附加层的组合限制为 250MB。远程调试层会使函数的大小增大约 40MB。

当执行以下操作时，远程调试会话随之结束：
+ 从“远程调用配置”屏幕中选择**删除调试设置**。
+ 在 VS Code 调试控件中选择断开连接的图标。
+ 在 VS Code 编辑器中选择处理程序文件。

**注意**  
自上次调用后，调试层将在 60 秒不活动后会自动移除。

## 禁用远程调试
<a name="debugging-disable"></a>

禁用此功能有三种方法：
+ **拒绝函数更新**：将 `lambda:UpdateFunctionConfiguration` 设置为 `deny`。
+ **限制 IoT 权限**：拒绝 IoT 相关权限
+ **屏蔽调试层**：拒绝以下 ARN 的 `lambda:GetLayerVersion`：
  + `arn:aws:lambda:*:*:layer:LDKLayerX86:*`
  + `arn:aws:lambda:*:*:layer:LDKLayerArm64:*`
**注意**  
禁用此功能可防止在函数配置更新期间加入调试层。

## 其他信息
<a name="debugging-related-info"></a>

有关在 VS Code 中使用 Lambda 的更多信息，请参阅[使用 VS Code 在本地开发 Lambda 函数](foundation-iac-local-development.md)。

有关故障排除、高级使用案例和区域可用性的详细说明，请参阅《AWS Toolkit for Visual Studio Code 用户指南》中的[远程调试 Lambda 函数](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/lambda-remote-debug.html)。