无服务器地从 AWS 查询外部 REST API 并将结果存储在 S3 中?

Serverless-ly Query External REST API from AWS and Store Results in S3?

给定 REST API,在我的 AWS 环境之外,可以查询 json 数据:

https://someExternalApi.com/?date=20190814

如何在 AWS 中设置无服务器作业以定期访问外部端点并将结果存储在 S3 中?

我知道我可以实例化一个 EC2 实例并设置一个 cron。但是我正在寻找一个无服务器的解决方案,这似乎更地道。

提前感谢您的考虑和回复。

我将跳过实施细节,因为它很大程度上超出了您的问题范围。因此,我将假设您的函数已经编写并以 nodeJS 为目标。

AWS 可以 自行完成此操作,但为了使其更简单,我建议使用 Serverless。我们假设您正在使用它。

假设您对无服务器完全陌生,您需要做的第一件事就是创建一个处理程序:

serverless create --template "aws-nodejs" --path my-service

这将根据提供的路径上的 aws-nodejs 模板创建服务。在那里,您会找到 serverless.yml(函数的配置)和 handler.js(代码本身)。

假设您的函数在 handler 导出 (module.exports.crawlSomeExternalApi = () => {...}) 中导出为 crawlSomeExternalApi,如果您需要,无服务器文件中的 functions 条目将如下所示每 3 小时调用一次:

functions:
  crawl:
    handler: handler.crawlSomeExternalApi
  events:
  - schedule: rate(3 hours)

就是这样!您现在需要的只是通过 serverless deploy -v

部署它

在幕后,它所做的是在您的函数上创建一个 CloudWatch 计划条目。可以在 the documentation

上找到它的示例

是的,您绝对可以做到这一点,而且可能有几种不同的方式! 我将使用的作品是:

  1. CloudWatch Event 使用类似 cron 的计划,然后触发...
  2. 一个 lambda 函数(具有正确的 IAM 权限)调用 API 使用例如 python requests 或等效的 http 库,然后使用 AWS SDK 将结果写入您选择的 S3 存储桶:
  3. 一个 S3 存储桶准备接收!

这应该是您实现所需的全部内容。

您首先需要的是 Lambda function. Implement your logic, of hitting the API and writing data to S3 or whatever, inside the Lambda function. Next thing, you need a schedule to periodically trigger your lambda function. Schedule expression 可用于使用 cron 表达式或速率表达式定期触发事件。您之前创建的 lambda 函数应配置为此 CloudWatch 规则的目标。

结果流将是,只要有触发器(取决于您的 CloudWatch 规则),CloudWatch 就会调用 lambda 函数。然后 Lambda 执行您的逻辑。