在我正在使用的 appsync api 的 graphQl 模式中,我想根据用户所属的组来限制他们的操作。
根据文档,添加该行aws_auth(cognito_groups: ["Admins"])应该将访问权限限制为仅属于“管理员”组的用户。当我从 appsync 控制台或应用程序本身运行突变时,不会发生这种情况。
我的突变如下:
type Mutation @aws_iam
@aws_cognito_user_pools {
    createItem(input: CreateItemInput!): Item
    updateItem(input: UpdateItemInput!): Item
    @aws_auth(cognito_groups: ["Admins"])
}
@aws_iam 和 @aws_cognito_user_pools 指令似乎工作正常。但任何已通过身份验证或具有 iam 角色的人仍然可以执行更新,即使他们不属于“管理员”组。
这里发生了什么?是否需要进行额外的配置才能使其正常工作?
对于我的项目,我需要能够离线查询和更改数据,并在连接恢复时同步更改。因此,具有 Amplify Appsync 和数据存储的 DynamoDB 似乎是最佳选择,但我们正在努力解决一些相互矛盾的建议。
我们的数据是围绕项目构建的,这些项目具有应该实时更改和同步的位置。由于一个位置可以包含多个项目,而一个项目可以有多个位置,因此我们处理多对多关系。我们应该能够查询所有项目、所有位置、单个项目的所有位置、一个位置的所有项目。这是数据结构的基本要求,但我们应该能够添加对上次修改项目等内容的查询。接下来,我们有一个多租户设置,因此应该有一种方法来授权用户访问部分内容数据。我们可能会使用用户组来过滤数据。
大多数在线资源都指出,为了充分利用 DynamoDB,单一表设计方法是最佳选择。这意味着我们可以使用本文档中所示的结构,添加排序键来进行其他查询。
数据存储文档表示,应该使用 @model 指令来设置所有突变、查询和订阅。为了建立 Items 和 Locations 之间的关系,我们应该使用 @manyToMany 指令,如此处所述。总而言之,这将产生以下模式:
type Item 
    @model
    @auth(rules: [{ allow: groups, groupsField: "groups" }])
    {
        ID: ID!
        groups: String!
        locations: [Location] @manyToMany(relationName: "ItemLocation")
        ...
    }
type Location 
    @model
    @auth(rules: [{ allow: groups, groupsField: "groups" }])
    {
        ID: ID!
        groups: String!
        items: [Item] @manyToMany(relationName: "ItemLocation")
        ...
    }
当我们使用 Amplify CLI 部署此架构时,所有资源都会毫无问题地生成。但是,如果我们查看 DynamoDB 表,我们会发现生成了多个表:Item、Location 和 ItemLocation。@model 指令会自动部署表,@manyToMany 指令也是如此。Dynamodb 文档不使用这些指令,因此应该可以根据给定的要求创建单个表。我无法找到如何从数据存储/放大端执行此操作,或如何将数据存储连接到现有的 DynamoDB,因为数据存储依赖 @model 指令在本地存储数据(或者这就是我怀疑的)。这不符合 DynamoDB 标准,我们希望将此设置更改为单表设计。 …
amazon-web-services amazon-dynamodb graphql aws-appsync aws-amplify
根据提供的教程,我的文件当前正在上传到s3存储桶。
我有一个Post类型,其文件字段指向S3Object。S3Object具有存储桶,键和区域的值。
我想允许我的用户下载他们上传的文件,但是我无法通过查询访问“帖子>文件”。这意味着我无法获得下载URL。
现在,DynamoDB在上传后将以下文件存储起来(我在这里更改了值):
{"s3":{"key":"id.pdf","bucket":"my-bucket","region":"my-region"}}
我的Post>文件解析器如下所示:
{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.source.id),
    }
}
响应模板:
$util.dynamodb.fromS3ObjectJson($ctx.result.file)
运行查询时,出现以下错误:
Error: GraphQL error: Unable to convert {bucket=my-bucket, region=my-region, key=id.pdf} to class java.lang.Object.
有一个很好的存储库,其中包含不同无服务器方案的示例实现。
现在,我正在努力将AppSync和Amazon RDS结合使用。我尝试了独立rds的实现,以及存储库中提供的appsync示例。这些工作就像一种魅力。但是,如果您想组合使用这些技术,显然存在许多差异和困难。我使用了rds目录中的架构,解析器和处理程序函数,并将其与appsync lambda实现结合在一起。我调整了映射模板并更新了serverless.yml文件。
我可以成功部署整个appsync服务和所有资源,而不会出现任何错误。我可以从graphiql访问graphql端点并进行查询。但是当我从appsync控制台尝试时,我得到null作为响应。我想这与映射模板有关,但我不太确定。
是否有人对此特定组合有任何建议或可行的示例?
创建帖子后,我尝试自动添加时间戳。但是,它不适用于appsync解析器-上下文引用的示例。
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
    },
    #set( $myfoo = $util.dynamodb.toMapValues($ctx.args) )
    #set( $myFoo.version = $util.dynamodb.toNumber(1) )
    #set( $myFoo.timestamp = $util.time.nowISO8601() )
    "attributeValues" : $util.toJson($myFoo)
}
Amplify是否支持此处概述的离线功能:https : //docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-react.html#offline-settings
我应该这样设置吗? https://aws.github.io/aws-amplify/media/api_guide#configuration-for-graphql-server
或者对于离线功能,我是否必须使用类似Apollo的功能?
我正在尝试从GSI获取记录,但遇到了麻烦。
API架构:
type DriverInfos {
    id: String!
    status: Int
    lastLat: Float
    lastLng: Float
    idDriver: String # GSI
}
type Query {
    getDriverInfosByDriver(idDriver: String): DriverInfos
}
解析器:
{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "idDriver-index",
    "query" : {
        ## Provide a query expression. **
        "expression": "#idDriver = :idDriver",
        "expressionNames" : {
            "#idDriver" : "idDriver"
        },
        "expressionValues" : {
            ":idDriver" : {
                "S" : "${ctx.args.idDriver}"        
            }
        }
    }
}
查询:
query getDriverInfosByDriver{
  getDriverInfosByDriver(idDriver: "1") 
    {    
      idDriver
      status
      lastLat
      lastLng 
    } …resolver amazon-web-services graphql react-native aws-appsync
当数据源是dynamoDB时,是否有可能在我的AppSync突变上有业务逻辑?
我是GraphQL和Appsync的新手.我的理解是,当您使用普通的GraphQL时,您可以在解析器中拥有业务逻辑,以便在更新之前进行验证.当您使用DynamoDB作为数据源传递GraphQL架构时,您将如何使用AWS AppSync实现相同的功能?
我有一个可选的String字段notes,有时为空。如果为空,我想插入null,否则我想插入字符串。
这是我的解析器-
{
    "version" : "2017-02-28",
    "operation": "Invoke",
        #set($id = $util.autoId())
        #set($notes = $util.defaultIfNullOrEmpty($context.arguments.notes, 'null'))
        "payload": {
          "sql":"INSERT INTO things VALUES ('$id', :NOTES)",
          "variableMapping": {
            ":NOTES" : $notes
          },
          "responseSQL": "SELECT * FROM things WHERE id = '$id'"
        }
}
有了这个graphql
mutation CreateThing{
  createThing() {
    id
    notes
  }
}
我得到-
{
  "data": {
    "createRoll": {
      "id": "6af68989-0bdc-44e2-8558-aeb4c8418e93",
     "notes": "null"
   }
 }
}
当我真的想要没有引号的null时。
有了这个graphql-
mutation CreateThing{
  createThing(notes: "Here are some notes") {
    id
    notes …我正在尝试查询特定日期范围内所有项目的项(其中具有AWS DateTime的CreatedAt和UpdatedAt字段)。例如,过去48小时。
例如,使用以下架构:
type Note @model @searchable @auth(rules: [{ allow: owner }]) {
  id: ID!
  note: String
  createdAt: AWSDateTime
我可以使用以下方式搜索日期:
query {
  searchNotes(filter:{createdAt: { matchPhrasePrefix: "2018-12-27"}}) {
    items{
      id
        title
      createdAt
    }
  }
}
它返回所有带有该字符串前缀的与UTC时间匹配的音符。
从那里,我必须使用moment.diff()或其他方法对自己进行排序。
我不确定是否有使用AppSync和GraphQl按日期和时间进行搜索/筛选的更好/更有效的方法?
谢谢。
aws-appsync ×10
graphql ×6
aws-amplify ×3
resolver ×2
amazon-rds ×1
amazon-s3 ×1
amplifyjs ×1
apollo ×1
aws-aurora ×1
node.js ×1
react-native ×1