给定一个 REST API,在我的 AWS 环境之外,可以查询json
数据:
https://someExternalApi.com/?date=20190814
如何在 AWS 中设置无服务器作业以定期访问外部终端节点并将结果存储在 S3 中?
我知道我可以实例化 EC2 实例并设置一个 cron。 但我正在寻找一种无服务器解决方案,这似乎更惯用。
提前感谢您的考虑和回复。
是的,你绝对可以做到这一点,而且可能通过几种不同的方式! 我会使用的部分是:
- CloudWatch Event 使用类似 cron 的计划,然后触发...
- 一个 lambda 函数(具有正确的 IAM 权限),它使用 python
requests
或等效的 http 库调用 API,然后使用 AWS 开发工具包将结果写入您选择的 S3 存储桶: - 准备接收的 S3 存储桶!
这应该是您实现所需目标的全部内容。
我将跳过实现细节,因为它在很大程度上超出了您的问题范围。因此,我将假设您的函数已经编写并针对nodeJS。
AWS可以自行执行此操作,但为了简化操作,我建议使用无服务器。我们将假设您正在使用它。
假设您完全不熟悉无服务器,您需要做的第一件事是创建一个处理程序:
serverless create --template "aws-nodejs" --path my-service
这将基于提供的路径上的aws-nodejs
模板创建服务。在那里,你会发现serverless.yml
(函数的配置)和handler.js
(代码本身)。
假设您的函数在handler
导出 (module.exports.crawlSomeExternalApi = () => {...}
) 上导出为crawlSomeExternalApi
,如果您想每 3 小时调用一次无服务器文件functions
条目将如下所示:
functions:
crawl:
handler: handler.crawlSomeExternalApi
events:
- schedule: rate(3 hours)
就是这样!您现在需要的只是通过serverless deploy -v
部署它
在后台,它的作用是在函数上创建一个 CloudWatch 计划条目。可以在文档中找到它的示例
你需要的第一件事是 Lambda 函数。在 Lambda 函数中实现您的逻辑,即命中 API 并将数据写入 S3 或其他任何内容。接下来,您需要一个计划来定期触发 lambda 函数。计划表达式可用于使用 cron 表达式或速率表达式定期触发事件。您之前创建的 lambda 函数应配置为此 CloudWatch 规则的目标。
生成的流将是,只要有触发器,CloudWatch 就会调用 lambda 函数(具体取决于您的 CloudWatch 规则)。然后,Lambda 执行您的逻辑。