【问题标题】:Programmatically invoke a specific endpoint of a webservice hosted on AWS Lambda以编程方式调用 AWS Lambda 上托管的 Web 服务的特定端点
【发布时间】:2019-05-25 19:10:43
【问题描述】:

感谢Zappa,我有一个用 Flask 编写并在 API Gateway 和 Lambda 上运行的多端点网络服务。

我有第二个非常小的 lambda,用 Node 编写,它会定期访问其中一个 Web 服务端点。为此,我将小 lambda 配置为可以访问 Internet,然后使用 Node 的 https.request 和以下选项:

const options = {
  hostname: 'XXXXXXXXXX.execute-api.us-east-1.amazonaws.com',
  port: 443,
  path: '/path/to/my/endpoint',
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${s3cretN0tSt0r3d1nTheC0de}`,
  }
};

这很好用。但现在我想知道我是否应该 改为让小 lambda 直接使用 AWS SDK 调用 API 端点。我见过其他的 S.O.关于从 lambdas 调用 lambdas 的问题,但我没有看到目标 lambda 是多端点 Web 服务的任何示例。我发现的所有示例都使用了new AWS.Lambda({...}),然后使用参数调用了invokeFunction

有没有办法将事件传递给目标 lambda,其中包含我要调用的特定端点的路径? (以及身份验证标头等)* * * * 或 * * * * 这只是一个非常愚蠢的想法,因为我已经有工作代码了吗?我的想法是,直接 SDK lambda 调用可能(这是真的吗?)绕过 API 网关并且更便宜,但是,直接通过 API 网关访问端点更适合记录。而且由于定期 lambda 每天运行一次,所以它可能还是免费的。

如果我现在拥有的是最好的,那是一个很好的答案。 lambda 调用答案也很酷,因为我找不到目标 lambda 具有多个 https 端点的好例子。

【问题讨论】:

  • 定期 Lambda 的目的是什么?仅仅是为了减少冷启动还是有一些商业目的(例如 cron 任务)?
  • 这是一个 cron.... 端点之一进行了一些分析计算。是的,“做 cron 事情的小 lambda”本可以访问(Aurora)数据库,但现在的情况是,API 是目前位于数据库前面的唯一东西。

标签: amazon-web-services aws-lambda


【解决方案1】:

您可以使用 AWS SDK 中的调用方法直接调用 Lambda 函数。

 var params = {
  ClientContext: "MyApp", 
  FunctionName: "MyFunction", 
  InvocationType: "Event", 
  LogType: "Tail", 
  Payload: <Binary String>, 
  Qualifier: "1"
 };
 lambda.invoke(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    FunctionError: "", 
    LogResult: "", 
    Payload: <Binary String>, 
    StatusCode: 123
   }
   */
 });

请参阅AWS JavaScript SDK lambda.invoke 方法了解更多详情。

【讨论】:

  • 谢谢。我很清楚那个文档页面,但我不知道在调用中将/path/to/my/endpoint 放在哪里。该页面上似乎没有任何内容表明这是如何完成的。我错过了什么?
  • 你所说的端点是什么?您指的是 API Gateway 端点吗?
  • 好吧,我写了一个 Flask 应用程序,它有 30 个“端点”或任何你叫它们的东西。我使用 Zappa 将 Flask 应用程序作为单个 lambda 函数推送到 AWS。我只想向这 30 个端点之一发出 HTTPS 请求。我意识到 API Gateway 有自己的端点概念。但我的意思是端点,就像经典 REST API 中的一件事一样。这似乎是一件很简单的事情,但我因为在任何地方都没有看到任何例子而感到慌乱,这让我相信我正在尝试做的事情是愚蠢的,我应该独自离开并继续我已经做的事情有,它正在工作。
  • 详细说明。我的 lambda 是 XXXXXXXXXX.execute-api.us-east-1.amazonaws.com 的烧瓶应用程序。作为一个网络服务,它暴露了POST /thingsGET /thingsGET /things/{id}DELETE /things/{id}POST /dailyreport/things之类的东西。我的问题:如何进行 lambda 调用,仅对 POST /dailyreport/things“端点”进行 HTTPS POST 调用。我知道“端点”在 AWS 中可能不是正确的词,但我想知道 AWS 开发工具包是否可以做到这一点。这个 lambda 看起来不像是一个很容易被 lambda 调用命中的“单一函数”。还是???
  • 您似乎已经创建了 API 网关映射。 URL xxxx.execute-api.us.... 是 API 网关 URL。您不需要任何 SDK 来连接 Lambda 函数。在 AWS Web 控制台的 API Gateway 部分检查您的 API Gateway 配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2012-05-31
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多