AWS Lambda 中的 HTTP 请求

Posted

技术标签:

【中文标题】AWS Lambda 中的 HTTP 请求【英文标题】:HTTP Requests in an AWS Lambda 【发布时间】:2015-10-27 01:38:42 【问题描述】:

我是 Lambdas 新手,所以也许我还没有掌握一些东西,但我编写了一个简单的 Lambda 函数来向外部站点发出 HTTP 请求。出于某种原因,无论我使用 Node 的 http 还是 https 模块,我都会得到一个 ECONNREFUSED

这是我的 Lambda:

var http = require('http');

exports.handler = function (event, context) 
    http.get('www.google.com', function (result) 
        console.log('Success, with: ' + result.statusCode);
        context.done(null);
    ).on('error', function (err) 
        console.log('Error, with: ' + err.message);
        context.done("Failed");
    );
;

这是日志输出:

START RequestId: request hash
2015-08-04T14:57:56.744Z    request hash                Error, with: connect ECONNREFUSED
2015-08-04T14:57:56.744Z    request hash                "errorMessage":"Failed"
END RequestId: request hash

我是否需要角色权限才能执行 HTTP 请求? Lambda 甚至允许普通的旧 HTTP 请求吗?我需要设置特殊的标题吗?

感谢任何指导。

【问题讨论】:

【参考方案1】:

我解决了自己的问题。

显然,如果您决定将 URL 作为第一个参数提供给 .get(),则必须在 URL 前面包含 http://,例如 http://www.google.com

var http = require('http');

exports.handler = function (event, context) 
  http.get('http://www.google.com', function (result) 
    console.log('Success, with: ' + result.statusCode);
    context.done(null);
  ).on('error', function (err) 
    console.log('Error, with: ' + err.message);
    context.done("Failed");
  );
;

或者,您可以将第一个参数指定为hash of options,其中hostname 可以是URL 的简单形式。示例:

var http = require('http');

exports.handler = function (event, context) 
  var getConfig = 
    hostname: 'www.google.com'
  ;
  http.get(getConfig, function (result) 
    console.log('Success, with: ' + result.statusCode);
    context.done(null);
  ).on('error', function (err) 
    console.log('Error, with: ' + err.message);
    context.done("Failed");
  );
;

【讨论】:

以上是关于AWS Lambda 中的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

如何在AWS Lambda函数中进行外部api调用

使用 webargs 验证 AWS lambda 中的查询字符串参数和请求正文

Aws LAMBDA:HTTP POST 请求

AWS API Gateway 中的 CORS 配置

HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数