【问题标题】:Invoke an api gateway from an aws lambda从 aws lambda 调用 api 网关
【发布时间】:2020-04-22 20:20:13
【问题描述】:

我尝试从一个由 sqs 队列触发的 aws lambda 调用 api 网关。我的 api 网关调用另一个 lambda 函数来获取一些信息。

但是当我从我的 sqs 队列发送消息时,lambda 被正确执行,但我的 api 网关的调用没有被执行。

我的代码如下:

var https = require('https');
const URL = process.env.API_GATEWAY_URL;

exports.handler = async (event, context, callback) => {

  console.log("hello");

  https.get(URL, function (result) {
      console.log('Success, with: ' + result.statusCode);
      context.done(null);
  }).on('error', function (err) {
      console.log('Error, with: ' + err.message);
      context.done("Failed");
  });

};

以下是我在 cloudwatch 中的日志:

START RequestId:4eeccd03-b7d2-5efc-aedb-8c3a14411101 版本:$LATEST 2020-04-21T13:14:01.524Z 4eeccd03-b7d2-5efc-aedb-8c3a14411101 信息你好 END RequestId: 4eeccd03-b7d2-5efc-aedb-8c3a14411101

但我希望是这样的:

START RequestId:4eeccd03-b7d2-5efc-aedb-8c3a14411101 版本:$LATEST 2020-04-21T13:14:01.524Z 4eeccd03-b7d2-5efc-aedb-8c3a14411101 信息你好 2020-04-21T13:14:01.524Z 4eeccd03-b7d2-5efc-aedb-8c3a14411101 成功,有:200 END RequestId: 4eeccd03-b7d2-5efc-aedb-8c3a14411101

或者:

START RequestId:4eeccd03-b7d2-5efc-aedb-8c3a14411101 版本:$LATEST 2020-04-21T13:14:01.524Z 4eeccd03-b7d2-5efc-aedb-8c3a14411101 信息你好 2020-04-21T13:14:01.524Z 4eeccd03-b7d2-5efc-aedb-8c3a14411101 错误,带有:message_error END RequestId: 4eeccd03-b7d2-5efc-aedb-8c3a14411101

而且我所有的 lambda 都在同一个 VPC 中。

有什么想法吗?

【问题讨论】:

  • 看起来您在发出请求时没有使用 URL 常量?
  • 我写问题时的小错误

标签: node.js amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

您将较新的异步函数处理程序与较旧的上下文/回调模式混合在一起。

如果您想使用旧样式,请移除 async 函数装饰器。

如果您想使用较新的(首选)样式,请更改您的代码以返回一个承诺,例如:

const https = require('https');
const URL = 'https://dummy.restapiexample.com/api/v1/employees';

exports.handler = async (event, context) => {
    return new Promise((resolve, reject) => {
        https.get(URL,(res) => {
            let body = "";

            res.on("data", (chunk) => {
                body += chunk;
            });

            res.on("end", () => {
                console.log(body);
                resolve(body);
            });

        }).on("error", (error) => {
            reject(error);
        });  

    });
};

当然,还要向正确的 URL 发出 GET 请求。

【讨论】:

  • 您对 https.get 的使用似乎也不正确,因此我已将答案的那一部分更新为使用数据/结束处理程序,但它是次要的。我已包含一个标准 REST API 端点 (https://dummy.restapiexample.com/api/v1/employee),因此您可以针对有效端点进行测试,而不是针对您的 URL。
  • 感谢您的回复。我刚刚用你的端点测试了你的代码,它对我不起作用。
  • 在这里真正有帮助的一件事是,不要反复说“它不起作用”,而是实际提供您所看到的失败的症状。它是否因错误代码而失败?例外?获取请求是否超时?它是否有效但产生了错误的结果?还有什么?此代码在 VPC 之外的 Lambda 中运行良好,因此我猜测此时您正在 VPC 中运行,您的网络配置不正确,https.get 调用超时。但是,这又是猜测,因为我们对这里的好信息很了解。
  • 你确实是对的。所以它不会因错误代码而失败,没有例外,请求不会过期,否则我会超时。当我在本地测试代码时,代码运行良好,我设法获得了 API 响应。除了我执行 https.get 请求的代码之外,所有 lambda 代码都可以正常工作。
  • 在配置 Lambda 以在 VPC 中运行时,您需要做一些非常具体的事情。例如,如果您希望它能够与 Internet 通信,则 Lambda 函数需要位于私有子网中,并且该子网需要到公有子网中的 NAT 的默认路由,而公有子网需要 IGW .如果您希望它到达其他私有端点,那么它必须具有到这些端点的网络路由。或者,当然,假设满足您的要求,将其部署在 VPC 之外。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 2019-05-02
  • 1970-01-01
  • 2019-05-10
  • 2020-10-07
  • 2021-03-02
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多