当前位置: 首页 > 知识库问答 >
问题:

nodejs中lambda函数内的AWS IAM授权

夏侯华彩
2023-03-14

我有一个受IAM授权保护的API,它是一个资源策略,允许IAM用户integ用户调用API。

现在我想写一个lambda函数来调用同一个API。假设我可以访问IAM访问密钥和密码(通过环境变量或AWS Secret Manager),我如何对用户进行IAM授权,以便它可以成功地调用API?

用于调用相同API的示例代码(未经IAM授权):

var https = require('https');

exports.handler = (event, context, callback) => {
    const options = {
        host: process.env.VPCE_DNS_NAME,
        port: 443,
        path: "/status",
        method: 'GET',
        headers: {
          'Host':process.env.API_GW_ENDPOINT
        }
      };

    https.request(options, (res) => {
      let data = '';
      res.on('data', (d) => {
       data += d;
        process.stdout.write(d);
      });
      res.on('end', () => {
         callback(null, JSON.parse(data));
      });
    }).on('error', (e) => {
      callback(null, e);
    }).end();
};

共有1个答案

谢学名
2023-03-14

我们需要构建带有三个附加参数的常规nodejs请求选项

服务:Api Gateway 的“execute-api”

< code >地区:“美国东部-1” AWS地区。

body: postData,通常我们传递bodyreq.write,我们在选项中也需要它,因为签名需要它。

最后是< code>aws4.sign(...)传递给< code>request。

所有. ign方法所做的就是添加4个额外的标头X-Amz-Content-Sha256X-Amz-Security-TokenX-Amz-DateAuthoration

var aws4 = require("aws4");
var https = require("https");

const requestBody = { name: "test" };
var postData = JSON.stringify(requestBody);

var options = {
  method: "GET",
  hostname: "abcdefgh.execute-api.us-east-1.amazonaws.com",
  path: "/status",
  headers: {
    "Content-Type": "application/json",
  },
  service: "execute-api",
  region: "us-east-1",
  body: postData,
  maxRedirects: 20,
};

const signedRequest = aws4.sign(options, {
  secretAccessKey: "abcadefghijknlmnopstabcadefghijknlmnopst",
  accessKeyId: "ABCDEFGHIJKLMNOPQRST",
  sessionToken: "this is optional ==",
});
console.log(signedRequest);
var req = https.request(signedRequest, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function (chunk) {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });

  res.on("error", function (error) {
    console.error(error);
  });
});
req.write(postData);
req.end();

由于此调用是从 lambda 整个对象进行的,因此可以跳过键,只需调用 aws4.sign(options),它应使用来自环境变量。

 类似资料:
  • 我们正在尝试将我们的 zip 微服务从节点js Express 中的常规应用程序迁移到与 AWS Lambda 集成的 AWS API 网关。 我们当前的应用程序向我们的API发送请求,获取附件列表,然后访问这些附件并将其内容以zip存档的形式传回给用户。它看起来像这样: 除了必须将内容从Lambda函数中流出来的部分,我已经设法完成了所有的工作。< br >我认为可能的解决方案之一是使用aws-

  • 我在帐户a中有一个lambda函数,试图从帐户B访问资源。创建了一个新的lambda角色,该角色具有基本执行功能,可以将日志上载到cloud watch。 以下是我在Python 3.7中的函数代码: 还修改了账户B中假定角色的信托政策,如文件中所述:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-ass

  • 在过去的几个小时里,我一直在调试、配置和命名它,我似乎不明白为什么会发生这种情况。 我正在尝试调用一个 lambda 函数,该函数只是从 ec2 中检索基本信息。当我在aws控制台中测试此lambda函数时,它似乎工作正常。但是,使用以下代码在另一个lambda中调用它; 它只是超时了。没有任何反应…两个Lambda都连接到VPC和所有子网 我认为是我的新VPC导致了这个问题。我的VPC包括: 1

  • 我在AWS Lambda函数中查询MySQL数据库(从AWS远程托管)时遇到问题。 这是我的代码,除了Lambda函数的其余部分(为Alexa技能调用)所需的部分: 当我在命令提示符下用node运行它时,它工作得很好: 我正在使用通过npm安装在index.js目录中的“mysql”模块,并将其压缩和上传到我的Lambda函数中。 同样,这在我的开发机器上有效,但在测试我的Lambda函数时没有说

  • 有时您可能只需要在程序中的一个位置使用一个函数,并且该函数非常简单,您可能不会给它命名,或者可能不想将它存储在符号表中,而宁愿编写一个未命名或匿名的函数。 LISP允许您编写仅在程序中遇到它们时才计算的匿名函数。 这些函数称为Lambda functions. 您可以使用lambda表达式创建此类函数。 lambda表达式的语法如下 - (lambda (parameters) body) 无法

  • 我是AWS web服务新手,我正在AWSCOgnitoRedentialsProvider类的登录字典中使用OpenIdentity发送DeveloperAuthProviderName和令牌,然后在viecontroller中调用lambda函数,其错误如下。我使用过CognitoSyncDemo应用程序,也尝试过通过pod导入所有框架,但结果是一样的。请帮我解决这个问题。 AWSiOSSDKv