2017-07-19 56 views
0

我想这样做:CSV导出使用API​​网关和Lambda

我希望做的是有一个网址,这将返回给调用者一个CSV文件基本上是数据的导出。我希望这仍然是一个无服务器的解决方案。

我做了什么:

我已经创建了一个AWS API网关与我想要的网址。我创建了一个将查询数据库并创建该数据的CSV字符串的lambda。该数据放置在JSON对象中并返回。然后,API网关从json对象获取CSV数据,并将CSV返回给调用者并添加适当的标题以指示它是CSV和附件。从浏览器进行测试我自动获得下载,就像我打算的一样。

我看到的问题:

这种运作良好,直到有在这一点我开始变得“​​车身尺寸太长”的数据的数量可观。

我试图解析:

我做了一些谷歌上搜索周围,我看到别人有过类似的问题。在一个解决方案中,我看到他们返回到他们创建的文件的链接。这个解决方案对他们来说似乎可行,因为他们有一台服务器对于我的无服务器体系结构,它似乎有点棘手。我可以把这个文件存入S3,但是我不得不返回到S3的链接。这似乎可以工作,但不觉得就像我缺少一个配置选项。它也感觉就像通过返回s3 url来展示实现一样。

我环顾四周寻找教程和做类似的事情的人的例子,我还没有找到任何。

我的问题:

有没有办法做到这一点? 有没有另一种解决方案,我不知道? 如何从较大尺寸的API网关返回文件(本例中为CSV)

回答

5

AWS Lambda响应有效内容有limit of 6 MB。如果您需要的服务器文件大于您无法直接从Lambda服务的文件。

使用S3存储和提供文件是做这种事情的标准方法。我会离开S3存储桶并在Lambda函数中生成S3 Pre-signed URLs。这将限制CSV文件可供下载的时间,并且会阻止人们猜测您正在服务的文件的URL。您可以使用S3 Lifecycle Policy在一段时间后归档或删除文件。

+0

谢谢。我只是在探索这个想法,但不知道s3签名的url。我现在要深入研究,因为这似乎解决了我的一些内部问题 – Nexeh

+0

@Nexeh,您还可以将CloudFront放置在您的S3存储桶前,这将进一步隐藏您的最终用户的实施细节。它还将加速文件下载。 http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html –

+2

我将文件写入S3,生成一个预先签名的url,通过api网关将它返回给调用并使用我的角度客户端使用提供的URL下载文件。非常感谢!我现在对解决方案更加自信。 – Nexeh