通过 AWS 工具包使用 AWS SAM - AWS Cloud9

AWS Cloud9 现已不再向新客户提供。AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多

通过 AWS 工具包使用 AWS SAM

AWS Toolkit 提供对无服务器应用程序的支持。使用 AWS Toolkit,您可以创建包含 AWS Lambda 函数的无服务器应用程序,然后将应用程序部署到 AWS CloudFormation 堆栈。

创建无服务器应用程序

此示例演示如何使用 AWS Toolkit 创建无服务器应用程序。有关如何运行和调试无服务器应用程序的信息,请参阅运行和调试无服务器应用程序

创建无服务器应用程序的必要先决条件包括 AWS SAM CLIAWS CLI。这些都包含在 AWS Cloud9 中。如果 AWS SAM CLI 未安装或已过期,则可能需要运行安装或升级。有关如何安装 AWS SAM CLI 的说明,请参阅安装 AWS SAM CLI;有关如何升级 AWS SAM CLI 的说明,请参阅升级 AWS SAM CLI

使用 AWS Toolkit 创建无服务器应用程序

此示例演示如何使用 AWS Serverless Application Model (AWS SAM) 通过 AWS Toolkit 创建无服务器应用程序。

  1. AWS Explorer 中,打开 Lambda 节点的上下文(右键单击)菜单,然后选择 Create Lambda SAM Application(创建 Lambda SAM 应用程序)。

    注意

    或者,您也可以单击 AWS: Explorer 标题中的菜单图标,然后选择 Create Lambda SAM Application(创建 Lambda SAM 应用程序)。

  2. 选择 SAM 应用程序的运行时。对于此示例,请选择 nodejs12.x

    注意

    如果您选择一个带有“(Image)”的运行时,则您的应用程序是 Image 型软件包。如果您选择一个不带有“(Image)”的运行时,则您的应用程序是 Zip 型。有关 ImageZip 软件包类型差异的更多信息,请参阅 AWS Lambda 开发人员指南中的 Lambda 部署软件包

  3. 为您的无服务器应用程序选择以下模板之一:

    • AWS SAM Hello World:带有 Lambda 函数的基本模板,返回经典的“Hello World(你好,世界)”消息。

    • AWS Step Functions 示例应用程序:运行股票交易工作流的示例应用程序。Step Functions 编排所涉及 Lambda 函数的交互。

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

  5. 输入新应用程序的名称。对于本示例,请使用 my-sam-app-nodejs。按 Enter 键后,AWS Toolkit 需要几分钟才能创建项目。

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

屏幕截图显示了 SAM 应用程序的可用运行时。

运行和调试无服务器应用程序

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

为了更详细地了解 AWS SAM 模板,请参阅 AWS Serverless Application Model 开发人员指南中的 AWS SAM 模板剖析

或者,您可以快速调试尚未提交到 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 处理程序的方式。有关更多信息,请参阅 直接从代码运行和调试无服务器函数

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

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

在此步骤中,使用在 创建无服务器应用程序 中创建的示例应用程序。

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

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

  2. 从应用程序文件夹(如 my-sample-app(我的样本应用程序)),打开 template.yaml 文件。

  3. 对于 template.yaml,选择 Edit Launch Configuration(编辑启动配置)。

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

  4. 编辑或确认以下配置属性的值:

    • "name" – 输入一个易于阅读的名称,以显示在 Run(运行)视图中的 Configuration(配置)下拉字段中。

    • "target" – 确保该值为 "template"。这样,SAM 模板便成为调试会话的入口点。

    • "templatePath" – 输入 template.yaml 文件的相对路径或绝对路径。

    • "logicalId" – 确保名称与 SAM 模板的 Resource(资源)部分中指定的名称一致。在这种情况下,它是类型 AWS::Serverless::FunctionHelloWorldFunction

    有关 launch.json 文件中这些以及其他条目的更多信息,请参阅 调试无服务器应用程序的配置选项

  5. 如果您对调试配置满意,请保存 launch.json。然后选择 RUN(运行)旁边的绿色“play”(播放)按钮以启动调试。

    注意

    如果 SAM 应用程序无法运行,请检查 Output(输出)窗口以查看错误是否因 Docker 镜像未构建引起。您可能需要释放环境中的磁盘空间。

    有关更多信息,请参阅 在 AWS Toolkit 中本地运行 SAM 应用程序时发生错误,因为 AWS Cloud9 环境没有足够的磁盘空间

    当调试会话启动时,DEBUG CONSOLE(调试控制台)面板显示调试输出,并显示 Lambda 函数返回的任何值。调试 SAM 应用程序时,选择 AWS Toolkit 作为 Output(输出)面板中的 Output(输出)通道。

    注意

    对于 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 ...

直接从代码运行和调试无服务器函数

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

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

语言/运行时 上下文感知链接识别 Lambda 函数的条件

JavaScript(Node.js 10.x、12.x、14.x)

该函数具有以下功能:
  • 这是一个导出的函数,最多有三个参数。

  • 它在工作区文件夹中的父文件夹中具有 package.json 文件。

Python(3.7、3.8、3.9 和 3.10)

该函数具有以下功能:
  • 这是一个顶级函数。

  • 它在工作区文件夹中的父文件夹中具有 requirements.txt 文件。

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

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

  2. 从应用程序文件夹(如 my-sample-app),展开函数文件夹(在本例中为 hello-world),然后打开 app.js 文件。

  3. 在识别符合条件的 Lambda 处理程序函数的内联操作中,选择 Add Debug Configuration。如果未出现添加调试配置选项,则必须启用代码透镜。要启用代码镜头,请参阅启用 AWS Toolkit 代码镜头

    访问 Lambda 函数处理程序的内联操作中的“Add Debug Configuration(添加调试配置)”选项。
  4. 选择运行 SAM 应用程序的运行时。

  5. launch.json 文件的编辑器中,编辑或确认以下配置属性的值:

    • "name" – 输入易于阅读的名称。

    • "target" – 确保值为 "code",以便直接调用 Lambda 函数处理程序。

    • "lambdaHandler" – 输入代码中方法的名称,Lambda 可使用该方法来调用您的函数。例如,对于 JavaScript 中的应用程序,默认为 app.lambdaHandler

    • "projectRoot" – 输入包含 Lambda 函数的应用程序文件的路径。

    • "runtime" – 输入或确认 Lambda 执行环境的有效运行时(例如 "nodejs.12x")。

    • "payload" – 选择以下选项之一以定义要作为输入提供给 Lambda 函数的事件负载:

      • "json":JSON 格式的键值对,用于定义事件负载。

      • "path":用作事件负载的文件路径。

  6. 如果您对调试配置满意,请选择 RUN(运行) 旁边的绿色播放箭头启动调试。

    当调试会话启动时,DEBUG CONSOLE(调试控制台)面板显示调试输出,并显示 Lambda 函数返回的任何值。调试 SAM 应用程序时,选择 AWS Toolkit 作为 Output(输出)面板中的 Output(输出)通道。

    注意

    如果您看到错误消息中提到的 Docker,请参阅此备注

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

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

注意

API Gateway 支持两种类型的 API。它们是 REST 和 HTTP API。但是,带有 AWS 工具包的 API Gateway 功能仅支持 REST API。有时候 HTTP API 被称为“API Gateway V2 API”。

运行和调试本地 API Gateway 资源
  1. 选择以下方法之一以创建 AWS SAM API Gateway 资源的启动配置:

    • 选项 1:访问 AWS SAM 项目中的处理程序源代码(具体而言,是 .js、.cs 或 .py 文件),将鼠标悬停在 Lambda 处理程序上,然后选择 Add Debug Configuration(添加调试配置)。如果未出现添加调试配置选项,请启用代码透镜。要启用代码透镜,请参阅启用 AWS Toolkit 代码镜头 。然后,在菜单中,选择标记为 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": {} }
  2. Run(运行)按钮旁的下拉菜单中,选择启动配置(在前例中名为 myConfig)。

  3. (可选)将断点添加到您的 Lambda 项目代码中。

  4. 选择绿色 play(播放)按钮旁边的 Run(运行)按钮。

  5. 在输出窗格中,查看结果。

配置

在使用 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 负载。

标头

可选的名称/值对映射。使用它来指定要包含在请求中的 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 连接信息提供的方式。有关更多信息,请参阅 调试无服务器应用程序的配置选项 中的 AWS 连接 (aws) 属性表。

sam

AWS SAM CLI 构建应用程序的方式。有关更多信息,请参阅 调试无服务器应用程序的配置选项 中的 AWS SAM CLI (sam) 属性

同步无服务器应用程序

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

先决条件

  • 请务必选择全局唯一的 Amazon S3 存储桶名称。

  • 确保您配置的凭证包含对以下服务的适当读/写访问权限:Amazon S3、AWS CloudFormation、AWS Lambda 和 Amazon API Gateway。

  • 对于具有部署类型 Image 的应用程序,请确保您拥有全局唯一的 Amazon S3 存储桶名称和用于部署的 Amazon ECR 存储库 URI。

同步无服务器应用程序

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

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

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

  4. 输入此部署可使用的 Amazon S3 存储桶的名称。存储桶必须位于您要部署到的区域中。

    警告

    Amazon S3 存储桶名称在 Amazon S3 中的所有现有存储桶名称之间必须是全局唯一的。向以下示例给出的名称添加唯一标识符,或者选择其他名称。

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

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

  7. 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 函数

从 AWS 云中删除无服务器应用程序

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

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

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

  3. 对于所要删除的无服务器应用程序,打开与其对应的 AWS CloudFormation 堆栈名称的上下文(右键单击)菜单。然后,选择 Delete CloudFormation Stack(删除 CloudFormation 堆栈)。

  4. 要确认删除已选择的堆栈,请选择 Delete(删除)

如果堆栈删除成功,AWS Toolkit 将从 AWSExplorer 中的 AWS CloudFormation 列表中删除堆栈名称。