2

使用 Cognito 用户池作为我的身份验证方法,我能够通过应用程序登录经过验证的用户,然后这些经过身份验证的用户可以使用 AppSync 突变写入 DynamoDB。S3Object 信息也在 Dynamo 中作为 JSON 字符串填充,如下所示:

"pdf": "{\"s3\":{\"key\":\"6_A_2018-04-26_etc.pdf\",\"bucket\":\"#####\",\"region\":\"us-west-2\"}}"

AppSync 中创建突变的请求映射模板为:

{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
    "id" : { "S" : "${util.autoId()}" }
},
#set( $attribs = $util.dynamodb.toMapValues($ctx.args.input) )
#if($util.isNull($ctx.args.input.pdf.version))
    #set( $attribs.pdf = $util.dynamodb.toS3Object($ctx.args.input.pdf.key, $ctx.args.input.pdf.bucket, $ctx.args.input.pdf.region))
#else
    #set( $attribs.pdf = $util.dynamodb.toS3Object($ctx.args.input.pdf.key, $ctx.args.input.pdf.bucket, $ctx.args.input.pdf.region, $ctx.args.input.pdf.version))
#end
"attributeValues" : $util.toJson($attribs)
}

响应映射模板:

$util.toJson($ctx.result)

pdf(S3Object)请求映射模板(我已经尝试了版本和空有效负载{}无解析器和这个):

{
  "version" : "2017-02-28",
  "operation" : "Query",
  "query" : {
      ## Provide a query expression. **
      "expression": "id = :id",
      "expressionValues" : {
          ":id" : {
              "S" : "${ctx.args.id}"
          }
      }
  }
}

pdf的响应映射模板:

$util.toJson($util.dynamodb.fromS3ObjectJson($context.source.pdf))

但是没有在存储桶中创建 S3 OBJECT。但是,如果我自己使用 S3TransferUtility.default() 来发送上传请求,它工作得非常好,所以我必须为 PutObject 设置正确的权限(还有 GetObject 和 ListObjects,因为我也可以从存储桶中列出/下载对象使用 s3TransferUtility)。

由于 AppSync 应该使用 S3TransferUtility.default(),有没有人知道为什么上传没有自动发生?之后我的视图控制器被解散,就像在教程中一样,但这应该不是问题,因为我使用的是乐观响应方法并且它没有抛出任何错误。我还尝试简单地使用没有乐观响应的执行突变功能。我也试过不关闭视图控制器并等待。仍然没有上传到 S3,但写入 Dynamo 永远不会失败!当我从飞行模式返回时,甚至乐观地更新到 Dynamo。PDF 文档的文件大小约为 250KB。

顺便说一句,在使用 graphql listAll 查询从 Dynamo 中提取我的项目之后,并且仅在手动上传到 S3 之后,以下内容也确实有效,因此它实际上在存储桶中(我缺少一些可选的链接我正在工作这部分来自记忆):

let s3Object = S3Object.init(snapshot: selectedItem.pdf.snapshot)
appSyncClient.s3ObjectManager.download(s3Object: s3Object, toURL: url) { ifSuccess, error in
})

类似的东西。它确实下载了该对象,但这是因为我手动调用了它。公平地说,我实际上不确定从 graphql 查询中检索到的 S3Object 的预期功能是什么(是否应该自动下载它......?除了 AllPostsQuery.Data 之外,我是否可以访问该项目.ListPost.Item.Pdf 还是我们打算像我一样使用存储桶、密钥、区域下载自己?)我想这不是主题。

任何帮助将不胜感激,我真的在这个问题上撞到了墙上。

编辑:AWS 论坛上的更多/更新信息

编辑:GitHub 问题已引起 AWS 的回应,他们正在调查

4

0 回答 0