

 AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用这项服务。[了解详情](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS SAM 使用 AWS 工具包
<a name="serverless-apps-toolkit"></a>

该 AWS 工具包为[无服务器应用程序](https://aws.amazon.com/serverless/)提供支持。使用 AWS Toolkit，您可以创建包含[AWS Lambda](https://aws.amazon.com/lambda/)函数的无服务器应用程序，然后将这些应用程序部署到 AWS CloudFormation 堆栈中。

## 创建无服务器应用程序
<a name="sam-create"></a>

此示例说明如何使用 AWS Toolkit 创建无服务器应用程序。有关如何运行和调试无服务器应用程序的信息,请参阅[运行和调试无服务器应用程序](#sam-run-debug)。

创建无服务器应用程序的必要先决条件包括 **AWS SAM CLI** 和 **AWS CLI**。这些都包含在 AWS Cloud9。如果 AWS SAM CLI 未安装或已过期，则可能需要运行安装或升级。有关如何安装 AWS SAM CLI 的说明，请参阅[安装 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html#install-sam-cli-instructions)；有关如何升级 AWS SAM CLI 的说明，请参阅[升级 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)。

### 使用 Toolkit 创建无服务器应用程序 AWS
<a name="create-serverless-app"></a>

此示例说明如何使用 [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) 使用 AWS Toolkit 创建无服务器应用程序。

1. 在 **AWS Explorer** 中，打开 **Lambda** 节点的上下文（右键单击）菜单，然后选择 **Create Lambda SAM Application**（创建 Lambda SAM 应用程序）。
**注意**  
或者，您也可以单击 **AWS: Explorer** 标题中的菜单图标，然后选择 **Create Lambda SAM Application**（创建 Lambda SAM 应用程序）。

1. 选择 SAM 应用程序的运行时。对于此示例，请选择 **nodejs12.x**。
**注意**  
如果您选择一个带有“(Image)”的运行时，则您的应用程序是 `Image` 型软件包。如果您选择一个不带有“(Image)”的运行时，则您的应用程序是 `Zip` 型。有关 `Image` 和 `Zip` 软件包类型差异的更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 部署软件包](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。

1. 为您的无服务器应用程序选择以下模板之一：
   + **AWS SAM Hello World**：一个带有 Lambda 函数的基本模板，可返回经典的 “Hello World” 消息。
   + **AWS Step Fun** ctions 示例应用程序：运行股票交易工作流程的示例应用程序。Step Functions 编排所涉及 Lambda 函数的交互。

1. 为新项目选择一个位置。如果有工作区文件夹可用，您可以选择现有的工作区文件夹。否则，请浏览其他文件夹。如果您选择 **Select a different folder**（选择其他文件夹），将显示一个对话框，允许您选择文件夹位置。

1. 输入新应用程序的名称。对于本示例，请使用 `my-sam-app-nodejs`。**按 Enter** 键后， AWS 工具包会花一些时间来创建项目。

创建项目后，您可以在环境窗口中查看应用程序的文件。在**各区服务浏览器**窗口的列表中找到该文件夹。

![\[屏幕截图显示了 SAM 应用程序的可用运行时。\]](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/images/sam-create-app-explorer.png)


## 运行和调试无服务器应用程序
<a name="sam-run-debug"></a>

您可以使用 AWS Toolkit 配置如何调试无服务器应用程序并在开发环境中本地运行它们。您可以调试由 AWS Serverless Application Model (AWS SAM) 模板定义的无服务器应用程序。此模板使用简单的 YAML 语法来描述构成无服务器应用程序的资源 APIs，例如函数、数据库和事件源映射。

要详细了解 AWS SAM 模板，请参阅《*AWS Serverless Application Model 开发者指南》中的[AWS SAM 模板剖析](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html)。*

或者，您可以快速调试尚未提交到 SAM 模板的无服务器应用程序。

您开始配置调试行为，方法是使用内联操作来识别符合条件的 AWS Lambda 函数。要使用 SAM 模板定义的基础设施，请在相关 YAML 格式的文件中使用内联操作。要在不使用模板的情况下直接测试函数，请使用应用程序文件中 Lambda 处理程序的上下文感知链接。

**注意**  
在此示例中，我们正在调试一个使用 JavaScript. 但是，您可以将 AWS Toolkit 中提供的调试功能与以下语言和运行时一起使用：  
JavaScript — Node.js 10。 *x*、12。 *x*、14。 *x*
Python — 3.7、3.8、3.9、3.10（Python 2.7 和 3.6 无服务器应用程序可以运行，但不能由工具包调试。） AWS 
您的语言选择还会影响上下文感知链接指示符合条件的 Lambda 处理程序的方式。有关更多信息，请参阅 [直接从代码运行和调试无服务器函数](#run-debug-no-template)。

### 使用 SAM 模板运行和调试无服务器应用程序
<a name="sam-run-debug-template"></a>

对于使用 SAM 模板运行和调试的应用程序，YAML 格式的文件描述了应用程序的行为及其使用的资源。如果您使用 AWS Toolkit 创建无服务器应用程序，`template.yaml`则会自动为您的项目生成一个名为的文件。

在此步骤中，使用在 [创建无服务器应用程序](#sam-create) 中创建的示例应用程序。

### 使用 SAM 模板运行和调试无服务器应用程序


1. 要查看构成无服务器应用程序的应用程序文件，请转到 **Environment（环境）**窗口中。

1. 在应用程序文件夹（例如 *my-sample-app*）中，打开该`template.yaml`文件。

1. 对于 `template.yaml`，选择 **Edit Launch Configuration**（编辑启动配置）。

   新编辑器将显示 `launch.json` 文件，该文件提供具有默认属性的调试配置。

1. <a name="properties"></a>编辑或确认以下配置属性的值：
   + `"name"` – 输入一个易于阅读的名称，以显示在 **Run**（运行）视图中的 **Configuration**（配置）下拉字段中。
   + `"target"` – 确保该值为 `"template"`。这样，SAM 模板便成为调试会话的入口点。
   + `"templatePath"` – 输入 `template.yaml` 文件的相对路径或绝对路径。
   + `"logicalId"` – 确保名称与 SAM 模板的 **Resource**（资源）部分中指定的名称一致。在这种情况下，它是类型 `AWS::Serverless::Function` 的 `HelloWorldFunction`。

   有关 `launch.json` 文件中这些以及其他条目的更多信息，请参阅 [调试无服务器应用程序的配置选项](sam-debug-config-ref.md)。

1. 如果您对调试配置满意，请保存 `launch.json`。然后选择 **RUN**（运行）旁边的绿色“play”（播放）按钮以启动调试。
**注意**  
如果 SAM 应用程序无法运行，请检查 **Output（输出）**窗口以查看错误是否因 Docker 镜像未构建引起。您可能需要释放环境中的磁盘空间。  
有关更多信息，请参阅 [由于 AWS Cloud9 环境没有足够的磁盘空间，因此在 AWS Toolkit 中本地运行 SAM 应用程序时出错](troubleshooting.md#troubleshooting-dockerimage-toolkit)。

   当调试会话启动时，**DEBUG CONSOLE**（调试控制台）面板显示调试输出，并显示 Lambda 函数返回的任何值。调试 SAM 应用程序时，选择 **AWS Toolkit** 作为 **Output**（输出）面板中的 **Output**（输出）通道。<a name="docker-problem"></a>
**注意**  
对于 Windows 用户，如果在此过程中遇到 Docker 安装错误，则可能需要在 **Docker Settings**（Dcoker 设置）中刷新共享驱动器的凭证。Docker 安装错误类似于以下内容。  

   ```
   Fetching lambci/lambda:nodejs10.x Docker container image......
   2019-07-12 13:36:58 Mounting C:\Users\<username>\AppData\Local\Temp\ ... as /var/task:ro,delegated inside runtime container
   Traceback (most recent call last):
   ...requests.exceptions.HTTPError: 500 Server Error: Internal Server Error ...
   ```

### 直接从代码运行和调试无服务器函数
<a name="run-debug-no-template"></a>

测试 AWS SAM 应用程序时，您可以选择仅运行和调试 Lambda 函数。排除 SAM 模板定义的其他资源。此方法涉及使用内联操作来识别源代码中可以直接调用的 Lambda 函数处理程序。

上下文感知链接检测到的 Lambda 处理程序取决于您为应用程序使用的语言和运行时。


|  Language/runtime  | 上下文感知链接识别 Lambda 函数的条件 | 
| --- | --- | 
|  JavaScript （Node.js 10.x、12.x 和 14.x）  |  该函数具有以下功能：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/serverless-apps-toolkit.html)  | 
|  Python（3.7、3.8、3.9 和 3.10）  |  该函数具有以下功能：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/serverless-apps-toolkit.html)  | 

### 直接从应用程序代码运行和调试无服务器应用程序




1. 要查看无服务器应用程序文件，请通过选择编辑器旁边的文件夹图标导航到应用程序文件夹。

1. 在应用程序文件夹（例如 *my-sample-app*）中，展开函数文件夹（在本例中为 *hello-world*），然后打开该`app.js`文件。

1. 在识别符合条件的 Lambda 处理程序函数的内联操作中，选择 `Add Debug Configuration`。如果未出现添加调试配置选项，则必须启用代码透镜。要启用代码镜头，请参阅[启用 AWS 工具包代码镜头](enable-code-lenses.md)。  
![\[访问 Lambda 函数处理程序的内联操作中的“Add Debug Configuration（添加调试配置）”选项。\]](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/images/direct_invoke_config.png)

1. 选择运行 SAM 应用程序的运行时。

1. 在 `launch.json` 文件的编辑器中，编辑或确认以下配置属性的值：
   + `"name"` – 输入易于阅读的名称。
   + `"target"` – 确保值为 `"code"`，以便直接调用 Lambda 函数处理程序。
   + `"lambdaHandler"` – 输入代码中方法的名称，Lambda 可使用该方法来调用您的函数。例如，对于中的应用程序 JavaScript，默认值为`app.lambdaHandler`。
   + `"projectRoot"` – 输入包含 Lambda 函数的应用程序文件的路径。
   + `"runtime"` – 输入或确认 Lambda 执行环境的有效运行时（例如 `"nodejs.12x"`）。
   + `"payload"` – 选择以下选项之一以定义要作为输入提供给 Lambda 函数的事件负载：
     + `"json"`：JSON 格式的键值对，用于定义事件负载。
     + `"path"`：用作事件负载的文件路径。

1. 

   如果您对调试配置满意，请选择 **RUN（运行）** 旁边的绿色播放箭头启动调试。

   当调试会话启动时，**DEBUG CONSOLE**（调试控制台）面板显示调试输出，并显示 Lambda 函数返回的任何值。调试 SAM 应用程序时，选择 **AWS Toolkit** 作为 **Output**（输出）面板中的 **Output**（输出）通道。
**注意**  
如果您看到错误消息中提到的 Docker，请参阅此[备注](#docker-problem)。

### 运行和调试本地 Amazon API Gateway 资源
<a name="run-debug-api-gateway"></a>

您可以运行或调试中指定 AWS SAM 的 API Gateway 本地资源`template.yaml`。为此，请使用运行`type=aws-sam`的 AWS Cloud9 启动配置`invokeTarget.target=api`。

**注意**  
API Gateway 支持两种类型 APIs。它们是 REST 和 HTTP APIs。但是，该 AWS 工具包的 API Gateway 功能仅支持 REST APIs。有时 HTTP APIs 被称为 “API Gateway V2” APIs。

**运行和调试本地 API Gateway 资源**

1. 选择以下方法之一以创建 AWS SAM API Gateway 资源的启动配置：
   + **选项 1**：访问 AWS SAM 项目中的处理程序源代码（具体而言，是 .js、.cs 或 .py 文件），将鼠标悬停在 Lambda 处理程序上，然后选择 **Add Debug Configuration**（添加调试配置）。如果未出现添加调试配置选项，请启用代码透镜。要启用代码透镜，请参阅[启用 AWS 工具包代码镜头](enable-code-lenses.md)。然后，在菜单中，选择标记为 API 事件的项目。
   + **选项 2** 编辑 `launch.json` 并使用以下语法创建新的启动配置。

     ```
     {
         "type": "aws-sam",
         "request": "direct-invoke",
         "name": "myConfig",
         "invokeTarget": {
             "target": "api",
             "templatePath": "n12/template.yaml",
             "logicalId": "HelloWorldFunction"
         },
         "api": {
             "path": "/hello",
             "httpMethod": "post",
             "payload": {
                 "json": {}
             }
         }, 
         "sam": {},
         "aws": {}
     }
     ```

1. 在 **Run**（运行）按钮旁的下拉菜单中，选择启动配置（在前例中名为 `myConfig`）。

1. （可选）将断点添加到您的 Lambda 项目代码中。

1. 选择绿色 **play（播放）按钮**旁边的 **Run（运行）**按钮。

1. 在输出窗格中，查看结果。

#### 配置
<a name="run-debug-api-gateway-configuration"></a>

在使用 `invokeTarget.target` 属性值 `api` 时，Toolkit 会更改启动配置验证和行为，以支持 `api` 字段。

```
{
    "type": "aws-sam",
    "request": "direct-invoke",
    "name": "myConfig",
    "invokeTarget": {
        "target": "api",
        "templatePath": "n12/template.yaml",
        "logicalId": "HelloWorldFunction"
    },
    "api": {
        "path": "/hello",
        "httpMethod": "post",
        "payload": {
            "json": {}
        },
        "querystring": "abc=def&qrs=tuv",
        "headers": {
            "cookie": "name=value; name2=value2; name3=value3"
        }
    },
    "sam": {},
    "aws": {}
}
```

按以下示例的方式替换值：

**invokeTarget.logicalId**  
API 资源。

**path**  
启动配置请求的 API 路径（例如 `"path": "/hello"`）。  
必须是从由 `invokeTarget.templatePath` 指定的 `template.yaml` 解析出的有效 API 路径。

**httpMethod**  
使用以下任一动词：“delete”、“get”、“head”、“options”、“patch”、“post”和“put”。

**payload**  
要在请求中发送的 JSON 负载（HTTP 正文），其结构和规则与 lambda.payload 字段相同。  
`payload.path` 指向包含 JSON 负载的文件。  
`payload.json` 指定内联 JSON 负载。

**headers**  
可选的名称/值对映射。使用它来指定要包含在请求中的 HTTP 标头。  

```
"headers": {
     "accept-encoding": "deflate, gzip;q=1.0, *;q=0.5",
     "accept-language": "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5",
     "cookie": "name=value; name2=value2; name3=value3",
     "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
}
```

**querystring**  
（可选）使用此字符串设置请求的 `querystring`（例如 `"querystring": "abc=def&ghi=jkl"`）。

**AWS**  
如何提供 AWS 连接信息。有关更多信息，请参阅 [调试无服务器应用程序的配置选项](sam-debug-config-ref.md) 中的 **AWS 连接 (`aws`) 属性**表。

**sam**  
 AWS SAM CLI 如何构建应用程序。有关更多信息，请参阅 [调试无服务器应用程序的配置选项](sam-debug-config-ref.md) 中的 **AWS SAM CLI (`sam`) 属性**。

## 同步无服务器应用程序
<a name="deploy-serverless-app"></a>

此示例演示如何使用 AWS Toolkit for Visual Studio Code将在上一主题 ([创建无服务器应用程序](#sam-create)) 中创建的无服务器应用程序同步到 AWS 。

### 先决条件
<a name="deploy-sam-prereq"></a>
+ 请务必选择全局唯一的 Amazon S3 存储桶名称。
+ 确保您在中配置的凭证包括对以下服务的相应 read/write 访问权限：Amazon S3、 CloudFormation AWS Lambda、和 Amazon API Gateway。
+ 对于具有部署类型 `Image` 的应用程序，请确保您拥有全局唯一的 Amazon S3 存储桶名称和用于部署的 Amazon ECR 存储库 URI。

### 同步无服务器应用程序
<a name="deploy-sam-proc"></a>

1. 在 **AWS 各区服务浏览器**窗口中，打开 **Lambda** 节点的上下文（右键单击）菜单，然后选择**同步 SAM 应用程序**。

1. 选择要部署 AWS 区域 到的。

1. 选择要用于部署的 `template.yaml` 文件。

1. 输入此部署可使用的 Amazon S3 存储桶的名称。存储桶必须位于您要部署到的区域中。
**警告**  
Amazon S3 存储桶名称在 Amazon S3 中的所有现有存储桶名称之间必须是全局唯一的。向以下示例给出的名称添加唯一标识符，或者选择其他名称。

1. 如果您的无服务器应用程序包含具有类型 `Image` 的函数，输入此部署可使用的 Amazon ECR 存储库的名称。存储库必须位于您要部署到的区域中。

1. 输入已部署堆栈的名称：新堆栈名称或现有堆栈名称。

1. 在 **Console（控制台）**的 **AWS Toolkit** 选项卡验证部署是否成功。

   如果发生错误，右下角将弹出一条消息。

   如果发生这种情况，请查看 **AWS Toolkkit** 选项卡中的文本以了解详细信息。以下是错误详细信息的示例。

   ```
   Error with child process: Unable to upload artifact HelloWorldFunction referenced by CodeUri parameter of HelloWorldFunction resource.
   S3 Bucket does not exist. Execute the command to create a new bucket
   aws s3 mb s3://pbart-my-sam-app-bucket
   An error occurred while deploying a SAM Application. Check the logs for more information by running the "View AWS Toolkit Logs" command from the Command Palette.
   ```

   在此示例中，出现错误的原因是 Amazon S3 存储桶不存在。

完成部署时，您将看到 **AWS 各区服务浏览器**窗口中列出了您的应用程序。要了解如何调用作为应用程序的一部分创建的 Lambda 函数，请参阅 [调用远程 Lambda 函数](lambda-toolkit.md#remote-lambda)。

## 从云端删除无服务器应用程序 AWS
<a name="delete-serverless-app"></a>

删除无服务器应用程序涉及删除您之前部署到 AWS 云端的 CloudFormation 堆栈。请注意，此过程不会从本地主机中删除您的应用程序目录。

1. 打开 **AWS 各区服务浏览器**。

1. 在 **AWS 各区服务浏览器**窗口中，展开包含希望删除的已部署应用程序的区域，然后展开 **CloudFormation**。

1. 打开上下文（右键单击）菜单，查看与要删除的无服务器应用程序相对应的 CloudFormation 堆栈名称。然后，选择**删除 CloudFormation 堆栈**。

1. 要确认删除已选择的堆栈，请选择 **Delete（删除）**。

如果堆栈删除成功， AWS Toolkit 将从 Expl **AWS orer** 中的 CloudFormation 列表中删除堆栈名称。