如何使用 AppSync 从 S3 下载公开可用的 pdf 和 png 文件

     2023-03-08     65

关键词:

【中文标题】如何使用 AppSync 从 S3 下载公开可用的 pdf 和 png 文件【英文标题】:How to download publicly available pdf and png files from S3 with AppSync 【发布时间】:2019-02-19 19:28:48 【问题描述】:

我是 GraphQL 和 AWS AppSync 的新手,我在通过 AWS AppSync 从公共 S3 存储桶下载文件(PDF 和 PNG)时遇到了问题。我查看了数十个教程并翻阅了大量文档,但我不确定此时发生了什么。这可能只是对 GraphQL 或 AppSync 功能的本质的误解,但我完全被难住了。

作为参考,我大量参考了 How to upload file to AWS S3 using AWS AppSync 等其他帖子(具体来说,来自已接受答案作者的建议),但没有一个解决方案(或我尝试过的变体)有效。

事实

S3 存储桶可公开访问 - 即,包含的文件夹和文件不与具有 Cognito 凭据的个人用户绑定 文件在 AppSync 之外上传到 S3(因此没有 GraphQL 突变);这是手动文件上传 架构适用于所有其他查询和突变 我们正在使用 AWS Cognito 对用户和查询进行身份验证

精简架构和 DynamoDB 项目

以下是相关 GraphQL 架构类型的精简版:

type MetroCard implements TripCard 
    id: ID!
    cardType: String!
    resIds: String!
    data: MetroData!
    file: S3Object


type MetroData implements DataType 
    sourceURL: String!
    sourceFileURL: String
    metroName: String!


type S3Object 
    bucket: String!
    region: String!
    key: String!

有关文件的元数据存储在 DynamoDB 中,如下所示:


    "data": 
        "metroName": "São Paulo Metro",
        "sourceFileURL": "http://www.metro.sp.gov.br/pdf/mapa-da-rede-metro.pdf",
        "sourceURL": "http://www.metro.sp.gov.br/en/your-trip/index.aspx"
    ,
    "file": 
        "bucket": "test-images",
        "key": "some_folder/sub_folder/bra-sbgr-metro-map.pdf",
        "region": "us-east-1"
    ,
    "id": "info/en/bra/sbgr/metro"

VTL 请求/响应解析器

对于我们的getMetroCard(id: ID!): MetroCard 查询,映射模板非常普通。请求模板是对 DynamoDB 表的标准查询。响应模板是基本的$util.toJson($ctx.result)

对于MetroCard.file 上的字段级解析器,我们为请求附加了一个带有空 有效负载的本地数据源,并为响应附加了以下内容(有关推理,请参见参考链接):

$util.toJson($util.dynamodb.fromS3ObjectJson($context.source.file)) // we've played with this bit in a couple of ways, including simply returning $context.result but no change

结果

所有查询字段都正确解析;但是,无论字段级解析器映射到什么,file 字段都不可避免地总是返回 null。有趣的是,我在 CloudWatch 日志中注意到 context.result 的值在使用上述映射模板时确实从 null 更改为

问题

鉴于以上情况,我有几个问题:

    AppSync 文件下载是否需要通过复杂对象处理程序的突变使用用户凭据将文件上传到 S3 以使其可检索? 在 AppSync 控制台返回的成功响应应该是什么样子 - 即,我没有客户端实现(如 React Native 应用程序)来测试成功的文件下载?更直接地说,它实际上是在检索文件,而我只是不知道吗? (注意:我实际上已经使用 React Native 客户端对其进行了简单的测试,但没有渲染任何东西,所以我一直使用 AppSync 控制台返回作为方向。) 从我们的架构中完全删除文件下载过程是否更有意义? (我假设我需要的答案表明 AppSync 并不是为这样的文件传输而构建的,因此我们需要重新考虑我们的方法。)

更新

根据最近这篇帖子https://***.com/a/52142178/5989171 的建议,我已经开始使用MetroCard.file 的数据源。如果我使数据源与存储文件元数据的数据库相同,我现在会收到 ref 中提到的错误,但他的解决方案似乎对我不起作用。具体来说,我现在得到以下信息:

"message": "Value for field '$[operation]' not found."

我们的解决方案

对于我们的用例,我们决定继续使用 AWS Amplify Storage 模块,如下所示:https://twitter.com/presbaw/status/1040800650790002689。尽管如此,我仍然保持这个问题的开放和未回答,因为我真的很好奇我在这里不理解什么,而且我感觉我不是唯一一个!

【问题讨论】:

【参考方案1】:
$util.toJson($util.dynamodb.fromS3ObjectJson($context.source.file))

您只能在您的 DynamoDB 将 file 字段保存为格式:"s3":"key":"file.jpg","bucket":"bucket_name/folder","region":"us-east-1"

时使用它

【讨论】:

如何使用 AWS AppSync 将文件上传到 AWS S3

】如何使用AWSAppSync将文件上传到AWSS3【英文标题】:HowtouploadfiletoAWSS3usingAWSAppSync【发布时间】:2018-07-0719:10:32【问题描述】:在AWSAppSync文档中关注thisdocs/tutorial。它说:使用AWSAppSync,您可以将这些建模为GraphQL类型。如果您的任... 查看详情

如何使用提供的 url 从 s3 下载文件?

】如何使用提供的url从s3下载文件?【英文标题】:Howtodownloadafilefroms3usingprovidedurl?【发布时间】:2017-10-2213:06:46【问题描述】:在我的应用程序中,我将获得s3文件的url,例如:https://s3.amazonaws.com/account-update/input.csv我必须下载... 查看详情

AppSync 中的 S3Object GraphQL 类型与 Lambda 数据源?

】AppSync中的S3ObjectGraphQL类型与Lambda数据源?【英文标题】:S3ObjectGraphQLtypeinAppSyncwithLambdadatasource?【发布时间】:2018-09-1822:15:40【问题描述】:AppSync中可用的S3ObjectGraphQL类型(请参阅https://docs.aws.amazon.com/appsync/latest/devguide/building... 查看详情

如何使用 AWS 开发工具包从 S3 下载对象 - RESTful

】如何使用AWS开发工具包从S3下载对象-RESTful【英文标题】:HowtodownloadobjectsfromS3usingAWSSDK-RESTful【发布时间】:2020-08-0517:56:34【问题描述】:我正在寻找一种以编程方式将图像从S3存储桶下载到我的计算机的方法。我尝试了“Usings... 查看详情

在 IOS 上使用 AWS AppSync 将图像上传到 S3

】在IOS上使用AWSAppSync将图像上传到S3【英文标题】:UploadingimagetoS3usingAWSAppSynconIOS【发布时间】:2018-12-1711:00:06【问题描述】:我正在关注theseinstructions从我的IOS客户端将文件上传到S3到AppSync,其中我被告知在创建S3Object作为我的... 查看详情

从 S3 获取非公开数据

...001:34:54【问题描述】:我一直在开发一个web应用程序,我使用Scrapy抓取数据并在S3上启动数据。现在我想将数据提取到我的React项目中。如果我将数据设置为公开,这效果很好。axios.get(`https://s3-eu-west-1.amazonaws.com/bucket/data.json`).th 查看详情

如何使用awssdk从s3下载对象--restful。(代码片段)

我正在寻找一种程序化的方式来下载S3桶中的图片到我的电脑上。我试过"使用send_file从AmazonS3下载文件?",但它只是将我重定向到一个只显示我的PDF对象的链接。这是我的下载函数,使用AWS文档:s3=Aws::S3::Resource.new(region:'us-east-2')... 查看详情

如何使用awssdk从s3下载对象--restful。(代码片段)

我正在寻找一种程序化的方式来下载S3桶中的图片到我的电脑上。我试过"使用send_file从AmazonS3下载文件?",但它只是将我重定向到一个只显示我的PDF对象的链接。这是我的下载函数,使用AWS文档:s3=Aws::S3::Resource.new(region:'us-east-2')... 查看详情

使用 AFNetworking 从 S3 获取公共文件并接收 403

】使用AFNetworking从S3获取公共文件并接收403【英文标题】:UsingAFNetworkingtoGETpublicfilesfromS3andreceive403【发布时间】:2013-05-1310:11:07【问题描述】:我正在尝试从我们的S3存储下载PDF文件。这些文件是公开的,可以通过浏览器访问。... 查看详情

如何将文件上传到 S3 并使用 boto3 将其公开?

】如何将文件上传到S3并使用boto3将其公开?【英文标题】:HowtouploadafiletoS3andmakeitpublicusingboto3?【发布时间】:2017-06-1318:35:18【问题描述】:我可以使用以下方法上传图像文件:s3=session.resource(\'s3\')bucket=s3.Bucket(S3_BUCKET)bucket.upload... 查看详情

如何在 S3 中公开 10,000 个文件

】如何在S3中公开10,000个文件【英文标题】:Howtomake10,000filesinS3public【发布时间】:2011-03-0917:09:47【问题描述】:我在存储桶中有一个包含10,000个文件的文件夹。似乎没有办法将它们上传并立即公开。所以我把它们都上传了,它... 查看详情

如何使用 amplify 将 GraphQL 更改从 Appsync 同步到 Android?

】如何使用amplify将GraphQL更改从Appsync同步到Android?【英文标题】:HowtosynchronizeGraphQLchangesfromAppsynctoAndroidusingamplify?【发布时间】:2019-05-3008:06:22【问题描述】:我为appsync迁移了一个颤振原生插件来放大。现在我想知道在appsync控... 查看详情

如何使用 Python Jupyter Notebook 通过 KMS 加密从 S3 读取文件

】如何使用PythonJupyterNotebook通过KMS加密从S3读取文件【英文标题】:HowtoreadafilefromS3withKMSencryptionusingPythonJupyterNotebook【发布时间】:2021-02-0821:58:25【问题描述】:我正在尝试使用spark.read.csv从S3读取文件。但是,我无法读取具有KMS... 查看详情

Amazon S3 - 如何自动公开文件夹的新内容

】AmazonS3-如何自动公开文件夹的新内容【英文标题】:AmazonS3-Howtoautomaticallymakethenewcontentofafolderpublic【发布时间】:2020-08-2007:20:07【问题描述】:我正在使用amazons3将图像存储在存储桶中,并使用cloudfront来获取和发布这些图片。... 查看详情

使用 AWS 开发工具包从 Amazon S3 下载文件后如何删除文件

】使用AWS开发工具包从AmazonS3下载文件后如何删除文件【英文标题】:HowtodeleteafileafterdownloadingitfromAmazonS3usingtheAWSSDK【发布时间】:2021-12-0903:11:19【问题描述】:从aws-sdks3服务器下载后如何删除文件?我通过awssdk上传文件,从服... 查看详情

如何每次将新上传的文件从 s3 下载到 ec2

】如何每次将新上传的文件从s3下载到ec2【英文标题】:Howtodownloadnewuploadedfilesfroms3toec2everytime【发布时间】:2022-01-0723:26:08【问题描述】:我有一个s3存储桶,它将全天接收新文件。每次将新文件上传到存储桶时,我都想将这些... 查看详情

如何从开源 Hadoop 构建 deb/rpm 存储库或由 ambari 安装的公开可用的 HDP 源代码

】如何从开源Hadoop构建deb/rpm存储库或由ambari安装的公开可用的HDP源代码【英文标题】:Howtobuilddeb/rpmreposfromopensourceHadooporpubliclyavailableHDPsourcecodetobeinstalledbyambari【发布时间】:2020-05-1419:24:35【问题描述】:我正在尝试安装开源had... 查看详情

如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存

】如何使用订阅和AWSAppSync高效同步Apollo的缓存【英文标题】:HowtoefficientlysyncApollo\'scacheusingsubscriptionsandAWSAppSync【发布时间】:2019-04-1014:11:41【问题描述】:我在Node.js客户端中使用aws-appsync来保存数据项的缓存列表。此缓存必须... 查看详情