【问题标题】:AWS IAM authorization inside a lambda function in nodejsnodejs中的lambda函数内的AWS IAM授权
【发布时间】:2021-05-05 07:04:57
【问题描述】:

我有一个受 IAM 授权保护的 API,这是一个允许 IAM 用户 integ-user 调用 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();
};

【问题讨论】:

  • 您需要通过添加一些包含 AWS 签名 v4 流程所需值的标头来签署您的请求。这很难手工完成。看看github.com/yugasun/aws4-sign - 它有几个基于密钥/秘密登录的好例子。

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


【解决方案1】:

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

service: "execute-api" 用于 API 网关

region: "us-east-1"AWS 区域。

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

最后将aws4.sign(...) 传递给request

所有.sign 方法所做的只是添加4 个额外的标头X-Amz-Content-Sha256X-Amz-Security-TokenX-Amz-DateAuthorization

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),它应该从环境变量中使用。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2021-04-13
    • 2017-08-19
    • 1970-01-01
    • 2020-12-12
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多