AWS Appsync - невозможно загрузить S3Object в корзину автоматически с помощью Cognito User Pools - iOS - PullRequest
0 голосов
/ 26 апреля 2018

Используя пулы пользователей Cognito в качестве моего метода авторизации, я могу войти в систему подтвержденных пользователей через приложение, и затем эти аутентифицированные пользователи могут писать в DynamoDB с мутацией AppSync просто отлично. Информация S3Object также заполняется в Динамо в виде строки 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. Однако, если я сам использую S3TransferUtility.default () для отправки запроса на загрузку, он прекрасно работает, поэтому я должен иметь правильные разрешения, установленные для PutObject (также GetObject и ListObjects, поскольку я также могу перечислять / загружать объекты из корзины с s3TransferUtility).

Поскольку AppSync должен использовать S3TransferUtility.default (), есть ли у кого-нибудь идеи, почему загрузка не происходит автоматически? Мой контроллер представления впоследствии отключается, как в учебниках, но это не должно быть проблемой, потому что я использую оптимистический метод ответа, и он не выдает никаких ошибок. Я также попытался просто использовать функцию выполнения мутации без оптимистического ответа. Также я попытался НЕ отклонить контроллер представления и ожидание. По-прежнему нет загрузки на S3, но запись в «Динамо» никогда не заканчивается! Даже оптимистично обновляет «Динамо», когда я возвращаюсь из режима самолета. Размер файла для документа PDF составляет ~ 250 КБ.

Кстати, следующее также работает после извлечения моих товаров из Dynamo с помощью запроса listqll graphql и только после ручной загрузки в S3, так что это на самом деле в корзине (я пропускаю некоторые дополнительные цепочки, я на работе это часть из памяти):

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

Нечто подобное. Он действительно загружает объект, но это потому, что я вызвал его вручную. Честно говоря, я на самом деле не уверен, какова предполагаемая функциональность извлеченного объекта S3Object из запроса graphql (должен ли он загружаться автоматически ...? Имею ли я доступ к этому элементу как к чему-то другому, кроме AllPostsQuery.Data .ListPost.Item.Pdf или мы должны загрузить себя, используя корзину, ключ, регион, как у меня?) Думаю, это не по теме.

Любая помощь будет принята с благодарностью. Я действительно бьюсь головой об стену на этом.

РЕДАКТИРОВАТЬ: Дополнительная / обновленная информация здесь на форумах AWS

РЕДАКТИРОВАТЬ: проблема GitHub вызвала ответ от AWS, и они изучают его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...