AWS SAM 使用 AWS 工具包 - AWS Cloud9

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

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

AWS SAM 使用 AWS 工具包

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

创建无服务器应用程序

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

创建无服务器应用程序的必要先决条件包括AWS SAM CLI和。AWS 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 资源管理器中,打开 L ambda 节点的上下文(右键单击)菜单,然后选择创建 Lambda 应用程序。SAM

    注意

    或者,您可以选择AWS:Explorer 标题对面的菜单图标,然后选择创建 Lambda 应用程序SAM

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

    注意

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

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

    • AWS SAM Hello World:一个带有 Lambda 函数的基本模板,可返回经典的 “Hello World” 消息。

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

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

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

创建项目后,您可以在环境窗口中查看应用程序的文件。在 Explorer 窗口的列表中找到该文件夹。

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

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

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

要详细了解 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 Toolkit 创建无服务器应用程序,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模板的 “资源” 部分中指定的名称相匹配。在这种情况下,它是类型 AWS::Serverless::FunctionHelloWorldFunction

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

  5. 如果您对调试配置满意,请保存 launch.json。然后,选择旁边的绿色 “播放” 按钮RUN开始调试。

    注意

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

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

    调试会话启动时,DEBUGCONSOLE面板会显示调试输出并显示 Lambda 函数返回的所有值。调试SAM应用程序时,会在 “输出” 面板中选择 AWS Toolkit 作为输出通道。

    注意

    对于 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 工具包代码镜头

    访问 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开始调试。

    调试会话启动时,DEBUGCONSOLE面板会显示调试输出并显示 Lambda 函数返回的所有值。调试SAM应用程序时,会在 “输出” 面板中选择 AWS Toolkit 作为输出通道。

    注意

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

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

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

注意

API网关支持两种类型APIs。它们是,REST而且HTTPAPIs。但是,该 AWS 工具包的API网关功能仅支持RESTAPIs。有时HTTPAPIs被称为 “APIGateway V2” APIs。

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

    • 选项 1:访问 AWS SAM 项目中的处理程序源代码(具体而言,是 .js、.cs 或 .py 文件),将鼠标悬停在 Lambda 处理程序上,然后选择 Add Debug Configuration(添加调试配置)。如果未出现添加调试配置选项,请启用代码透镜。要启用代码透镜,请参阅启用 AWS 工具包代码镜头 。然后,在菜单中,选择标有 “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")。

必须是根据指定的解析template.yaml的有效API路径invokeTarget.templatePath

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 Gateway。API

  • 对于部署类型的应用程序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 Explorer 窗口中列出了您的应用程序。要了解如何调用作为应用程序的一部分创建的 Lambda 函数,请参阅 调用远程 Lambda 函数

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

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

  1. 打开 AWS Explorer

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

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

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

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