亚马逊云科技 SAM 现在支持使用 亚马逊云科技 AppSync 的 GraphQL 应用程序

作者: 凯文·施瓦兹 | 2023

我们很高兴地宣布, 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM) 现在支持使用 亚马逊云科技 A ppSync 构建无服务器 Grap hQL API。

亚马逊云科技 SAM 提供了一种用于定义 亚马逊云科技 无服务器资源的简写语法。亚马逊云科技 AppSync 使开发人员能够使用安全、无服务器和高性能的 GraphQL 和 Pub/Sub API 将其应用程序连接到数据和事件。GraphQL API 允许开发人员通过减少往返行程并将有效负载限制为仅限于所需的数据来降低 IO 延迟。

这篇博客文章将演示使用最近发布的 AWS:: Serverless:: GraphqLapi 资源构建 GraphQL API。

全新 GraphQLapi 资源

使用 亚马逊云科技 SAM GraphqLapi 资源,您可以使用单个资源定义声明 GraphQL API 所需的一切。有关资源类型及其属性的详细信息,请查看 AWS:: Serverless:: GraphQLapi 文档。

  • 亚马逊云科技:: Serverless:: GraphqLapi :顶级资源,包括 API 密钥、缓存、自定义域、GraphQL 架构、日志记录和跟踪的属性。
  • 身份验证 :定义嵌套授权细节的属性,包括 AW S Lambda 授权器 、亚马逊 Cognito 用户池或 OIDC 提供商
  • 数据源 :定义嵌套数据源 细节的属性,例如 亚马逊云科技 Lambda 或 Amazon DynamoDB。
  • 函数 :用于配置代码、运行时和其他管道函数属性的属性。
  • 解析器 :用于配置代码、运行时、管道函数执行顺序和其他解析器属性的属性。

SAM 应用程序演练

这篇文章与预先构建的 演示应用程序 配对 以创建和查看社交帖子。有关如何部署和测试应用程序 的详细说明,请参阅 git 存储库 自述文件 。下图提供了示例应用程序的高级别 亚马逊云科技 架构。

AWS Architecture of a GraphQL application built with the AWS SAM AWS::Serverless::GraphQLApi resource
图 1:亚马逊云科技 AppSync 应用程序架构示例

假设你要使用 亚马逊云科技 CloudFormation 定义这个应用程序。在这种情况下,你需要 为GraphQlapi、Gr aphQ lSchema、APiKey、包括A WS身份和访问 管理 (IAM) 角色和策略在内的数据源、三个函数配置和两个管道解析器配置不同的CloudFormation AppSync 资源 。取而代之的是,通过新的 亚马逊云科技 SAM 转换,您可以使用单个 A WS:: Serverless:: GraphqLapi 资源及其内联属性来定义此应用程序。

先决条件

熟悉 GraphQL、JavaScript 和 NoSQL 是有益的。您将需要以下内容:

  1. 访问有权创建 CloudFormation 堆栈、 亚马逊云科技 AppSync API、亚马逊云科技 IAM 角色和策略以及 DynamoDB 表的 亚马逊云科技 账户
  2. 安装版本 >= 1.88.0 的 亚马逊云科技 无服务器应用程序模型命令行接口 (亚马逊云科技 SAM CLI)
  3. 在工作环境中安装 GIT 客户端。
  4. 在您的环境中安装 curl 客户端实用程序。
  5. 在您的环境中安装 Node.js(运行订阅示例)。

步骤 1:克隆应用程序并查看 SAM 模板

查看 GitHub 上的 template.yml 文件或通过在 CLI 终端中执行以下命令来克隆应用程序以开始使用。

git clone https://github.com/aws-samples/aws-sam-transform-aws-appsync.git c
d aws-sam-transform-aws-

通读模板后,你会发现只定义了两个 亚马逊云科技 SAM 资源,一个 GraphQL API 和一个作为 API 管道函数数据源引用的 DynamoDB 表。作为开发人员,亚马逊云科技 SAM 可以为您处理以下无差别的繁重工作,从而简化您的工作:

  1. 为数据源生成范围合理的 IAM 策略和角色以访问 DynamoDB。 createPostItem getPostFromTable 函数引用 DynamodbPoststab le 资源,但你不必定义自定义 IAM 资源。
  2. GraphqlPostsAPI 属性 schema uri 引用 sam_g raphql_api/schem a.graphql 文件的相对路径。 当您部署此模板时,亚马逊云科技 SAM CLI 会为您打包此架构,将其上传到 S3,然后在您部署模板时从 S3 中提取文件。该文件的修订版本在 S3 中进行了版本控制。
  3. GraphqlPostsAPI 函数词典 使用引用 sam_graphql_api/createPostItem.js 函数的相对路径的 codeUR I 属性定义了像 createPostItem 这样的命名函数。 亚马逊云科技 SAM CLI 负责打包、版本控制和将函数文件上传到 S3
  4. 没有为管道解析器变异和查询、 AddPost 和 GetPost 定义任何代码。 亚马逊云科技 SAM 为您生成管道解析器 JS 代码,对应于您定义为 APPS YNC_JS 的运行时。
  5. 此 API 使用简单的 API 密钥进行授权,使用一种简单的身份验证类型来启动新的 GraphQL API。身份验证和 API 密钥定义各只需要两行配置。亚马逊云科技 SAM 使用默认值生成这些值,因此您可以立即开始测试您的 API。

步骤 2:安装应用程序

下一步是将此应用程序部署到您的 亚马逊云科技 账户,以便您可以浏览它创建的资源并与 GraphQL API 进行交互。运行以下命令并接受所有默认值。

sam deploy

当 亚马逊云科技 SAM 部署您的应用程序时,它会首先将您的 GraphQL 架构和函数上传到亚马逊 S3。然后,它会生成您的模板的更新副本,以便代码 URI 引用 Amazon S3 位置。最后,亚马逊云科技 SAM 执行您的模板以在您的 亚马逊云科技 账户中创建资源,如以下屏幕截图所示。记下您安装此应用程序的区域。

SAM CLI resource output listing after CloudFormation execution
图 2:通过 亚马逊云科技 SAM 部署命令创建的 亚马逊云科技 资源的输出列表

步骤 3:测试应用程序

部署完成后,您将看到两个输出输出输出到控制台,分别提供应用程序的 GraphQL API 端点和 API 密钥。保存这些值,因为在以下步骤中,您需要这两个值来测试您的 API。

Screenshot of CloudFormation Stack Outputs from sam deploy command
图 3:CloudFormation 输出 apiEndpoint 和 ApikeyValue 用于测试

现在,你可以运行以下 curl 命令来创建和检索帖子。你需要使用从 SAM CLI 输出值中捕获的 API 端点和 API 密钥。复制并运行以下命令,将占位符尖括号替换为输出值。

curl\
--request POST\
--header '内容类型:应用程序/json'\
--header 'x-api-key:'\--data' {“查询”:“mut
ation addPost {addPost(作者:\ “匿名\”,内容:\ “lorem ipsum dolor sit amet,consectetur adipiscing elit\”,标题:\ “一篇简单的帖子\”){作者内容 ID}}”} '\

从响应输出中捕获 post ID 字段的值并替换 POST_ID 占位符,然后发出以下命令来检索您的帖子详细信息。

curl\
--request POST\
--header '内容类型:应用程序/json'\
--header 'x-api-key: '\--d
ata' {“查询”: “{getPost (id:\”\”) {id 作者标题内容版本向下}}”} '\

第 4 步:测试订阅

要在您的 API 上测试订阅,您可以使用您的 API 终端节点、API 密钥和安装模板的区域更新 src/exports.js 文件。

const awsmobile = {a
ws_project_region: ",//来自 `sam deploy` 的区域 a
ws_appsync_GraphqlEndpoint:" “,aws_appsync_region:”,};导出默认
awsmobile;




更新 src/exports.js 文件后,您可以运行以下命令来启动托管订阅您的 API 的网页的 Web 服务器

npm 安装 npm run build

npm run start

Web 应用程序在本地运行后,在浏览器 中打开地址 http://localhost:8080/ 。接下来,对你的 API 执行一些 AddPos t 突变,这样你就可以看到它们实时显示在单页应用程序上。同样,在运行命令之前,你需要用你的 API 端点和密钥替换占位符。在此步骤中,打开第二个终端;您打开的原始终端需要继续运行 Web 服务器。

curl\
--request POST\
--header '内容类型:应用程序/json'\
--header 'x-api-key:'\--data ' {“查询”:“mut
ation addPost {addPost(作者:\ “AWS\”,内容:\ “SAM\”){作者标题内容 ID 向下版本}”} '\ curl\--request POST\--header '内容类型:应用程序/json'\--header 'x-api-key:




KEY>'\
--data '{“查询”:“突变 addPost {addPost(作者:\ “AWS\”,内容:\ “AppSync\”,标题:\ “AppSync\”){作者标题内容 ID 向下版本}}'\ c

url\--request POST\--header '内容类型:应用程序/json'\
--header 'x-api-key: '\
--data' {“查询”:“mut
ation addPost {addPost(作者:\ “AWS\”,内容:\ “Speedy NoSQL\”,标题:\ “DynamoDB\”){作者
标题内容id ups downs 版本}”} '\


如果一切都按预期进行,你将看到一个类似于以下内容的页面。

Screenshot of subscriptions web applications
图 4:实时订阅结果。

步骤 5:清理

为避免您按照本博客文章中的说明创建的资源产生费用,请使用以下命令删除您的应用程序。

sam 删除

结论

这篇文章回顾了新的 亚马逊云科技 SAM 功能,这些功能可以使用 亚马逊云科技 AppSync 快速构建和部署无服务器 GraphQL 应用程序。我们重点介绍了节省时间的快捷方式,例如为数据源生成 IAM 策略和文件打包,以改善架构文件和函数的开发者体验。

亚马逊云科技 SAM 资源 AW S:: Serverless:: GraphQLapi 可帮助开发人员快速构建无服务器 GraphQ L 应用程序。亚马逊云科技 AppSync 提供托管的 GraphQL 运行时,可使用单个 API 访问来自一个或多个数据源的数据或事件,并通过向具有内置安全、监控、缓存、记录和跟踪功能的订阅客户发布来自任何事件源的数据来创建引人入胜的实时体验。有关更多信息,请参阅 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM) 和 亚马逊云科技 A ppSyn c 文档。

欲了解更多学习资源,请访问 https://serverlessland.com/search?search=sam https://serverlessland.com/search?search=graphql

Kevin Schwarz

凯文·施瓦兹

凯文是高级解决方案架构师。Kevin 在构建业务能力方面拥有 20 多年的技术经验,深耕金融服务、无服务器、弹性和物联网。工作之余,凯文喜欢与妻子和孩子共度时光,跑步、锻炼和园艺。