标签: aws-appsync

AWS Amplify AppSync IAM 401

我越来越GraphQLError: Request failed with status code 401

我按照以下自动配置说明进行操作:

https://aws.github.io/aws-amplify/media/api_guide#automated-configuration-with-cli

我尝试查找,但 IAM 缺乏资源。看起来一切都应该自动设置,并在我输入 IAM 访问密钥和秘密后使用 Amplify CLI 完成。

是否需要进一步设置?这是我的代码:

import Amplify, { API, graphqlOperation, Hub } from "aws-amplify";
import aws_config from "../../aws-exports";

Amplify.configure(aws_config);

const ListKeywords = `query ListKeywords {
  listKeyword {
    keyword {
      id
      name
    }
  }
}`;

const loop = async () => {
  const allKeywords = await API.graphql(graphqlOperation(ListKeywords));
}
Run Code Online (Sandbox Code Playgroud)

是否也是因为我的 GraphQL 解析器尚未为 ListKeywords 设置?

amazon-web-services amazon-iam aws-appsync aws-amplify

6
推荐指数
1
解决办法
7069
查看次数

使用 AppSync 和 DynamoDB 运行 Lambda 函数以进行服务器端验证

我最近很喜欢与AWS Amplify合作,它基于定义的架构为 GraphQL 查询生成代码非常出色。

我遇到了一个定义自定义逻辑/验证服务器端的复杂问题。在袋子外面的AppSync(部分负责扩增出GraphQL API)生成您的架构解析器和DynamoDB表。解析器是使用Apache Velocity模板语言创建的,如果您不熟悉它,我认为它有点学习曲线。

此外,这些解析器是由 Amplify cli 自动生成的。我不确定在 AppSync 控制台或本地编辑它们是否有意义,因为每次我们推送 api 更改时,它们都会再次自动生成?

除此之外,这些自动生成的解析器实际上在将类型模型链接在一起、启用搜索和身份验证检查方面实现了很多,我真的不想接触它们,因为自动生成支持的开发速度是疯狂的。

因此,引入我的自定义逻辑的其他解决方案似乎是 Lambda 函数,用于侦听关联 DynamoDB 表的创建/更新事件。

我想我可以按照下面演示的方式进行设置,基本上允许用户正常使用 GraphQL api,并且当需要服务器验证的操作在 lambda 中对其做出反应时?

例如玩家将物品添加到他们的库存中,我们触发 lambda 函数来检查玩家之前是否拥有该物品,如果没有购买,我们验证物品数据并从玩家表中减去其成本的金币。我认为这很好用,但我的担忧是

  1. 我们允许先将未经验证的数据写入数据库(尽管它已通过 graphql 类型系统和身份验证检查进行验证。)
  2. 涉及 Lambda 的额外成本(在我看来,为了节省时间和使用 NodeJS 而不是 Apache Velocity 来定义语言的能力,这是值得的)

我还缺少其他东西吗?

在此处输入图片说明

因此 lambda 将在幕后进行验证,我们假设这里的大多数用户都是优秀的参与者,并且他们传递给 GraphQL api 的数据是正确的,因为他们使用我们的客户端。

如果数据是意外的(坏演员),lambda 会做出反应并禁止用户。

这个解决方案是否可行/通用,还有其他选择吗?

amazon-web-services amazon-dynamodb aws-lambda aws-appsync aws-amplify

6
推荐指数
0
解决办法
543
查看次数

如何设置 AWS Appsync 请求超时限制 || AWSAppSync 客户端不提供回调

我正在将 AWS Appsync 用于我正在开发的当前应用程序并面临一个严重问题,即每当我在 Appsync 客户端中触发查询时,当互联网连接速度较慢时,请求永远不会以回调结束。我通过互联网检查了有关此主题的信息来源有限,并且还发现此问题仍然存在。

这是我用来获得响应的代码

func getAllApi(completion:@escaping DataCallback){
    guard isInternetAvailabele() else {
        completion(nil)
        return
    }
    // AppSyncManager.Client() is AWSAppSyncClient Object
    AppSyncManager.Client().fetch(query: GetlAllPostQuery(input: allInputs), cachePolicy:.fetchIgnoringCacheData) {
        (result, error) in
        var haveError:Bool = error != nil
        if let _ = result?.data?.getAllPostings?.responseCode {haveError = false} else {haveError = true}
        if haveError  {
            print(error?.localizedDescription ?? "")
            completion(nil)
            return
        }

        if result != nil{
            completion(result)
        }else{
            completion(nil)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码在互联网连接下工作正常,如果没有互联网,我已经在顶部进行了检查,但是当互联网连接速度较慢或 wifi 连接到我在禁用互联网数据的情况下使用手机创建的热点时,请求不会返回任何回调,它应该给出失败的警报,就像我们在请求超时时进入其他 api 一样。是否支持请求超时或我错过了什么?

注意:我在终端中收到了这些日志

Task <06E9BBF4-5731-471B-9B7D-19E5E504E57F>.<45> HTTP load failed …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services ios swift aws-appsync aws-appsync-ios

6
推荐指数
1
解决办法
3137
查看次数

如何在aws-amplify中对列表查询中的字段进行排序?

如何对放大graphql api中的字段进行排序?我正在尝试在获取模型列表的同时对字段进行排序。

例如:在 listOrder 查询中对 createdDate 进行排序。

请问有什么帮助吗?

aws-appsync aws-amplify

6
推荐指数
1
解决办法
4057
查看次数

Appsync Resolver 声明中没有电子邮件

我创建了一个使用电子邮件地址 ($context.identity.claims.email) 的解析程序。我在 AWS 控制台“查询”部分测试了我的查询,一切正常,因为 $context.identity.claims 看起来符合预期;

{
    sub: 'xxx-xxx-xxx-xxx-xxx',
    aud: 'xxxxxxxxx',
    email_verified: true,
    sub: 'xxx-xxx-xxx-xxx-xxx',
    token_use: 'id',
    auth_time: 1563643503,
    iss: 'https://cognito-idp.ap-southeast-1.amazonaws.com/ap-southeast-1_xxxxx',
    'cognito:username': 'xxxx',
    exp: 1563647103,
    iat: 1563643503,
    email: 'xxx@xxx.xxx'
}
Run Code Online (Sandbox Code Playgroud)

一切看起来都不错,所以让我们在我的 React 应用程序中使用它,该应用程序使用 AWS Amplify 代码进行身份验证。它现在不起作用,那是因为索赔部分没有“电子邮件”!看起来像这样;

{
    sub: 'xxx-xxx-xxx-xxx-xxx',
    event_id: 'xxx-xxx-xxx-xxx-xxx',
    token_use: 'access',
    scope: 'aws.cognito.signin.user.admin',
    auth_time: 1563643209,
    iss: 'https://cognito-idp.ap-southeast-1.amazonaws.com/ap-southeast-1_xxxx',
    exp: 1563646809,
    iat: 1563643209,
    jti: 'xxx-xxx-xxx-xxx-xxx',
    client_id: 'xxxx',
    username: 'xxxx'
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我解释为什么电子邮件显示在 AWS 控制台查询中,但当我从自己的客户端调用它时却没有显示?

amazon-cognito aws-appsync aws-amplify

6
推荐指数
2
解决办法
1997
查看次数

没有突变的 AWS AppSync 订阅

阅读 AppSync 文档,似乎 AppSync 订阅只能通过将订阅附加到突变来工作。

但是,如果我需要独立于突变的订阅怎么办?这是由于某些内部状态变化而引发的吗?例如,如果有新资源可用?

AppSync 中可以这样做吗?

aws-appsync

6
推荐指数
1
解决办法
1016
查看次数

在 AppSync 中使用多个 begin_with 子句查询 DynamoDB

我目前正在尝试使用 AppSync 和 Apache Velocity 模板语言 (VTL) 创建动态查询。

我想用“OR”评估一系列begins_with

例如:

{
    "operation": "Query",
    "query": {
        "expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1)",
        "expressionValues": {
      ":pk": { "S": "tenant:${context.args.tenantId}",
      ":sk": {"S": "my-sort-key-${context.args.evidenceId[0]}"},
      ":sk1": {"S": "my-sort-key-${context.args.evidenceId[1]}"}

   }

    }
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。我也尝试过使用|代替,or但也没有成功。我得到:

无效的 KeyConditionExpression:语法错误;令牌:“|”,附近:“) | begin_with”(服务:AmazonDynamoDBv2;

如何使用 VTL 实现这一目标?

velocity amazon-dynamodb graphql apache-velocity aws-appsync

6
推荐指数
1
解决办法
4495
查看次数

如何缩小由graphQL codegen自动生成的Typescript类型?

我得到了一个从 AWS-Amplify GraphQL(我相信它使用 apollo-codegen)自动生成的 TypeScript 类型,如下所示:

export type GetNoteQuery = {
  getNote:  {
    __typename: "Note",
    id: string,
    createdAt: string | null,
    updatedAt: string | null,
    title: boolean | null,
    content: string | null,
  } | null,
Run Code Online (Sandbox Code Playgroud)

我想生成一个“Note”的基本类型,用作“基本”类型,以便在使用返回的数据时在我的代码中使用。即将笔记映射到 React 组件等。

有没有办法缩小这种自动生成的类型,或者以某种方式扩展它,让它看起来像:

export type GetNoteQuery = {
  getNote:  {
    __typename: "Note",
    id: string,
    createdAt: string | null,
    updatedAt: string | null,
    title: boolean | null,
    content: string | null,
  } | null,
Run Code Online (Sandbox Code Playgroud)

typescript graphql aws-appsync aws-amplify

6
推荐指数
1
解决办法
431
查看次数

AWS 增强身份验证,仅启用登录 - 不启用注册

从所有很棒的教程中,我寻找如何在 amplify 中为 React 应用程序添加身份验证模块。我看到的唯一类型的模块是登录+注册的完整功能。

我想要实现的是:

  1. 设置自定义 Cognito 用户池并手动将用户添加到池中。
  2. 将自定义登录/登录 UI + 代码添加到 React amplify 应用程序。
  3. 禁止除我之外的任何人手动将新用户添加到 Cognito 用户池。

我正在开发的网站是一个内部网站,我不希望任何人能够通过 AppSync 或 React 客户端进行注册。

请帮忙 :)

authentication amazon-cognito aws-appsync aws-amplify

6
推荐指数
1
解决办法
4070
查看次数

如何在 AWS DynamoDB AppSync 解析器中编写 Upsert 突变查询(插入或更新)

我正在 AppSync GraphQL 查询的帮助下处理 DynamoDB。

我有一个 DynamoDB 表,其中用户名是分区键(哈希键),时间戳值是排序键(范围键)。

我针对一个项目保存两件事,即一件事是阅读,第二件事是活动(如锻炼、运动等)。为了添加这两件事,我们有不同的 UI 屏幕。这两件事可能具有相同的时间戳,因此它将保存在一项中。

所以现在我需要一个可用于上述操作的 upsert(插入或更新)查询,因为当您尝试插入新的读数时,它将检查该项目是否存在。如果存在,那么它将更新,或者不更新,那么它将插入该项目,并且当用户想要添加新活动时,必须发生同样的事情。

我对文档感到困惑,并且没有找到用于执行 upsert 操作的确切 AppSync 请求映射解析器。

下面是 PutItem 请求映射解析器:-

    {
      "version": "2017-02-28",
      "operation": "PutItem",
      "key": {
         "username": $util.dynamodb.toDynamoDBJson($ctx.identity.username),
         "timestamp": $util.dynamodb.toDynamoDBJson($ctx.args.input.timestamp),
      },
      "attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),
      "condition": {
         "expression": "attribute_not_exists(#timestamp)",
         "expressionNames": {
           "#timestamp": "timestamp",
         },
      },
   }
Run Code Online (Sandbox Code Playgroud)

下面是 UpdateItem 请求映射解析器:-

{
  "version": "2017-02-28",
  "operation": "UpdateItem",
  "key": {
    "username": $util.dynamodb.toDynamoDBJson($ctx.identity.username),
    "timestamp": $util.dynamodb.toDynamoDBJson($ctx.args.input.timestamp),
  },

  ## Set up some space to keep track of things we're updating **
  #set( $expNames …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-dynamodb graphql aws-appsync velocity-template-language

6
推荐指数
0
解决办法
1390
查看次数